斗地主發牌是經典的集合操作與邏輯控制綜合練習。本文提供完整、可運行的三類實現:Poker(牌庫)、Player(玩家/發牌/排序)、Test(主流程),涵蓋 54 張牌、三家輪發、底牌保留、大小寫花色與數字大小排序。
Collections.shuffle(listIndex) 打亂編號順序。Comparator,將 3~2、J、Q、K、A、大小王映射為可比較字符(a~f、g、h)後按字典序排序。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); }
}
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));
}
}
}
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
Enum 重構花色/點數,提升類型安全。這份代碼結構清晰、邏輯完整,適合作為集合框架、Comparator、靜態工具類綜合練習的參考模板。