斗地主练习
案例介绍
按照斗地主的规则, 完成洗牌发牌的动作.
具体规则:
- 组装 54 张扑克牌
- 54 张牌顺序打乱
- 三个玩家参与游戏, 三个人交替摸牌, 每人 17 张牌, 最后三张留作底牌
- 查看三人各自手中的牌 (按照牌的大小顺序), 底牌
规则
手中的扑克牌从大到小的摆放顺序:
案例需求分析
准备牌
完成数组与纸牌的映射关系: 使用双列 Map(HashMap) 集合, 完成一个数组与字符串纸牌的对应关系. (相当于一个字典)
洗牌
通过数字完成洗牌发牌.
发牌
将每个人以及底牌设计为 ArrayList, 将最后 3 张牌直接存放于底牌, 剩余牌通过对 3 取模依次发牌.
存放的过程中要求数字大小与斗地主规则的大小对应. 将不同纸牌的数字分配给不同的玩家与底牌.
看牌
通过 Map 集合找到对应字符展示.
通过查询纸牌与数字对应关系, 由数字转成纸牌字符串再进行展示.
实现代码步骤
import java.util.*;
public class Poker {
public static void main(String[] args) {
// 创建Map集合存储
HashMap<Integer, String> pokerMap = new HashMap<>();
// 创建花色集合与数字集合
ArrayList<String> colors = new ArrayList<>();
ArrayList<String> numbers = new ArrayList<>();
// 存储花色与数字
Collections.addAll(colors, "♦", "♣", "♥", "♠");
Collections.addAll(numbers, "2", "A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3");
// 设置存储编号变量
int count = 1;
pokerMap.put(count++, "大王");
pokerMap.put(count++, "大王");
// 设置存储到map集合中
for (String number : numbers) {
for (String color : colors) {
String card = color + number;
pokerMap.put(count++, card);
}
}
// 取出编号集合
Set<Integer> numberSet = pokerMap.keySet();
// 因为要将编号打乱顺序所以应该先进行转换到list集合中
ArrayList<Integer> numberList = new ArrayList<>();
numberList.addAll(numberSet);
// 打乱顺序
Collections.shuffle(numberList);
// 发牌的编号: 创建三个玩家编号集合和一个底牌编号集合
ArrayList<Integer> noP1 = new ArrayList<Integer>();
ArrayList<Integer> noP2 = new ArrayList<Integer>();
ArrayList<Integer> noP3 = new ArrayList<Integer>();
ArrayList<Integer> bottom = new ArrayList<Integer>();
// 发牌的编号
for (int i = 0; i < numberList.size(); i++) {
// 获取该编号
int no = numberList.get(i);
// 发牌, 留出底牌
if (i >= 51) {
bottom.add(no);
} else {
if (i % 3 == 0) {
noP1.add(no);
} else if (i % 3 == 1) {
noP2.add(no);
} else {
noP3.add(no);
}
}
}
// 对手标号进行排序
Collections.sort(noP1);
Collections.sort(noP2);
Collections.sort(noP3);
Collections.sort(bottom);
// 进行牌面转换
// 创建三个玩家牌面集合以及底牌牌面集合
ArrayList<String> player1 = new ArrayList<String>();
ArrayList<String> player2 = new ArrayList<String>();
ArrayList<String> player3 = new ArrayList<String>();
ArrayList<String> bottomDeck = new ArrayList<String>();
// 转换
for (int i : noP1) {
// 根据编号查找牌面porkerMap
String card = pokerMap.get(i);
// 添加到对应的牌面集合中
player1.add(card);
}
for (Integer i : noP2) {
String card = pokerMap.get(i);
player2.add(card);
}
for (Integer i : noP3) {
String card = pokerMap.get(i);
player3.add(card);
}
for (Integer i : bottom) {
String card = pokerMap.get(i);
bottomDeck.add(card);
}
// 查看
System.out.println("我是小小白: " + player1);
System.out.println("我是小白: " + player2);
System.out.println("我是大白: " + player3);
System.out.println("底牌: " + bottomDeck);
}
}