案例介绍:
按照斗地主的规则,完成洗牌发牌的动作。
具体规则:
使用54张牌打乱顺序,三个玩家参与游戏,三者交替摸牌,每人1张牌,最后三张作留底牌
案例分析:
1. 准备洗牌
- 牌可以设计为一个ArrayList<String>,每个字符串为一张牌。
- 每张牌由花色数字两部分组成,我们可以使用花色集合与数字集合嵌套迭代完成每张牌的组装。
- 牌由Collections类的shuffle方法进行随机排序。
2. 发牌
- 将每个人以及底牌设计为ArrayList<String>,将最后3张牌直接存放于底牌,剩余牌通过对3取模依次发牌。
3. 看牌
- 直接打印每个集合
案例实现:
定义一个类:
package JiHe.DouDiZhuL;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
/*
斗地主综合案例:
1. 准备牌
2. 洗牌
3. 发牌
4. 看牌
*/
public class DouDiZhu {
public static void main(String[] args) {
//1. 准备牌
//定义一个存储54张牌的ArrayList集合,泛型使用String
ArrayList<String> poker = new ArrayList<>();
//定义两个数组,一个数组存储牌的花色,一个数组存储牌的序号
String[] colors = {"♠","♥","♣","♦"};
String[] numbers = {"2","A","K","Q","J","10","9","8","7","6","5","4","3"};
//先把大王、小王添加到集合中
poker.add("大王");
poker.add("小王");
//循环嵌套遍历两个数组,组装52张牌
for(String number : numbers){
for (String color : colors) {
//System.out.println(color + number);
//把组装好的牌存储到poker集合中
poker.add(color + number);
}
}
//System.out.println(poker);
/*
2. 洗牌
使用集合的工具类Collections中的方法
static void shuffle(List<?> list) 使用默认随机源对指定列表进行置换。。
*/
Collections.shuffle(poker);
//System.out.println(poker);
/*
3. 发牌
*/
//定义4个集合,存储玩家的牌和底牌
ArrayList<String> player01 = new ArrayList<>();
ArrayList<String> player02 = new ArrayList<>();
ArrayList<String> player03 = new ArrayList<>();
ArrayList<String> diPai = new ArrayList<>();
/*
遍历poker集合,获取每一张牌
使用poker集合的索引%3给3个玩家轮流发牌
剩余的3张牌给底牌
注意:
先判断底牌(i >= 51),否则牌就发没了
*/
for (int i = 0; i < poker.size(); i++) {
//获取每一张牌
String p = poker.get(i);
//轮流发牌
if(i >= 51){
diPai.add(p);
}else if(i % 3 == 0){
player01.add(p);
}else if(i % 3 == 1){
player02.add(p);
}else if(i % 3 == 2){
player03.add(p);
}
}
//4. 看牌 有两种对集合遍历的方法
System.out.println("AA的牌:" + player01);
System.out.println("BB的牌:" + player02);
System.out.println("CC的牌:" + player03);
System.out.println("底牌:" + diPai);
System.out.println("=======================================================================================");
//1. 调用一个迭代器方法遍历
System.out.print("AA的牌:");
printArray(player01);
System.out.println("");
System.out.print("BB的牌:");
printArray(player02);
System.out.println("");
System.out.print("CC的牌:");
printArray(player03);
System.out.println("");
System.out.print("底牌:");
printArray(diPai);
System.out.println("");
System.out.println("=======================================================================================");
//2. 增强for循环遍历
System.out.print("AA的牌:");
for(Object o1 : player01){
System.out.print(o1 + " ");
}
}
//定义一个遍历集合的方法
public static void printArray(ArrayList<?> list){
//使用迭代器遍历
Iterator<?> it = list.iterator();
while (it.hasNext()){
Object o = it.next();
System.out.print(o + " ");
}
}
}
运行结果:
AA的牌:[♣K, ♣8, ♣7, ♥7, ♣10, ♦K, 大王, ♠J, ♥K, ♠Q, ♣A, ♦3, ♦2, ♦Q, ♠7, ♥Q, ♠4]
BB的牌:[♠3, ♦J, ♦7, ♠K, ♥3, ♦5, ♥5, ♠8, ♣2, ♥J, ♠A, ♣5, ♥A, ♠6, ♦10, ♣J, ♥9]
CC的牌:[♣4, ♦9, ♠10, ♦4, ♠2, ♥6, ♣Q, ♥10, ♦A, 小王, ♦8, ♠9, ♣9, ♥8, ♠5, ♥4, ♣3]
底牌:[♣6, ♥2, ♦6]
=======================================================================================
AA的牌:♣K ♣8 ♣7 ♥7 ♣10 ♦K 大王 ♠J ♥K ♠Q ♣A ♦3 ♦2 ♦Q ♠7 ♥Q ♠4
BB的牌:♠3 ♦J ♦7 ♠K ♥3 ♦5 ♥5 ♠8 ♣2 ♥J ♠A ♣5 ♥A ♠6 ♦10 ♣J ♥9
CC的牌:♣4 ♦9 ♠10 ♦4 ♠2 ♥6 ♣Q ♥10 ♦A 小王 ♦8 ♠9 ♣9 ♥8 ♠5 ♥4 ♣3
底牌:♣6 ♥2 ♦6
=======================================================================================
AA的牌:♣K ♣8 ♣7 ♥7 ♣10 ♦K 大王 ♠J ♥K ♠Q ♣A ♦3 ♦2 ♦Q ♠7 ♥Q ♠4
另一种实现方法(有序排序版本):https://blog.csdn.net/qq_36050720/article/details/98604318