Java实现斗地主游戏(随机发牌,看牌有序)

斗地主案例总结主要有以下知识点:
1、ArrayList和HashMap交叉使用
2、双重增强for循环组合赋值给ArrayList和HashMap
3、每张扑克牌都有一个单独(不重复)的数字来代表,数字越小,扑克牌的值越大
4、合理运用Collections工具类的方法,本文用到了sort(集合降序排序)和shuffle(集合数据随机)
5、把ArrayList里面的值作为HashMap里面的key值,想到这招的真是大神,这也是一开始创建ArrayList的集合的原因

import java.util.*;

public class Test {

    public static void main(String[] args) {
        //定义hashmap用于存放扑克牌,key值为对应每张牌的编号,value值为54张不同的扑克牌
        HashMap<Integer,String> cards = new HashMap<>();
        //定义ArrayList集合用于存放每张扑克牌的编号,编号顺序和hashmap编号顺序一致
        ArrayList<Integer> list = new ArrayList<>();

        //定义扑克牌数字不含大王和小王,按照扑克牌的大小顺序进行排列,方便输出时有序
        String[] pokerNum = {"2","A","K","Q","J","10","9","8","7","6","5","4","3"};
        //定义扑克牌的颜色,按照黑、红、梅、方的顺序进行排列
        String[] pokerColor = {"♥","♠","♣","♦"};
        //定义index变量用于存放每张扑克牌的标记,0和1用于存放大王和小王
        int index = 2;
        //双重增强for循环把下标值存入map的key值和ArrayList集合汇总,把颜色+数字存入map集合value值中
        for(String num : pokerNum){
            for(String color : pokerColor){
                cards.put(index,color + num);
                list.add(index);
                index++;
            }
        }

        //双重for循环遍历也可以
//        for(int i = 0;i < pokerNum.length;i++){
//            for(int j = 0;j < pokerColor.length;j++){
//                cards.put(index,pokerColor[j] + pokerNum[i]);
//                list.add(index);
//                index++;
//            }
//        }
        //存入大王和小王
        cards.put(0,"bigJoker");list.add(0);
        cards.put(1,"smallJoker");list.add(1);


        //洗牌,利用Collections工具类里面的shuffle方法对ArrayList集合进行随机排序
        Collections.shuffle(list);

        //给3个玩家分别创建一个集合用于存放自己的牌,底牌单独用集合存放
        ArrayList<Integer> play1 = new ArrayList<>();
        ArrayList<Integer> play2 = new ArrayList<>();
        ArrayList<Integer> play3 = new ArrayList<>();
        ArrayList<Integer> dipai = new ArrayList<>();
         //把顺序打乱后ArrayList集合进行发牌,此时只是发放每张牌对应的编码,而不是把HashMap里面实际的牌值发放给玩家
        for(int i = 0;i < list.size();i++){
            if(i < 3){//先抽取3张底牌
                dipai.add(list.get(i));
            }else if(i % 3 == 0){
                play1.add(list.get(i));
            }else if(i % 3 == 1){
                play2.add(list.get(i));
            }else if(i % 3 == 2){
                play3.add(list.get(i));
            }
        }

        //给每个玩家添加名字
        String[] playerName = {"玩家一","玩家二","玩家三"};

        //随机选地主,并把底牌添加到地主玩家的集合里面
        Random ran = new Random();
        int dizhu = ran.nextInt(3);
        if(dizhu == 0){
            play1.addAll(dipai);
            System.out.println("地主是:" + playerName[0]);
        }else if(dizhu == 1){
            play2.addAll(dipai);
            System.out.println("地主是:" + playerName[1]);
        }else if(dizhu == 2){
            play3.addAll(dipai);
            System.out.println("地主是:" + playerName[2]);
        }

        //对每个玩家底牌编码进行排序,编码值由小到大排序,当时存入ArrayList时,编码值越小,牌的值越大
        Collections.sort(play1);
        Collections.sort(play2);
        Collections.sort(play3);

        //调用查看牌方法
        System.out.print("底牌是:");
        queryPokey(dipai,cards);//底牌
        System.out.print(playerName[0] + ":");
        queryPokey(play1,cards);//玩家一
        System.out.print(playerName[1] + ":");
        queryPokey(play2,cards);//玩家二
        System.out.print(playerName[2] + ":");
        queryPokey(play3,cards);//玩家三

    }
    //根据每个玩家ArrayList集合里面每张牌的序号值作为HashMap集合里面的key值,通过key值查找value值,就得到了每个玩家的牌
    public static void queryPokey(ArrayList<Integer> player,HashMap<Integer,String> cards){
//        Set<Integer> set = cards.keySet();
//        Iterator<Integer> iterator = set.iterator();
        Iterator<Integer> it = player.iterator();
        while (it.hasNext()){
            int key = it.next();
            System.out.print(cards.get(key) + "\t");
        }
        System.out.println();
    }
}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值