模拟斗地主发牌

模拟斗地主发牌

具体步骤

  1. 买牌
  2. 洗牌
  3. 发牌
  4. 看牌
注意点
  1. 通过循环嵌套造牌
  2. 大王为最后一张牌,所以num不需要自增
  3. 利用Collections.shuffle()方法洗牌,洗的是牌的编号
  4. 先把底牌发出,其他人的牌通过%3的余数发给其他人
  5. 创建一个printPoker()方法打印发出来的牌
  6. 通过Collections.sort()对每个人的牌进行排序
  7. 用StringBuilder装牌,用toString()方法拼接牌
整体代码
import java.util.*;

public class SendPokers {
    public static void main(String[] args) {
        //1.买牌
        //1.1定义一个双列集合, 键:表示牌的编号  值:表示具体的牌  规则:编号越小,牌越小
        Map<Integer, String> pokers = new HashMap<>();
        //1.2定义一个单列集合,用来存储所有牌的编号
        List<Integer> list = new ArrayList<>();
        //1.3具体的买牌动作
        String[] colors = {"♠","♥","♣","♦"};
        String[] numbers = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
        int num = 0;  //表示牌的编号
        //通过循环嵌套 造普通牌,52
        for (String number : numbers) {     //外循环,获取所有的点数
            for (String color : colors) {   //内循环,获取所有的花色
                String poker = color + number;
                //将牌的编号还要具体的牌放到双列集合中
                pokers.put(num,poker);
                //将牌的编号放到单列集合中
                list.add(num);
                //没添加一张牌,编号要自增1
                num++;
            }
        }
        //大小王
        //添加小王
        pokers.put(num, "小王");
        list.add(num++); //先添加后自增

        //添加大王
        pokers.put(num, "大王");
        list.add(num);  //最后一牌不需要自增

        //打印牌就可以了
//        System.out.println("所有的牌:" + pokers);
//        System.out.println("牌的编号:" + list);

        //2.洗牌
        Collections.shuffle(list);
//        System.out.println("洗好牌后,编号为:" + list);

        //3.发牌
        //3.1 定义4个集合,分别表示三个玩家,底牌
        List<Integer> JustinBieber = new ArrayList<>();
        List<Integer> TimDuncan = new ArrayList<>();
        List<Integer> Mashiwei = new ArrayList<>();
        List<Integer> dipai = new ArrayList<>();
        //3.2具体的发牌动作,将索引和三取模,决定发给谁
        for (int i = 0; i < list.size(); i++) {
            //获取编号
            Integer pokerNum = list.get(i);
            //
            if (i >= list.size() - 3){
                //底牌
                dipai.add(pokerNum);
            } else if (i % 3 == 0){
                JustinBieber.add(pokerNum);
            }else if (i % 3 == 1){
                TimDuncan.add(pokerNum);
            }else if (i % 3 == 2){
                Mashiwei.add(pokerNum);
            }
        }
//        //3.3 查看玩家,底牌编号
//        System.out.println("JustinBieber:" +JustinBieber);
//        System.out.println("TimDuncan:" +TimDuncan);
//        System.out.println("Mashiwei:" +Mashiwei);
//        System.out.println("dipai:" +dipai);

        System.out.println("-----------------");
        System.out.println("比伯:" + printPoker(JustinBieber,pokers));
        System.out.println("Tim:" + printPoker(TimDuncan,pokers));
        System.out.println("马思维:" + printPoker(Mashiwei,pokers));
        System.out.println("底牌:" + printPoker(dipai,pokers));

    }

    /*
      4.定义一个方法用来看牌
        方法名:printPoker
        参数列表:List<Integer>, Map<Integer,String>
        返回值:String
     */

    public static String printPoker(List<Integer> nums, Map<Integer,String> pokers){
        //1.对牌的编号进行升序排练
        Collections.sort(nums);
        //2.遍历牌的编号集合,获取到每一个编号
        StringBuilder sb = new StringBuilder();
        for (Integer num : nums) {
            //num就是要查找的具体牌的 编号

            //3.根据编号去双列集合中查找该编号对应的具体的牌
            String poker = pokers.get(num);

            //4.将获取到的牌进行拼接
            sb.append(poker + " ");
        }
        //5.将最后拼接的结果返回即可
        String str = sb.toString();
        return str.trim();  //删除两端空格
    }
}
运行结果

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值