模拟斗地主发牌

java集合学完了适合做这个

import java.util.*;
/*
  需求: 模拟斗地主发牌
      步骤:
          1. 买牌.
          2. 洗牌.
          3. 发牌.
          4. 看牌.
*/
public class TestPoker {
    public static void main(String[] args) {
        //1. 买牌.
        //1.1 定义一个双列集合, 键: 表示牌的编号, 值: 表示具体的牌.  规则: 编号越小, 牌越小.
        Map<Integer, String> pokers = new HashMap<>();
        //1.2 定义一个单列集合, 用来存储所有牌的编号.
        List<Integer> list = new ArrayList<>();
        //1.3 具体的买牌动作.
        //普通牌, 52.加大小王
//        蠢笨办法
   /*  pokers.put(1,"3♦");
     pokers.put(2,"3♣");
     pokers.put(3,"3♥");
     pokers.put(4,"3♠");
        System.out.println(pokers);
    */
        //通过循环嵌套, 造 普通牌
        String[] colors = {"♦", "♣", "♥", "♠"};
        String[] numbers = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};
        int num = 0;
        for (String number : numbers) {
            for (String color : colors) {
                String poker = number + color;
                //将牌的编号, 具体的牌放到双列集合中.根据编号找牌
                pokers.put(num, poker);
                //将牌的编号放到单列集合中.
                list.add(num);
                num++;
            }
        }
        //大小王.
        //添加小王
        pokers.put(num, "小王");
//        让编号加一存下个数据
        list.add(num++);

        //添加大王
        pokers.put(num, "大王");
//        重复添加, 会用新值覆盖旧值, 并返回旧值.
        list.add(num);
        //打印牌就可以了.
        System.out.println("所有的牌: " + pokers);
        System.out.println("牌的编号:" + list);
        //2. 洗牌 shuffle(list)打乱编号
        Collections.shuffle(list);
        System.out.println("洗好牌后, 编号为: " + list);
        System.out.println("========================================");
        //3. 发牌.
        //3.1 定义4个集合, 分别表示3个玩家, 底牌.
        List<Integer> zhangSan = new ArrayList<>();
        List<Integer> LiSI = new ArrayList<>();
        List<Integer> WangMaZi = new ArrayList<>();
        List<Integer> diPai = new ArrayList<>();
        //3.2 具体的发牌动作, 将索引和3取模, 决定发给谁.
//处理编号第一张牌发给一,第二张给二,依次类推需要用到下标了
//        for (int i = 0; i < list.size(); i++) {
//            //获取编号
//            Integer pokerNumber = list.get(i);
//            if (i % 3 == 0) {
//                zhangSan.add(pokerNumber);
//            } else if (i % 3 == 1) {
//                LiSI.add(pokerNumber);
//            }
//            else if (i%3==2) {
//                WangMaZi.add(pokerNumber);
//            }
//            else {//牌发完了才想起底牌
//                diPai.add(pokerNumber);
//            }
//        }
        for (int i = 0; i < list.size(); i++) {
            //获取编号
            Integer pokerNumber = list.get(i);
            if (i >= list.size() - 3) {
                diPai.add(pokerNumber);
            } else if (i % 3 == 0) {
                zhangSan.add(pokerNumber);
            } else if (i % 3 == 1) {
                LiSI.add(pokerNumber);
            } else if (i % 3 == 2) {
                WangMaZi.add(pokerNumber);
            }
        }
//        3.3 查看玩家, 底牌的编号.
        System.out.println("张三" + zhangSan);
        System.out.println("李四" + LiSI);
        System.out.println("王麻子" + WangMaZi);
        System.out.println("底牌" + diPai);
        //4. 查看具体的牌
        System.out.println("----------------------------------");
        System.out.println("张三"+checkPoker(zhangSan,pokers));
        System.out.println("李四"+checkPoker(LiSI,pokers));
        System.out.println("王麻子"+checkPoker(WangMaZi,pokers));
        System.out.println("底牌"+checkPoker(diPai,pokers));
    }

    //
 /*
            4. 定义一个方法, 用来看牌
           方法名:   printPoker
           参数列表: List<Integer>, Map<Integer, String>
            返回值:  String
     */
    public static String checkPoker(List<Integer> player, Map<Integer, String> pokers) {
        //1. 对玩家牌的编号进行升序排列.
        Collections.sort(player);
//2. 遍历牌的编号集合, 获取到每一个编号.
        StringBuilder str = new StringBuilder();
        for (Integer Serialnumber : player) {
            String poker = pokers.get(Serialnumber);
            //4. 将获取到的牌进行拼接.
            str.append(poker + " ");
        }
        String playerPoker = str.toString();
        return playerPoker;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值