斗地主综合案例之有序版本

一.项目要实现的目标
54张牌分发下去。达到3个玩家,每个玩家17张牌,3张底牌,牌面有序。见如下图:
斗地主的玩家及底牌
二.需求分析
1.准备牌
实现:

  • 用集合number存储{“2”,“A”,“K”,“Q”,“J”,“10”,“9”,“8”,“7”,“6”,“5”,“4”,“3”}
  • 用集合color存储{红心,梅花,方块,黑桃}
  • 用两个集合来组装52张牌。52张牌加大王,小王构成 map集合
  • 用map去存储索引和牌
  • 用indexList存储map的索引
  • 2.洗牌
    *用Collections.shuffle(indexList)
  • 3.发牌
  • 根据indexList的索引来发牌
  • 索引i>=51 就当成底牌(3张) diPai
  • i%3==0 就给玩家1发牌 player1
  • i%3==1 就给玩家2发牌 player2
  • i%3==2 就给玩家3发牌 player3
  • 4.排序
  • 根据集合中的元素(即hashMap的索引值),按数值升序排序,如此扑克牌自然就按按照有序规则排序
  • 5.看牌
    根据底牌,玩家1,玩家2,玩家3集合里面存储的hashMap的索引值(键),从hashMap集合中找到对应的值,然后显示就行
    三,具体实现代码
package dou.di.com;
import java.util.*;
public class DouDiZhuTest {
    public static void main(String[] args) {
        //1.准备牌
        List<String> number = List.of("2", "A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3");
        List<String> color = List.of("♥", "♠", "♦", "♣");
        HashMap<Integer, String> map = new HashMap<>();
        //大王,小王,这两张特殊牌先存入map集合
        map.put(0, "大王");
        map.put(1, "小王");
        int index = 2;
        //组装剩下的52张牌
        for (String s : number) {
            for (String s1 : color) {
                String string = s1 + s;
                map.put(index, string);
                index++;
            }
        }
//        System.out.println(map);
        //用indexList存储map的索引
        ArrayList<Integer> indexList = new ArrayList<>();
        Set<Integer> keySet = map.keySet();
        for (Integer in : keySet) {
            indexList.add(in);
        }
//        System.out.println(indexList);
        //2.洗牌
        Collections.shuffle(indexList);
        //3.发牌
        ArrayList<Integer> diPai = new ArrayList<>();
        ArrayList<Integer> player1 = new ArrayList<>();
        ArrayList<Integer> player2 = new ArrayList<>();
        ArrayList<Integer> player3 = new ArrayList<>();
//                索引i>=51 就当成底牌(3张)   diPai
//                 i%3==0 就给玩家1发牌         player1
//                 i%3==1 就给玩家2发牌         player2
//                 i%3==2 就给玩家3发牌         player3
        for (int i = 0; i < indexList.size(); i++) {
            Integer integer = indexList.get(i);
            if (i >= 51) {
                diPai.add(integer);
            } else if (i % 3 == 0) {
                player1.add(integer);
            } else if (i % 3 == 1) {
                player2.add(integer);
            } else if (i % 3 == 2) {
                player3.add(integer);
            }
        }

        //4.排序
        Collections.sort(player1);
        Collections.sort(player2);
        Collections.sort(player3);
        Collections.sort(diPai);
        //5.看牌
        look("周杰伦", map, player1);
        look("李小龙", map, player2);
        look("王安石", map, player3);
        look("底牌", map, diPai);
    }
    //5.看牌的方法
    private static void look(String playName, HashMap<Integer, String> hashMap, ArrayList<Integer> integers) {
        System.out.print(playName + ":");
        for (Integer key : integers) {
            String value = hashMap.get(key);
            System.out.print(value + " ");
        }
        System.out.println();//显示了一个玩家的牌后,换行,显示下一个玩家的牌
    }

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无言月梧桐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值