简单用java集合模拟斗地主发牌操作

简易斗地主发牌(熟悉java集合的使用)

1、需求

按照斗地主规则,完成洗牌发牌的动作。

具体要求如下:

1、准备牌:组装54张扑克牌

2、洗牌:54张牌顺序打乱

3、发牌:三个玩家参与游戏,三个人交替摸牌,每人17张,最后三张留作底牌

4、看牌:查看三人各自手中的牌(按照牌的大小排序)、底牌

规则:手中扑克牌从大到小的摆放顺序:大王、小王、2、A、K、Q、J、10、9、8、7、6、5、4、3

2、实现思路

2.1、准备牌

完成数字与纸牌的对应关系

0 = 🃏  1 = 🂿
2 =2 3 =2 4 =2 5 =2 
6 =A 7 =A 8 =A 9 =A 
10 =K 11 =K 12 =K 13 =K 
14 =Q 15 =Q 16 =Q 17 =Q 
18 =J 19 =J 20 =J 21 =J 
22 =10 23 =10 24 =10 25 =10 
26 =9 27 =9 28 =9 29 =9 
30 =8 31 =8 32 =8 33 =8 
34 =7 35 =7 36 =7 37 =7 
38 =6 39 =6 40 =6 41 =6 
42 =5 43 =5 44 =5 45 =5 
46 =4 47 =4 48 =4 49 =4 
50 =3 51 =3 52 =3 53 =3 

使用双列Map(HashMap)集合,完成一个数字与字符纸牌的对应关系。

2.2、洗牌

通过数字完成洗牌发牌(Collection.shuffle(List list))

2.3、发牌

将每个人以及底牌设计为ArrayList< String>,将最后三张牌存于底牌,剩余牌通过对3取模依次发牌(发牌发的是编号),存放的过程中要求数字大小与斗地主规则的大小对应。将代表不同纸牌的数字配发给不同的玩家与底牌。

2.4、看牌

通过Map集合找到对应字符展示,通过牌的编号,去Map集合中查询对应的牌的编号,通过查询纸牌与数字的对应关系,由数字转成纸牌字符串再进行展示。把查询到的扑克牌存储到ArrayList< String>。

3、代码实现

package job.doudizhu;

import java.util.*;

public class Demo1 {
    //定义一个Map集合:存储扑克牌的序号和牌面值
    public static Map<Integer, String> pokerMap = new HashMap<>();
    public static void main(String[] args) {
        //定义一个List集合:存储扑克牌编号
        List<Integer> pokerNumber = new ArrayList<>();

        //准备牌
        //红心2、黑桃2、方片2、梅花2...
        int index = 0;//初始化扑克牌编号

        pokerNumber.add(index);//添加扑克牌编号
        pokerMap.put(index++, "大王");//添加扑克牌牌面值
        pokerNumber.add(index);
        pokerMap.put(index++, "小王");

        String[] color = {"♥", "♠", "♦", "♣"};//花色
        String[] numbers = {"2", "A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3"};//牌面值
        for(int i = 0; i < numbers.length; i++){
            for(int j = 0; j < color.length; j++){
                pokerNumber.add(index);
                pokerMap.put(index++, color[j]+numbers[i]);
            }
        }

        //洗牌(打乱扑克牌编号顺序)
        Collections.shuffle(pokerNumber);

        //发牌(发扑克牌编号)
        //定义玩家和底牌
        TreeSet<Integer> player1 = new TreeSet<>();
        TreeSet<Integer> player2 = new TreeSet<>();
        TreeSet<Integer> player3 = new TreeSet<>();
        TreeSet<Integer> aHand = new TreeSet<>();//底牌

        for (int i = 0; i < pokerNumber.size(); i++) {
            //判断是否是底牌
            if(i > 50){
                aHand.add(pokerNumber.get(i));
                continue;
            }

            if(i % 3 == 0){
                player1.add(pokerNumber.get(i));
            }else if(i % 3 == 1){
                player2.add(pokerNumber.get(i));
            }else{
                player3.add(pokerNumber.get(i));
            }
        }

        //看牌
        lookPoker("糖锅", player1);
        lookPoker("糖魅", player2);
        lookPoker("糖解", player3);
        lookPoker("底牌", aHand);
    }

    //看牌的方法实现
    public static void lookPoker(String name, TreeSet<Integer> player){
        System.out.printf(name + ":");
        for (Integer i : player) {
            System.out.printf(pokerMap.get(i) + " ");
        }
        System.out.println();
    }
}

运行结果(运行结果是随机的),大家可以自行尝试。

糖锅:大王 小王 ♥22AAKKQQJ1098664 
糖魅:♠22AAKKQJJ1010998753 
糖解:♦QJ1098877765544433 
底牌:♥653 
  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值