模拟斗地主发牌

需求 :使用一个集合对象存储一副扑克牌,将所有扑克牌的顺序打乱,然后分发给用集合表示的三个玩家和底牌,并打印玩家和底牌的集合内容

步骤:

步骤:
1、─副扑克牌
将花色和数字分别进行组合,生成所有的普通牌手动添加“大王”、“小王”

1.1.创建数字数组:
String[]nums =
{“3”,“4”,“5”,“6”,“7”,“8”,“9”,“10”,“J”,“Q”,“K”,“A”,“2”};

1.2.创建花色数组:
String[] colors ={“方片”,“梅花”,“红桃”;“黑桃”};

1.3.将每一个花色分别和数字进行拼接
colors[i].concat(nums[]); (这里用循环嵌套)

2、洗牌
使用Collections工具类的shuffle()方法打乱牌的顺序

Collections.shuffle(list);

3、发牌
遍历牌堆,将每一张牌分发到三个玩家集合中留三张作为底牌

3.1定义4个集合,分别代表玩家和底牌

List<Integer> player1 = new ArrayList<>();
List<Integer> player2 = new ArrayList<>();
List<Integer> player3 = new ArrayList<>();
List<Integer> dipai = new ArrayList<>();

3.2具体的发牌动作,将索引和3取模,决定发给谁

3.3查看玩家,底牌编号

4.看牌(因为多个人需要重复下面步骤,所以可以直接写个看牌成员方法)
分别打印每个玩家集合的内容

4.1将玩家集合中的牌按自然顺序进行排序;

Collections.sort(List);

4.2打印玩家的牌

具体代码

import java.util.*;

public class SendPoker {
    public static void main(String[] args) {
        //买牌
        //1.1定义一个双列集合Map,键表示牌的编号,值表示具体的牌, 规则编号越小牌越小
        Map<Integer, String> pokers = new HashMap<>();
        //1.2定义一个单例集合,用来存储所有牌的编号
        List<Integer> list = new ArrayList<>();
        //1.3具体的买牌动作
        //普通牌,52
        /*pokers.put(0, "♠3");
        pokers.put(1, "♦3");
        pokers.put(2, "♣3");
        pokers.put(3, "♥3");*/

        //使用循环嵌套
        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 pucker = color + number;
                //System.out.println(pucker);
                //将牌的编号,具体的牌放入双列集合
                pokers.put(num, pucker);
                //将牌的编号放入单列集合
                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()
        Collections.shuffle(list);
        System.out.println("洗好牌,编号为:" + list);

        //3.发牌
        //3.1定义4个集合,分别代表玩家和底牌
        List<Integer> player1 = new ArrayList<>();
        List<Integer> player2 = new ArrayList<>();
        List<Integer> player3 = new ArrayList<>();
        List<Integer> dipai = new ArrayList<>();
        //3.2具体的发牌动作,将索引和3取模,决定发给谁
        for (int i = 0; i < list.size(); i++) {
            //获取编号
            Integer pokerNum = list.get(i);
            //System.out.println(pokerNum);

            //发牌
            if (i >= list.size()-3) {
                //底牌
                dipai.add(pokerNum);
            } else if (i % 3 ==0) {
                player1.add(pokerNum);
            } else if (i % 3 ==1) {
                player2.add(pokerNum);
            } else if (i % 3 ==2) {
                player3.add(pokerNum);
            }

        }

        //3.3查看玩家,底牌编号
        /*System.out.println("player1:" + player1);
        System.out.println("player2:" + player2);
        System.out.println("player3:" + player3);
        System.out.println("dipai:" + dipai);*/

        //4、看牌
        System.out.println("player1:    " + printPoker(player1,pokers));
        System.out.println("player2:    " + printPoker(player2,pokers));
        System.out.println("player3:    " + printPoker(player3,pokers));
        System.out.println("dipai  :    " + printPoker(dipai,pokers));



    }

    /*
            定义一个方法用来看牌
                方法名:printPoker
                参数列表:List<Integer> Map<Integer,String>
                返回值:String
         */
    public static String printPoker(List<Integer> nums, Map<Integer,String> pokers) {
        //1、对牌的序列升序
        Collections.sort(nums);
        StringBuilder sb = new StringBuilder();
        //2、遍历牌的集合获取到每一个编号,增强for
        for (Integer num : nums) {
            // num就是要查找牌的具体编号
            //根据编号去双列集合找对应的具体牌
            String poker = pokers.get(num);
            //将获取的牌进行拼接
            sb.append(poker + " ");

        }

        //将最后结果返回
        String str = sb.toString();
        return str.trim();//两边掉空格
    }

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值