首頁 Java java教程 JAVA collection集合之撲克牌遊戲實例

JAVA collection集合之撲克牌遊戲實例

Jan 23, 2017 pm 04:54 PM

Collection 層次結構中的根介面。 Collection表示一組對象,這些物件也稱為collection的元素。有些 collection 允許有重複的元素,而有些則不允許。有些 collection 是有序的,而有些則是無序的。 JDK 不提供此介面的任何直接 實作:它提供更具體的子介面(如 Set 和 List)實作。此介面通常用來傳遞 collection,並在需要最大普遍性的地方操作這些 collection。

主要內容:這裡使用collection集合,模擬香港電影中大佬們玩的撲克牌遊戲。

1、遊戲規則:兩個玩家每人手中發兩張牌,進行比較。比較每位玩家手中牌最大的點數,大小由A-2,點數大者獲勝。若點數相同,則比較花色,大小由黑(4)、紅(3)、梅(2)、方(1),花色大者獲勝。

2、實現步驟:

創建一副撲克牌A-2,四種花色黑(4)、紅(3)、梅(2)、方(1)共52張牌;
創建兩個玩家包含玩家ID和姓名、所持牌Card資訊;
洗牌並向兩位玩家各發兩張牌;
比較玩家手中牌大小,得出獲勝者;

3、程式實現

牌Card類:包含牌的數字和花色

package collectiontest.games;
public class Card {
  private Integer id; //牌的大小
  private Integer type;//牌的花色
   
  public Card(Integer id, Integer type) {
    this.id = id;
    this.type = type;
  }
  public Integer getId() {
    return id;
  }
  public void setId(Integer id) {
    this.id = id;
  }
  public Integer getType() {
    return type;
  }
  public void setType(Integer type) {
    this.type = type;
  }
  @Override
  public String toString() {
    return "Card [id=" + id + ", type=" + type + "]";
  }  
}
登入後複製

撲克牌Poker類:包含撲克牌Card A-2

package collectiontest.games;
public class Poker {
  private Card id2 ;
  private Card id3 ;
  private Card id4 ;
  private Card id5 ;
  private Card id6 ;
  private Card id7 ;
  private Card id8 ;
  private Card id9 ;
  private Card id10 ;
  private Card J ;
  private Card Q ;
  private Card K ;
  private Card A ;
   
  public Poker() {
  }    
  //四个类型:黑--4、红--3、梅--2、方--1
  public Poker(Integer type) {
    this.id2 = new Card(2, type);
    this.id3 = new Card(3, type);
    this.id4 = new Card(4, type);
    this.id5 = new Card(5, type);
    this.id6 = new Card(6, type);
    this.id7 = new Card(7, type);
    this.id8 = new Card(8, type);
    this.id9 = new Card(9, type);
    this.id10 = new Card(10, type);
    this.J = new Card(11, type);
    this.Q = new Card(12, type);
    this.K = new Card(13, type);
    this.A = new Card(14, type);
  }
  public Card getId2() {
    return id2;
  }
  public void setId2(Card id2) {
    this.id2 = id2;
  }
  public Card getId3() {
    return id3;
  }
  public void setId3(Card id3) {
    this.id3 = id3;
  }
  public Card getId4() {
    return id4;
  }
  public void setId4(Card id4) {
    this.id4 = id4;
  }
  public Card getId5() {
    return id5;
  }
  public void setId5(Card id5) {
    this.id5 = id5;
  }
  public Card getId6() {
    return id6;
  }
  public void setId6(Card id6) {
    this.id6 = id6;
  }
  public Card getId7() {
    return id7;
  }
  public void setId7(Card id7) {
    this.id7 = id7;
  }
  public Card getId8() {
    return id8;
  }
  public void setId8(Card id8) {
    this.id8 = id8;
  }
 
  public Card getId9() {
    return id9;
  }
  public void setId9(Card id9) {
    this.id9 = id9;
  }
  public Card getId10() {
    return id10;
  }
  public void setId10(Card id10) {
    this.id10 = id10;
  }
  public Card getJ() {
    return J;
  }
  public void setJ(Card j) {
    J = j;
  }
  public Card getQ() {
    return Q;
  }
  public void setQ(Card q) {
    Q = q;
  }
  public Card getK() {
    return K;
  }
  public void setK(Card k) {
    K = k;
  }
  public Card getA() {
    return A;
  }
  public void setA(Card a) {
    A = a;
  }
}
登入後複製

 玩家Player類:包含玩家ID和姓名、所持卡片資訊

package collectiontest.games;
import java.util.ArrayList;
import java.util.List;
 
public class Player {
  //玩家的ID
  private String id ;
  //玩家姓名
  private String name ;
  //玩家所持牌
  private List<Card> pokerType ;
   
  public Player() {  
  }
  public Player(String id, String name, List<Card> pokerType) {
    this.id = id;
    this.name = name;
    this.pokerType = new ArrayList<>();
  }
 
  public String getId() {
    return id;
  }
  public void setId(String id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public List<Card> getPokerType() {
    return pokerType;
  }
  public void setPokerType(List<Card> pokerType) {
    this.pokerType = pokerType;
  }  
}
登入後複製

撲克牌遊戲主類:包含11)撲克牌創建2)玩家創建3)洗牌4)發牌5)比較勝負

package collectiontest.games;
 
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
 
public class GamsBegin {
 
  // 创建扑克牌
  public Set<Poker> cPoker() {
     
    System.out.println("**********开始创建扑克牌**********");
    // 创建一副poker
    // 四个类型:黑--4、红--3、梅--2、方--1
    Set<Poker> pokers = new HashSet<>();
    Poker[] poker = { new Poker(1), new Poker(2), new Poker(3),
        new Poker(4) };
    /*
     * Collections工具类的使用
     * Collections.addAll(pokers, new Poker(1), new Poker(2), new Poker(3),new Poker(4));
     *
     * */
    pokers.addAll(Arrays.asList(poker));
 
    System.out.println("**********扑克牌创建成功**********");
 
    return pokers;
  }
 
  // 创建两个玩家
  public Map<String, Player> cPlayer() {
     
    System.out.println("**********开始创建玩家**********");
    Map<String, Player> map = new HashMap<String, Player>();
    // 控制数量
    Integer control = 0;
 
    System.out.println("创建两名玩家,根据提示创建");
    Scanner console = new Scanner(System.in);
    while (true) {
      System.out.println("请输入第 "+(control+1)+" 个玩家ID:");
      String courseId = console.next();
 
      if (isNumeric(courseId)) {
        System.out.println("请输入第 "+(control+1)+" 个玩家姓名:");
        String courseName = console.next();
 
        Player players = new Player(courseId, courseName, null);
        //保存数据
        map.put(courseId, players);
 
        System.out.println("添加第 " + (control + 1) + " 个玩家 " + courseName
            + " 成功");
        //数量自加
        control++;
      } else {
        System.out.println("*****请输入数字ID*****");
        continue;
      }
 
      if (control == 2) {
        break;
      }
 
    }
 
    System.out.println("**********玩家创建成功**********");
 
    return map;
  }
 
  // 判断输入是否为数字, Character.isDigit()为java方法
  public boolean isNumeric(String str) {
    for (int i = 0; i < str.length(); i++) {
      if (!Character.isDigit(str.charAt(i))) {
        return false;
      }
    }
    return true;
  }
 
  /**
   * 洗牌 :也可以产生52个不同随机数,实现洗牌
   *
   **/
  public List<Card> wPoker(Set<Poker> pokers) {
    System.out.println("**********开始洗牌**********");
    //利用List的有序排序,洗牌之后保存顺序不变
    List<Card> listCard = new ArrayList<>();
    // 利用Set集合的无序排序,实现洗牌
    Set<Card> listSet = new HashSet<>();
 
    //保存到Set集合,无序
    for (Poker pk : pokers) {
      listSet.add(pk.getId2());
      listSet.add(pk.getId3());
      listSet.add(pk.getId4());
      listSet.add(pk.getId5());
      listSet.add(pk.getId6());
      listSet.add(pk.getId7());
      listSet.add(pk.getId8());
      listSet.add(pk.getId9());
      listSet.add(pk.getId10());
      listSet.add(pk.getJ());
      listSet.add(pk.getQ());
      listSet.add(pk.getK());
      listSet.add(pk.getA());
    }
 
    //保存在List集合,有序
    for (Card cd : listSet) {
      listCard.add(cd);
      System.out.println(cd);
    }
     
    System.out.println("**********洗牌成功**********");
 
    return listCard;
  }
 
  // 发牌
  public Map<String, Player> pushPoker(List<Card> listCard,
      Map<String, Player> pMap) {
    System.out.println("**********发牌开始**********");
     
    // 控制每人发两张牌后结束
    int control = 0;
 
    for (Map.Entry<String, Player> entry : pMap.entrySet()) {
 
      if (control == 0) {
        for (int i = 0; i < 3; i = i + 2) {
          // 发牌
          entry.getValue().getPokerType().add(listCard.get(i));
        }
        // 更新map对象
        pMap.put(entry.getKey(), entry.getValue());
        control++;
      } else if (control == 1) {
        for (int i = 1; i < 4; i = i + 2) {
          // 发牌
          entry.getValue().getPokerType().add(listCard.get(i));
        }
        // 更新map对象
        pMap.put(entry.getKey(), entry.getValue());
        control++;
      } else {
        break;
      }
    }
 
    System.out.println("**********发牌成功**********");
 
    return pMap;
  }
 
 
  public void compareMatch(Map<String, Player> newMap) {
   
    /*比较胜负
     * 1.首先取得每个玩家手中最大牌的ID和花色ID。
     * 2.比较俩玩家手中最大牌的ID大小,牌大者获胜。
     * 3.如果两张牌的ID相等,在比较两张牌的花色ID,花色ID更大着获胜。
     * 
     * */
     
    List<Player> players = new ArrayList<>();
 
    // 获得两个玩家
    for (Map.Entry<String, Player> entry : newMap.entrySet()) {
      players.add(entry.getValue());
    }
 
    // 玩家一信息和所持牌
    List<Card> playerOne = players.get(0).getPokerType();
    //获得最大牌的ID和花色
    Integer oneMaxId = Math.max(playerOne.get(0).getId(), playerOne.get(1)
        .getId());
    Integer oneMaxType = (oneMaxId!=playerOne.get(0).getId()) ? playerOne.get(1).getType() : playerOne.get(0).getType() ;
 
    // 玩家二信息和所持牌
    List<Card> playerTwo = players.get(1).getPokerType();
    //获得最大牌的ID和花色
    Integer twoMaxId = Math.max(playerTwo.get(0).getId(), playerTwo.get(1)
        .getId());
    Integer twoMaxType = (twoMaxId!=playerTwo.get(0).getId()) ? playerTwo.get(1).getType() : playerTwo.get(0).getType() ;
 
    if (oneMaxId > twoMaxId) {
      System.out.println("玩家 : " + players.get(0).getName() + " 获胜!!");
    } else if (oneMaxId == twoMaxId) {
 
      if (oneMaxType > twoMaxType) {
        System.out
            .println("玩家 : " + players.get(0).getName() + " 获胜!!");
 
      } else {
        System.out
            .println("玩家 : " + players.get(1).getName() + " 获胜!!");
      }
 
    } else {
      System.out.println("玩家 : " + players.get(1).getName() + " 获胜!!");
    }
 
    System.out.println("**********************************************");
    System.out.println("玩家 : " + players.get(0).getName() + "的牌是:"
        + showName(playerOne.get(0).getType(), 0) + "--"
        + showName(playerOne.get(0).getId(), 1) + "  "
        + showName(playerOne.get(1).getType(), 0) + "--"
        + showName(playerOne.get(1).getId(), 1));
    System.out.println("玩家 : " + players.get(1).getName() + "的牌是:"
        + showName(playerTwo.get(0).getType(), 0) + "--"
        + showName(playerTwo.get(0).getId(), 1) + "  "
        + showName(playerTwo.get(1).getType(), 0) + "--"
        + showName(playerTwo.get(1).getId(), 1));
  }
 
  // 显示牌的名称
  private String showName(Integer i, Integer type) {
    String str = "";
 
    // 显示花色
    if (type == 0) {
      switch (i) {
      case 1: {
        str = "方块";
        break;
      }
      case 2: {
        str = "梅花";
        break;
      }
      case 3: {
        str = "红桃";
        break;
      }
      case 4: {
        str = "黑桃";
        break;
      }
 
      default: {
        break;
      }
      }
 
    }
 
    // 显示数字
    if (type == 1) {
      if (i < 11) {
        return i.toString();
      } else {
        switch (i) {
        case 11: {
          str = "J";
          break;
        }
        case 12: {
          str = "Q";
          break;
        }
        case 13: {
          str = "K";
          break;
        }
        case 14: {
          str = "A";
          break;
        }
 
        default: {
          break;
        }
        }
      }
    }
 
    return str;
  }
 
  public static void main(String[] args) {
    GamsBegin gb = new GamsBegin();
     
    // 1、创建扑克牌
    Set<Poker> pokers = gb.cPoker();
 
    // 2、创建两个玩家
    Map<String, Player> pMap = gb.cPlayer();
 
    // 3、洗牌
    List<Card> listCard = gb.wPoker(pokers);
 
    // 4、发牌
    Map<String, Player> newMap = gb.pushPoker(listCard, pMap);
 
    // 4、比较胜负
    gb.compareMatch(newMap);
 
  }
}
登入後複製

運行結果:

**********開始創建撲克牌******** **
**********撲克牌創建成功**********
**********開始創建玩家********* *
創建兩名玩家,根據提示創建
請輸入第  1 個玩家ID:
請輸入第  1 個玩家姓名:
周星馳
新增第1 個玩家  周星馳成功
請輸入第  2 個玩家ID:
輸入第  2 位玩家姓名:
週潤發
新增第2 位玩家  週潤發成功
**********玩家創造成功**********
********* *開始洗牌**********
Card [id=9, type=3]
Card [id=11, type=4]
Card [id=13, type=3]
Card [ id=8, type=3]
Card [id=5, type=2]
Card [id=6, type=1]
Card [id=4, type=3]
Card [id=5, type= 4]
Card [id=2, type=3]
Card [id=9, type=2]
Card [id=9, type=4]
Card [id=14, type=2]
Card [id =9, type=1]
Card [id=2, type=1]
Card [id=2, type=4]
Card [id=7, type=4]
Card [id=11, type=1 ]
Card [id=10, type=1]
Card [id=14, type=4]
Card [id=14, type=3]
Card [id=12, type=2]
Card [id= 2, type=2]
Card [id=10, type=2]
Card [id=7, type=1]
Card [id=7, type=3]
Card [id=8, type=2]
Card [id=4, type=4]
Card [id=13, type=4]
Card [id=14, type=1]
Card [id=12, type=1]
Card [id=5 , type=1]
Card [id=6, type=4]
Card [id=12, type=4]
Card [id=11, type=2]
Card [id=10, type=3]
Card [id=3, type=4]
Card [id=12, type=3]
Card [id=4, type=2]
Card [id=4, type=1]
Card [id=6, type=2]
Card [id=5, type=3]
Card [id=8, type=4]
Card [id=3, type=2]
Card [id=13, type=2]
Card [id=7, type=2]
Card [id=3, type=3]
Card [id=3, type=1]
Card [id=6, type=3]
Card [id=8, type =1]
Card [id=11, type=3]
Card [id=13, type=1]
Card [id=10, type=4]
**********洗牌成功**********
**********發牌開始**********
**********發牌成功** ********
玩家: 周星馳獲勝! !
**********************************************
玩家:周星馳的牌是:紅桃--9   紅桃--K
玩家: 週潤發的牌是:黑桃--J   紅桃--8

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持PHP中文網。

更多JAVA collection集合之撲克牌遊戲實例相關文章請關注PHP中文網!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
公司安全軟件導致應用無法運行?如何排查和解決? 公司安全軟件導致應用無法運行?如何排查和解決? Apr 19, 2025 pm 04:51 PM

公司安全軟件導致部分應用無法正常運行的排查與解決方法許多公司為了保障內部網絡安全,會部署安全軟件。 ...

如何將姓名轉換為數字以實現排序並保持群組中的一致性? 如何將姓名轉換為數字以實現排序並保持群組中的一致性? Apr 19, 2025 pm 11:30 PM

將姓名轉換為數字以實現排序的解決方案在許多應用場景中,用戶可能需要在群組中進行排序,尤其是在一個用...

如何使用MapStruct簡化系統對接中的字段映射問題? 如何使用MapStruct簡化系統對接中的字段映射問題? Apr 19, 2025 pm 06:21 PM

系統對接中的字段映射處理在進行系統對接時,常常會遇到一個棘手的問題:如何將A系統的接口字段有效地映�...

IntelliJ IDEA是如何在不輸出日誌的情況下識別Spring Boot項目的端口號的? IntelliJ IDEA是如何在不輸出日誌的情況下識別Spring Boot項目的端口號的? Apr 19, 2025 pm 11:45 PM

在使用IntelliJIDEAUltimate版本啟動Spring...

如何優雅地獲取實體類變量名構建數據庫查詢條件? 如何優雅地獲取實體類變量名構建數據庫查詢條件? Apr 19, 2025 pm 11:42 PM

在使用MyBatis-Plus或其他ORM框架進行數據庫操作時,經常需要根據實體類的屬性名構造查詢條件。如果每次都手動...

Java對像如何安全地轉換為數組? Java對像如何安全地轉換為數組? Apr 19, 2025 pm 11:33 PM

Java對象與數組的轉換:深入探討強制類型轉換的風險與正確方法很多Java初學者會遇到將一個對象轉換成數組的�...

如何利用Redis緩存方案高效實現產品排行榜列表的需求? 如何利用Redis緩存方案高效實現產品排行榜列表的需求? Apr 19, 2025 pm 11:36 PM

Redis緩存方案如何實現產品排行榜列表的需求?在開發過程中,我們常常需要處理排行榜的需求,例如展示一個�...

電商平台SKU和SPU數據庫設計:如何兼顧用戶自定義屬性和無屬性商品? 電商平台SKU和SPU數據庫設計:如何兼顧用戶自定義屬性和無屬性商品? Apr 19, 2025 pm 11:27 PM

電商平台SKU和SPU表設計詳解本文將探討電商平台中SKU和SPU的數據庫設計問題,特別是如何處理用戶自定義銷售屬...

See all articles