案例6-4斗地主洗牌发牌

This commit is contained in:
2024-12-03 10:27:20 +08:00
parent 26fcbfbd91
commit 8aa6947e2b
7 changed files with 703 additions and 0 deletions

View File

@@ -0,0 +1,170 @@
package chapter6.demo64;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
public class Function {
// 存储牌号和牌面的对应关系
private static HashMap<Integer, String> cardMap = new HashMap<>();
public static void main(String[] args) {
// 1. 准备牌的基本元素
ArrayList<String> colors = prepareColors();
ArrayList<String> points = preparePoints();
// 2. 组装54张牌
createCards(colors, points);
// 3. 洗牌准备
ArrayList<Integer> cards = shuffleCards();
// 4. 发牌
ArrayList<ArrayList<Integer>> dealtCards = dealCards(cards);
ArrayList<Integer> iPlayer = dealtCards.get(0);
ArrayList<Integer> iPlayer2 = dealtCards.get(1);
ArrayList<Integer> iPlayer3 = dealtCards.get(2);
ArrayList<Integer> iSecretCards = dealtCards.get(3);
// 5. 整理手牌
sortCards(iPlayer, iPlayer2, iPlayer3);
// 6. 转换并显示牌面
showCards(iPlayer, iPlayer2, iPlayer3, iSecretCards);
}
/**
* 准备扑克牌的4种花色
* @return ArrayList<String> 包含4种花色符号的列表
*/
private static ArrayList<String> prepareColors() {
ArrayList<String> colors = new ArrayList<>();
colors.add("");
colors.add("");
colors.add("");
colors.add("");
return colors;
}
/**
* 准备扑克牌的13种点数
* @return ArrayList<String> 包含2-10,J,Q,K,A的点数列表
*/
private static ArrayList<String> preparePoints() {
ArrayList<String> points = new ArrayList<>();
for (int i = 2; i <= 10; i++) {
points.add(i + "");
}
points.add("J");
points.add("Q");
points.add("K");
points.add("A");
return points;
}
/**
* 创建54张扑克牌并建立编号和牌面的映射关系
* @param colors 花色列表
* @param points 点数列表
*/
private static void createCards(ArrayList<String> colors, ArrayList<String> points) {
int index = 0;
for (String number : points) {
for (String color : colors) {
cardMap.put(index++, color + number);
}
}
cardMap.put(index++, "小☺");
cardMap.put(index++, "大☻");
}
/**
* 生成54张牌的编号并随机打乱顺序
* @return ArrayList<Integer> 洗好的牌的编号列表(0-53)
*/
private static ArrayList<Integer> shuffleCards() {
ArrayList<Integer> cards = new ArrayList<>();
for (int i = 0; i <= 53; i++) {
cards.add(i);
}
Collections.shuffle(cards);
return cards;
}
/**
* 将54张牌分发给三个玩家和底牌
* @param cards 洗好的牌的编号列表
* @return ArrayList<ArrayList<Integer>> 包含四个列表的集合:
* 索引0-2分别为三个玩家的牌索引3为底牌
*/
private static ArrayList<ArrayList<Integer>> dealCards(ArrayList<Integer> cards) {
ArrayList<Integer> iPlayer = new ArrayList<>();
ArrayList<Integer> iPlayer2 = new ArrayList<>();
ArrayList<Integer> iPlayer3 = new ArrayList<>();
ArrayList<Integer> iSecretCards = new ArrayList<>();
for (int i = 0; i < cards.size(); i++) {
if (i >= 51) {
iSecretCards.add(cards.get(i));
} else {
if (i % 3 == 0) {
iPlayer.add(cards.get(i));
} else if (i % 3 == 1) {
iPlayer2.add(cards.get(i));
} else {
iPlayer3.add(cards.get(i));
}
}
}
ArrayList<ArrayList<Integer>> result = new ArrayList<>();
result.add(iPlayer);
result.add(iPlayer2);
result.add(iPlayer3);
result.add(iSecretCards);
return result;
}
/**
* 对玩家手中的牌进行排序
* @param players 可变参数,接收多个玩家的牌列表
*/
private static void sortCards(ArrayList<Integer>... players) {
for (ArrayList<Integer> player : players) {
Collections.sort(player);
}
}
/**
* 展示所有玩家的牌和底牌
* @param iPlayer 玩家1的牌号列表
* @param iPlayer2 玩家2的牌号列表
* @param iPlayer3 玩家3的牌号列表
* @param iSecretCards 底牌列表
*/
private static void showCards(ArrayList<Integer> iPlayer, ArrayList<Integer> iPlayer2,
ArrayList<Integer> iPlayer3, ArrayList<Integer> iSecretCards) {
ArrayList<String> sPlayer = convertToCardFace(iPlayer);
ArrayList<String> sPlayer2 = convertToCardFace(iPlayer2);
ArrayList<String> sPlayer3 = convertToCardFace(iPlayer3);
ArrayList<String> sSecretCards = convertToCardFace(iSecretCards);
System.out.println("玩家1" + sPlayer);
System.out.println("玩家2" + sPlayer2);
System.out.println("玩家3" + sPlayer3);
System.out.println("底牌:" + sSecretCards);
}
/**
* 将牌号转换为具体的牌面
* @param cards 牌号列表
* @return ArrayList<String> 转换后的牌面列表
*/
private static ArrayList<String> convertToCardFace(ArrayList<Integer> cards) {
ArrayList<String> result = new ArrayList<>();
for (Integer key : cards) {
result.add(cardMap.get(key));
}
return result;
}
}