斗地主发牌案例

我相信很多人玩过斗地主,所以对斗地主并不陌生,我这个案例是讲解斗地主的发牌机制,下一期讲解我将会做出一个斗地主的单机版(与人机对战),以后我可能会做出斗地主的联机版。

其实发牌机制很简单,只要会用HashMap和TreeMap这两个类就可以完成这个案例,HashMap相当于牌盒装了所有的牌,而TreeMap是玩家因为它有一个排序功能。

HashMap中的键是牌对应的排序大小,比如方块3是1,大王是54,方块3是值它对应的键是1。

如图所示是把牌装进牌盒的操作,并且把对应的数值装进了一个list集合中,然后将其顺序打乱,就可以进行发牌操作了,发牌操作无非就是将打乱数值的list集合中的值分发给三个玩家和一个只有三张牌的底牌,根据打乱的数值从牌盒中获取对应的牌,玩家获取到的牌就是打乱循序的牌。

如上图所示就是设置玩家和发牌的代码。

我最后定义了一个方法用于看到所有玩家的牌和确认地主是谁并且把底牌添加到地主的牌中。

如图上所示的执行结果这就是这个案例的全部了。

下面是全部代码

public class DouDiZhu {
    public static void main(String[] args) {
        HashMap<Integer, String> carton=new HashMap<>();
        List<Integer> list =new ArrayList<>();
        //四花色 方尖 ,梅花 ,红桃,黑桃
        String[] color={"♦","♣","♥","♠"};
        String[] numbers={"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
        int num=0;
        for (String n:numbers){
            for (String fc:color){
                num++;
                carton.put(num,n+fc);//数字加上花色
                list.add(num);
            }
        }
        for (int i=0;i<2;i++){
            num++;
            list.add(num);
            if (i == 0) {
                carton.put(num, "小王");
            } else {
                carton.put(num, "小王");
            }
        }
        //洗牌 将 牌打乱顺序
        Collections.shuffle(list);
        //设置三个玩家 和 一个底牌
        TreeMap<Integer,String> xxc=new TreeMap<>();
        TreeMap<Integer,String> gjh=new TreeMap<>();
        TreeMap<Integer,String> zml=new TreeMap<>();
        TreeMap<Integer,String> dipai=new TreeMap<>();

        for (int i=1;i<=list.size();i++){
            int poker=list.get(i-1);// 获取 牌的键的值 注意这里 根据1索引读取1值是从
           if(i>list.size()-3){
               //底牌
               dipai.put(poker,carton.get(poker));
           }else if (i%3==0){
               gjh.put(poker,carton.get(poker));
           }else if (i%3==1){
               xxc.put(poker,carton.get(poker));
           }else {
               zml.put(poker,carton.get(poker));
           }
        }
      //展示 底牌
        System.out.println("底牌是:"+dipai.values());
        // 展示玩家的牌并且指出谁是地主
        lookPoker("xxc",xxc,dipai);
        lookPoker("gjh",gjh,dipai);
        lookPoker("zml",zml,dipai);
    }
    public static void lookPoker(String name, TreeMap<Integer,String> arr, TreeMap<Integer,String> dipai){
        //这里看牌和 谁是 地主 一起输出
        Collection<String> GJH=arr.values();
        if (arr.containsValue("4♦")){ //如果有就添加底牌给她
            Set<Map.Entry<Integer,String>> entry=dipai.entrySet(); //同时获取键和值
            for (Map.Entry<Integer,String> all:entry){
                arr.put(all.getKey(),all.getValue());
            }
            System.out.println(name+"是地主"+"的牌"+":"+GJH);
        }else {
            System.out.println(name+"的牌"+":"+GJH); //不是就直接输出
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值