系统:Win10
Java:1.8.0_333
IDEA:2020.3.4
1.案例介绍
按照斗地主规则,完成准备牌、洗牌、发牌的动作
具体规则
使用54张牌打乱顺序,三个玩家参与游戏,三人交替摸牌,每人 17 张牌,最后 3 张留作底牌
2.案例分析
2.1 准备牌
准备54张牌,存储到一个集合中
特殊牌:大王、小王
其他52张牌
定义一个集合/数组,存储四种花色:♠、♥、♣、♦
定义一个集合/数组,存储13个序号:2、A、K、Q、J、10、9、8、7、6、5、4、3
循环嵌套遍历两个数组/集合,组装52张牌
♠2、♠A、♠K、♠Q…♠3 ♥2、♥A、♥K、♥Q…♥3
♣2、♣A、♣K、♣Q…♣3 ♦2、♦A、♦K、♦Q…♦3
2.2 洗牌
使用集合工具类 Collection 的方法
static void shuffle(List<?> list) 使用默认随机源对指定列表进行置换
会随机的打乱集合元素的顺序
2.3 发牌
要求:1 人 17 张牌,最后剩余 3 张作为底牌,一人一张轮流发牌:使用集合索引 (0-53)%3
定义四个集合:存储三个玩家的牌和底牌
索引%3 == 0 的给玩家1
索引%3 == 1 的给玩家2
索引%3 == 2 的给玩家3
最后3张(索引 >= 51)作为底牌
2.4 看牌
直接打印三个玩家的牌和底牌
3.代码实现
public class DouDiZhu {
public static void main(String[] args) {
// 1.准备牌
ArrayList<String> poker = new ArrayList<>();
// 特殊牌:大王、小王
poker.add("大王");
poker.add("小王");
// 定义一个集合/数组,存储四种花色:♠、♥、♣、♦
String[] colors = {"♠", "♥", "♣", "♦"};
// 定义一个集合/数组,存储13个序号:2、A、K、Q、J、10、9、8、7、6、5、4、3
String[] numbers = {"2", "A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3"};
/*
循环嵌套遍历两个数组/集合,组装52张牌
♠2、♠A、♠K、♠Q...♠3 ♥2、♥A、♥K、♥Q...♥3
♣2、♣A、♣K、♣Q...♣3 ♦2、♦A、♦K、♦Q...♦3
*/
for (String color : colors) {
for (String number : numbers) {
// System.out.println(color+number);
poker.add(color + number);
}
}
// System.out.println(poker);
// 2.洗牌 static void shuffle(List<?> list)
Collections.shuffle(poker);
// System.out.println(poker);
// 3.发牌
ArrayList<String> player01 = new ArrayList<>();
ArrayList<String> player02 = new ArrayList<>();
ArrayList<String> player03 = new ArrayList<>();
ArrayList<String> diPai = new ArrayList<>();
for (int i = 0; i < poker.size(); i++) {
String p = poker.get(i);
if (i >= 51) { // 最后3张(索引 >= 51)作为底牌
diPai.add(p);
}else if (i % 3 == 0) { // 索引%3 == 0 的给玩家1
player01.add(p);
}else if (i % 3 == 1) { // 索引%3 == 1 的给玩家2
player02.add(p);
}else if (i % 3 == 2) { // 索引%3 == 2 的给玩家3
player03.add(p);
}
}
// 4.看牌
System.out.println("周润发:" + player01);
System.out.println("刘德华:" + player02);
System.out.println("周星驰:" + player03);
System.out.println("底牌:" + diPai);
}
}
运行结果