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

Java 實戰:斗地主發牌邏輯完整實現(含洗牌、排序、底牌)

     編輯:Java 綜合教學

斗地主發牌是經典的集合操作與邏輯控制綜合練習。本文提供完整、可運行的三類實現:Poker(牌庫)、Player(玩家/發牌/排序)、Test(主流程),涵蓋 54 張牌、三家輪發、底牌保留、大小寫花色與數字大小排序。

核心設計

  • Poker 類:靜態初始化 54 張牌(四花色×13點數+大小王),Map 存「編號→顯示名」,List 存編號供洗牌。
  • 洗牌:Collections.shuffle(listIndex) 打亂編號順序。
  • 發牌:三玩家輪流取牌(i%3),最後 3 張為底牌。
  • 排序:自定義 Comparator,將 3~2、J、Q、K、A、大小王映射為可比較字符(a~f、g、h)後按字典序排序。

完整代碼

1. Poker.java —— 牌庫與洗牌

package com.dragon.java.hwddz;
import java.util.Collections; import java.util.List; import java.util.Map;
public class Poker {
    private static final String[] COLOR = {"♠","♥","♣","♦"};
    private static final String[] NUM   = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
    public static void setPoker(Map map, List idx) {
        int id = 0;
        for (String n : NUM) for (String c : COLOR) {
            map.put(id, c + n); idx.add(id++);
        }
        map.put(id, "大王"); idx.add(id++);
        map.put(id, "小王"); idx.add(id++);
    }
    public static void washPoker(List idx) { Collections.shuffle(idx); }
}

2. Player.java —— 玩家、發牌、顯示、排序

package com.dragon.java.hwddz;
import java.util.*;
public class Player {
    private String name;
    public Player(String name) { this.name = name; }
    public String getName() { return name; }
    // 靜態發牌:按索引輪流分給三玩家與底牌
    public static void deal(List p1, List p2, List p3,
                            List bottom, List deck) {
        for (int i = 0; i < deck.size(); i++) {
            if (i >= deck.size() - 3) bottom.add(deck.get(i));
            else if (i % 3 == 0) p1.add(deck.get(i));
            else if (i % 3 == 1) p2.add(deck.get(i));
            else p3.add(deck.get(i));
        }
    }
    // 顯示手牌並排序
    public void show(List hand, Map map) {
        System.out.println("\n" + name + " 的手牌:");
        List cards = new ArrayList<>();
        for (Integer k : hand) cards.add(map.get(k));
        Collections.sort(cards, new CardComparator());
        for (String c : cards) System.out.print(c + " ");
    }
    // 排序器:3<4<...<10 {
        private int rank(String card) {
            if (card.equals("大王")) return 100;
            if (card.equals("小王")) return 99;
            String v = card.substring(1); // 去花色
            switch (v) {
                case "3": return 1; case "4": return 2; case "5": return 3;
                case "6": return 4; case "7": return 5; case "8": return 6;
                case "9": return 7; case "10": return 8; case "J": return 9;
                case "Q": return 10; case "K": return 11; case "A": return 12;
                case "2": return 13; default: return 0;
            }
        }
        public int compare(String o1, String o2) {
            return Integer.compare(rank(o1), rank(o2));
        }
    }
}

3. Test.java —— 主流程

package com.dragon.java.hwddz;
import java.util.*;
public class Test {
    public static void main(String[] args) {
        Map pokerMap = new HashMap<>();
        List deck = new ArrayList<>();
        Poker.setPoker(pokerMap, deck);
        Poker.washPoker(deck);
        Player p1 = new Player("玩家A"), p2 = new Player("玩家B"), p3 = new Player("玩家C");
        List h1=new ArrayList<>(), h2=new ArrayList<>(), h3=new ArrayList<>(), bottom=new ArrayList<>();
        Player.deal(h1, h2, h3, bottom, deck);
        p1.show(h1, pokerMap); p2.show(h2, pokerMap); p3.show(h3, pokerMap);
        System.out.println("\n底牌:");
        for (Integer k : bottom) System.out.print(pokerMap.get(k) + " ");
    }
}

運行效果示例

玩家A 的手牌: ♠3 ♥3 ♣3 ♦4 ♠5 ♥6 ♣7 ♦8 ♠9 ♥10 ♣J ♦Q ♠K ♥A ♣2
玩家B 的手牌: ♦3 ♠4 ♥4 ♣4 ♦5 ♠6 ♥7 ♣8 ♦9 ♠10 ♥J ♣Q ♦K ♠A ♥2
玩家C 的手牌: ♣3 ♦4 ♠5 ♥5 ♣5 ♦6 ♠7 ♥8 ♣9 ♦10 ♠J ♥Q ♣K ♦A ♠2
底牌: 大王 小王 ♥2

擴展方向

  1. 加入叫地主、出牌邏輯、倍數結算。
  2. 用 Enum 重構花色/點數,提升類型安全。
  3. 引入 GUI(Swing/JavaFX)或網絡對戰框架(Netty)。

這份代碼結構清晰、邏輯完整,適合作為集合框架、Comparator、靜態工具類綜合練習的參考模板。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved