使用Java实现斗地主发牌逻辑(简单基础版)

大家好,我是垃圾佬,一个正在学Java的 “无业游民 ”,最近复习到了Map 集合,我觉得斗地主发牌这个案例来练习Map集合还是非常好的,话不多说先上图解

1、斗地主发牌 图解

 图解:

        1、首先定义扑克牌映射表,按编号的顺序从小到大依次是牌面的从大到小(即数字越小,扑克牌越大,后续进行排序会用到)Map集合中的Key作为每张牌面的编号,Value作为牌面(如:♥A )

        2、定义List集合,获取Map集合中所有的Key,因为每个Key就是对应的一张牌面,所以我们要对Key进行洗编号(洗编号就是洗牌)

        3、定义三个玩家集合,一个底牌集合,给玩家进行发牌(发牌就是发编号)发完牌之后,对每个玩家收到的牌进行从小到大排序

        4、根据玩家收到的编号进行转换,将编号转换为牌面进行展示(也就是看牌)

2、实现代码

package com.com.demo;

import java.util.*;

public class Game {
    public static void main(String[] args) {
        //1.定义牌面
        String[] pokerColor = "♥-♠-♦-♣".split("-");
        String[] pokerNum = "2-A-K-Q-J-10-9-8-7-6-5-4-3".split("-");

        //2.定义牌面映射表
        Map<Integer, String> pokerMap = new HashMap<>();
        int index = 0;
        pokerMap.put(index++, "大王");
        pokerMap.put(index++, "小王");
        for (String n : pokerNum) {
            for (String c : pokerColor) {
                pokerMap.put(index++, c + n);
            }
        }
//        System.out.println(pokerMap);

        //3.获取所有牌面编号
        List<Integer> pokerNumList = new ArrayList<>(pokerMap.keySet());

        //4.洗牌(洗编号)
        Collections.shuffle(pokerNumList);

        //5.发牌(发编号)
        //定义三个玩家
        List<Integer> userPokerNumList1 = new ArrayList<>();
        List<Integer> userPokerNumList2 = new ArrayList<>();
        List<Integer> userPokerNumList3 = new ArrayList<>();
        List<Integer> dipaiNumList = new ArrayList<>();
        for (int i = 0; i < pokerNumList.size(); i++) {
            Integer pNum = pokerNumList.get(i);
            if (i >= pokerNumList.size() - 3) {//底牌三张
                dipaiNumList.add(pNum);
            } else if (i % 3 == 0) {//如果 i 余 3 == 0 将牌发给第一个玩家
                userPokerNumList1.add(pNum);
            } else if (i % 3 == 1) {//如果 i 余 3 == 1 将牌发给第二个玩家
                userPokerNumList2.add(pNum);
            } else {//如果 i 余 3 == 2 将牌发给第三个玩家
                userPokerNumList3.add(pNum);
            }
        }

        //6.对玩家的牌面进行排序(底牌不用排序)
        Collections.sort(userPokerNumList1);
        Collections.sort(userPokerNumList2);
        Collections.sort(userPokerNumList3);
        
        //7.将编号转换为牌面展示
        String user1 = convertNumToPoker(userPokerNumList1, pokerMap);
        String user2 = convertNumToPoker(userPokerNumList2, pokerMap);
        String user3 = convertNumToPoker(userPokerNumList3, pokerMap);
        String dipai = convertNumToPoker(dipaiNumList, pokerMap);

        System.out.println("用户1:" + user1);
        System.out.println("用户2:" + user2);
        System.out.println("用户3:" + user3);
        System.out.println("底 牌:" + dipai);
    }

    //将编号转换为牌面
    public static String convertNumToPoker(List<Integer> pokerNumList, Map<Integer, String> pokerMap) {
        StringBuilder bld = new StringBuilder("[");
        for (int i = 0; i < pokerNumList.size(); i++) {
            bld.append(pokerMap.get(pokerNumList.get(i)));
            if (i < pokerNumList.size() - 1) {
                bld.append(",");
            } else {
                bld.append("]");
            }
        }
        return bld.toString();
    }
}

3、展示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值