核心邏輯
- 建立 54 張牌集合(含大小王)。
- 洗牌(`Collections.shuffle`)。
- 發牌:輪流給 3 位玩家各 17 張,剩 3 張為底牌。
完整代碼範例
import java.util.*;
public class DouDizhuDeal {
public static void main(String[] args) {
// 1. 生成牌
List deck = new ArrayList<>();
String[] suits = {"♠", "♥", "♣", "♦"};
String[] ranks = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
for (String s : suits)
for (String r : ranks)
deck.add(s + r);
deck.add("🃏"); // 小王
deck.add("🃏"); // 大王(或用 Joker1/Joker2 区分)
// 2. 洗牌
Collections.shuffle(deck);
// 3. 發牌
List p1 = new ArrayList<>(), p2 = new ArrayList<>(), p3 = new ArrayList<>(), dipai = new ArrayList<>();
for (int i = 0; i < deck.size(); i++) {
if (i < 51) {
switch (i % 3) {
case 0: p1.add(deck.get(i)); break;
case 1: p2.add(deck.get(i)); break;
case 2: p3.add(deck.get(i)); break;
}
} else {
dipai.add(deck.get(i));
}
}
// 4. 排序展示(按權重大小)
Comparator cardOrder = (a, b) -> weight(a) - weight(b);
p1.sort(cardOrder); p2.sort(cardOrder); p3.sort(cardOrder); dipai.sort(cardOrder);
System.out.println("玩家1: " + p1);
System.out.println("玩家2: " + p2);
System.out.println("玩家3: " + p3);
System.out.println("底牌: " + dipai);
}
static int weight(String card) {
if (card.contains("🃏")) return card.equals("🃏") ? 100 : 101; // 簡化
String rank = card.substring(1);
String order = "345678910JQKA2";
return order.indexOf(rank);
}
}
關鍵點
- `Collections.shuffle` 使用 Fisher-Yates 洗牌,隨機均勻。
- 發牌用取模分配,保證平均。
- 排序需定義牌權重(3 最小,2 最大,王最大)。
- 實際遊戲還需加入叫地主、出牌驗證等邏輯。