为了账号安全,请及时绑定邮箱和手机立即绑定

模拟斗地主真人在线发牌

标签:
Java

模拟斗地主真人在线发牌

前言

要斗地主先得有牌吧,没牌斗个鸡毛,所以先让厂家生产一副扑克牌。然后呢,哥们三个今天想斗地主了,你得去超市买一副 崭新 的扑克牌吧。这样就可以进入玩耍阶段了,先得洗牌,后摸牌,在把最后三张牌压箱底,好了这样就开始展现技艺了.....

我们现在用java集合的知识模拟斗地主的发牌,和上述流程是一模一样的。

设计过程

  • 造一副扑克

    一副扑克有54张牌,有四种花色,从A到K,还有大小王。先定义一个nums集合来装扑克牌的数字,然后定义一个color集合装四种花色,保证它们的添加顺序选择ArrayList集合

    //用num表示扑克牌中的数字ArrayList<String> nums = new ArrayList<>();       Collections.addAll(nums,"A","2","3","4","5","6","7","8","9","10","J","Q","K");//用color表示扑克牌中的花色ArrayList<String> colors = new ArrayList<>();
    Collections.addAll(colors, "红桃","梅花","黑桃","方片");

    把花色和数字拼装在一起,需要一个Map来表示一个关系对,同时给每张牌定个序号,后面直接可以用序号操作牌

    //制造一副扑克牌(将数字和花色组合起来)Map<Integer,String> cards = new HashMap<>();int index = 0; ///给每个扑克牌定个序号indexfor(String number : nums){    for(String color : colors){
            cards.put(index++, color + number);
        }
    }
  • 买一副崭新的扑克牌

    新的扑克牌肯定是按照序号排好的,所以我们把序号装在一个集合中

    //买一副新的扑克牌来玩耍ArrayList<Integer> card = new ArrayList<>();for(int i = 0; i <= 53; i++){//初始化牌的序号
        card.add(i);
    }
  • 洗牌

    洗牌也就是把card集合中的所存储的序号打乱,集合的工具类Collections中有一个方法shuffle可以完成

    Collections.shuffle(card);
  • 发牌

    这时候肯定得有三个玩家啊,我们创建是三个玩家,玩家其实也就是扑克牌序号的一个引用,为了简单创建一个Integer类型的,另外,为了把牌到时候可以拍个序,这时候可以用到TreeSet集合存储,它默认自然排序。底牌也可以这样存储。

    TreeSet<Integer> player1 = new TreeSet<>();
    TreeSet<Integer> player2 = new TreeSet<>();
    TreeSet<Integer> player3 = new TreeSet<>();//拿出三张牌当做底牌TreeSet<Integer> itcards = new TreeSet<>();

    发牌算法就是用牌的序号模上3,等于0发给一个人,等于1发给另外一个人,把最后三张当做底牌

    for(int i = 0; i < card.size(); i++){    if(i >= card.size() - 3){//把后三张牌当做底牌
            itcards.add(card.get(i));
        }else if(i % 3 == 0){
            player1.add(i);
    
        }else if(i % 3 == 1){
            player2.add(card.get(i));
    
        }else{
            player3.add(card.get(i));
        }
    }
  • 展示牌

    我们可以看到,其实玩家和底牌也就是打乱的54个序号组成的,并且一个序号对应的是一张扑克牌,所以玩家其实就相当于是扑克牌Map中的key,而value就是扑克牌的名字了。所以遍历玩家这个TreeSet集合,找到Map中的key,根据key很容易找到value。

源代码

public class CardsGame {    public static void main(String[] args) {        //用num表示扑克牌中的数字
        ArrayList<String> nums = new ArrayList<>();
        Collections.addAll(nums,"A","2","3","4","5","6","7","8","9","10","J","Q","K");        
        //用color表示扑克牌中的花色
        ArrayList<String> colors = new ArrayList<>();
        Collections.addAll(colors, "红桃","梅花","黑桃","方片");        
        //制造一副扑克牌(将数字和花色组合起来)
        Map<Integer,String> cards = new HashMap<>();        int index = 0; ///给每个扑克牌定个序号index
        for(String number : nums){            for(String color : colors){
                cards.put(index++, color + number);
            }
        }        //再把大小王加上,一副完整的扑克就ok了
        cards.put(index++, "大王");
        cards.put(index++, "小王");        
        //买一副新的扑克牌来玩耍
        ArrayList<Integer> card = new ArrayList<>();        for(int i = 0; i <= 53; i++){//初始化牌的序号
            card.add(i);
        }        
        //愉快的玩耍
        //洗牌
        Collections.shuffle(card);

        TreeSet<Integer> player1 = new TreeSet<>();
        TreeSet<Integer> player2 = new TreeSet<>();
        TreeSet<Integer> player3 = new TreeSet<>();        //拿出三张牌当做底牌
        TreeSet<Integer> itcards = new TreeSet<>();        
        //发牌
        for(int i = 0; i < card.size(); i++){            if(i >= card.size() - 3){//把后三张牌当做底牌
                itcards.add(card.get(i));
            }else if(i % 3 == 0){
                player1.add(i);
                
            }else if(i % 3 == 1){
                player2.add(card.get(i));
                
            }else{
                player3.add(card.get(i));
            }
        }        
        //排序并打印每个人得到的牌
        print("张三",player1,cards);
        print("李四",player2,cards);
        print("王五",player3,cards);
        print("底牌",itcards,cards);
    }    private static void print(String name, TreeSet<Integer> player, Map<Integer, String> cards) {
        System.out.print(name + ": ");        //得到三个玩家的牌和底牌
        for(Integer index : player){
            String result = cards.get(index);
            System.out.print(result + " ");
        }
        System.out.println( );
    }
}

原文出处:https://www.cnblogs.com/tfper/p/9902548.html  

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消