首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java Collection 實戰:模擬港片大佬撲克牌遊戲

     編輯:Java 綜合教學

Java Collection 實戰:模擬港片大佬撲克牌遊戲

在經典港片中,大佬們圍桌推牌九、鬥撲克的場面總令人印象深刻。今天我們就用 Java Collection 框架,來複刻一個簡單的兩人撲克比大小遊戲,過程中會涵蓋集合創建、洗牌、發牌、比較邏輯等核心操作,適合初學者鞏固集合框架的實戰應用。

遊戲規則

  • 兩位玩家各發兩張牌
  • 先比較點數大小:A(14) > K(13) > Q(12) > J(11) > 10~2
  • 點數相同時比較花色:黑桃(4) > 紅桃(3) > 梅花(2) > 方塊(1)
  • 點數與花色皆大者獲勝

核心類設計

1. Card 類 - 牌的基本單元

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 略
}

2. Poker 類 - 單一花色的 13 張牌

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 略
}

3. Player 類 - 玩家實體

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 略
}

4. GamsBegin 主控類 - 遊戲流程協調

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);
    }
}

關鍵技術點解析

  1. Set 去重 + List 有序:洗牌時先放入 HashSet 打亂順序,再轉 ArrayList 固定順序,巧妙利用集合特性。
  2. Collections 工具類:實際專案中可直接用 Collections.shuffle(list) 一行搞定洗牌,更簡潔高效。
  3. 比較邏輯封裝:取出每位玩家最大點數的牌,先比點數再比花色,邏輯清晰易維護。
  4. Scanner 互動輸入:示範了控制台輸入驗證(需為純數字 ID)的寫法。

執行範例輸出

**********開始創建撲克牌**********
**********撲克牌創建成功**********
**********開始創建玩家**********
請輸入第 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> 封裝比大小邏輯,支援未來擴充「順子、同花」等牌型判斷。
  • 將 I/O 與業務邏輯分離,便於單元測試與 GUI/Web 移植。

這個小遊戲雖然簡單,卻串起了 集合創建、去重、排序、遍歷、Map 多鍵值操作 等高頻技能,是從「會用 API」邁向「會設計資料結構」的絕佳練手項目。動手跑一遍,再按建議重構一次,收穫會更大!

  1. 上一篇文章:
  2. 下一篇文章:
《Java 多執行緒核心技術》—— 從入門到精通的最佳實戰指南 多線程進階:synchronized 同步機制深度解析 移動端 Web 頭部通用模板:Viewport、Meta 標籤與 Flexible.js 適配方案 Spring 整合 Jedis 實現 Redis 分片集群客戶端完整實戰 Zabbix 监控 Oracle 数据库实战:Orabbix 插件部署全流程 JS 載入時機陷阱:為什麼