Java练习>ArrayList集合>>斗地主案例(无序排序版本)

案例介绍:

       按照斗地主的规则,完成洗牌发牌的动作。

具体规则:

       使用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值