在經典港片中,大佬們圍桌推牌九、鬥撲克的場面總令人印象深刻。今天我們就用 Java Collection 框架,來複刻一個簡單的兩人撲克比大小遊戲,過程中會涵蓋集合創建、洗牌、發牌、比較邏輯等核心操作,適合初學者鞏固集合框架的實戰應用。
package collectiontest.games;
public class Card {
private Integer id; // 點數 2~14 (14 代表 A)
private Integer type; // 花色 1~4 (方塊、梅花、紅桃、黑桃)
public Card(Integer id, Integer type) {
this.id = id;
this.type = type;
}
// getter/setter/toString 略
}
package collectiontest.games;
public class Poker {
private Card id2, id3, id4, id5, id6, id7, id8, id9, id10, J, Q, K, A;
public Poker(Integer type) {
this.id2 = new Card(2, type);
this.id3 = new Card(3, type);
// ... 中間省略 ...
this.A = new Card(14, type);
}
// getter/setter 略
}
package collectiontest.games;
import java.util.ArrayList;
import java.util.List;
public class Player {
private String id;
private String name;
private List<Card> pokerType = new ArrayList<>();
public Player(String id, String name) {
this.id = id;
this.name = name;
}
// getter/setter 略
}
package collectiontest.games;
import java.util.*;
public class GamsBegin {
// 建立一副 52 張牌 (4 種花色 × 13 點數)
public Set<Poker> createPoker() { ... }
// 互動式建立兩位玩家
public Map<String, Player> createPlayer() { ... }
// 洗牌:利用 HashSet 無序特性打亂順序,再轉 List 保持順序
public List<Card> shuffle(Set<Poker> pokers) { ... }
// 發牌:輪流給兩位玩家各兩張
public Map<String, Player> dealCards(List<Card> deck, Map<String, Player> players) { ... }
// 比大小邏輯
public void compareMatch(Map<String, Player> players) { ... }
// 輔助:將數字轉中文顯示
private String showName(Integer val, Integer type) { ... }
public static void main(String[] args) {
GamsBegin game = new GamsBegin();
Set<Poker> pokers = game.createPoker();
Map<String, Player> players = game.createPlayer();
List<Card> deck = game.shuffle(pokers);
Map<String, Player> dealt = game.dealCards(deck, players);
game.compareMatch(dealt);
}
}
HashSet 打亂順序,再轉 ArrayList 固定順序,巧妙利用集合特性。Collections.shuffle(list) 一行搞定洗牌,更簡潔高效。**********開始創建撲克牌********** **********撲克牌創建成功********** **********開始創建玩家********** 請輸入第 1 個玩家ID: 123 請輸入第 1 個玩家姓名: 周星馳 添加第 1 個玩家 周星馳 成功 請輸入第 2 個玩家ID: 456 請輸入第 2 個玩家姓名: 周潤發 添加第 2 個玩家 周潤發 成功 **********玩家創建成功********** **********開始洗牌********** Card [id=9, type=3] // 紅桃 9 Card [id=11, type=4] // 黑桃 J ... **********洗牌成功********** **********發牌開始********** **********發牌成功********** 玩家 : 周星馳 獲勝!! ********************************************** 玩家 : 周星馳的牌是:紅桃--9 紅桃--K 玩家 : 周潤發的牌是:黑桃--J 紅桃--8
Poker 類改為單純的「牌堆」工具類,靜態方法生成 52 張 Card 列表,避免 13 個字段的冗餘。enum 定義花色與點數,消除魔術數字,提升可讀性。Comparator<Card> 封裝比大小邏輯,支援未來擴充「順子、同花」等牌型判斷。這個小遊戲雖然簡單,卻串起了 集合創建、去重、排序、遍歷、Map 多鍵值操作 等高頻技能,是從「會用 API」邁向「會設計資料結構」的絕佳練手項目。動手跑一遍,再按建議重構一次,收穫會更大!