斗地主游戏模拟(自创代码分享,欢迎批评指正)

import java.util.*;

/*
  模拟斗地主
 */
public class PokerGameHigher {
    public static void main(String[] args) {
        //准备扑克
        Map<Integer, String> poker = getPoker();
        //1,创建扑克集合的键的集合
        ArrayList<Integer> keys = new ArrayList<>(poker.keySet());
        //洗牌,就是将扑克的键的list集合顺序打乱
        Collections.shuffle(keys);
        //发牌,就是将扑克的键的集合中的元素分给玩家和底牌
        ArrayList<Integer> oneKeys = givePoker(keys, 1);//第一个玩家的扑克键的集合
        ArrayList<Integer> twoKeys = givePoker(keys, 2);//第一个玩家的扑克键的集合
        ArrayList<Integer> threeKeys = givePoker(keys, 3);//第一个玩家的扑克键的集合
        ArrayList<Integer> dipaiKeys = givePoker(keys, 4);//第一个玩家的扑克键的集合
        /*抢地主.先生成一张随机的地主牌,找到这张牌所在的玩家首先询问此玩家是否抢地主,是就将底牌给他否则就依次顺延.
            直到3个玩家都不抢则重新来过*/
        int dizhuKeyIndex = new Random().nextInt(keys.size()-3);//地主牌在洗好的扑克键的集合里面(三张底牌除外)的索引
        int dizhuKey = keys.get(dizhuKeyIndex);//地主牌的键
        int dizhuNumber = 0;//地主的编号
        if (oneKeys.contains(dizhuKey)){
            dizhuNumber =1;
        }else if(twoKeys.contains(dizhuKey)){
            dizhuNumber =2;
        }else {
            dizhuNumber =3;
        }
        //创建扫描输入保存玩家是否要地主的字符串
        Scanner sc = new Scanner(System.in);
        for (int i = 0; i < 3; i++) {
            if ((dizhuNumber +i)%3 == 1){
                System.out.println("玩家一请看牌"+showPoker(poker, oneKeys));
                System.out.println("请玩家一输入(要)或是(不要)地主:");
                if (sc.next().equals("要")){
                    oneKeys.add(dipaiKeys.get(0));
                    oneKeys.add(dipaiKeys.get(1));
                    oneKeys.add(dipaiKeys.get(2));
                    System.out.println("玩家一请看牌"+showPoker(poker, oneKeys));
                    System.out.println("玩家二请看牌"+showPoker(poker, twoKeys));
                    System.out.println("玩家三请看牌"+showPoker(poker, threeKeys));
                     break;
                }
            }
            if ((dizhuNumber +i)%3  == 2){
                System.out.println("玩家二请看牌"+showPoker(poker, twoKeys));
                System.out.println("请玩家二输入(要)或是(不要)地主:");
                if (sc.next().equals("要")){
                    twoKeys.add(dipaiKeys.get(0));
                    twoKeys.add(dipaiKeys.get(1));
                    twoKeys.add(dipaiKeys.get(2));
                    System.out.println("玩家一请看牌"+showPoker(poker, oneKeys));
                    System.out.println("玩家二请看牌"+showPoker(poker, twoKeys));
                    System.out.println("玩家三请看牌"+showPoker(poker, threeKeys));
                    break;
                }
            }
            if ((dizhuNumber +i)%3  == 0){
                System.out.println("玩家三请看牌"+showPoker(poker, threeKeys));
                System.out.println("请玩家三输入(要)或是(不要)地主:");
                if (sc.next().equals("要")){
                    threeKeys.add(dipaiKeys.get(0));
                    threeKeys.add(dipaiKeys.get(1));
                    threeKeys.add(dipaiKeys.get(2));
                    System.out.println("玩家一请看牌"+showPoker(poker, oneKeys));
                    System.out.println("玩家二请看牌"+showPoker(poker, twoKeys));
                    System.out.println("玩家三请看牌"+showPoker(poker, threeKeys));
                    break;
                }
            }

            if (i == 2){
                System.out.println("无人抢地主,请重新来过~~~");
            }
        }

        //看牌.先打印地主牌所在的玩家的牌,此玩家不要则打印下一玩家的牌.如果此玩家要地主则将底牌分给此玩家,再将所有玩家的牌面打印
    }
    //定义方法准备扑克.参数为空,返回值为扑克的Map集合
    public static Map<Integer,String> getPoker(){
        String[] colors = {"♠","♥","♣","♦"};
        String[] numbers = {"2","A","K","Q","J","10","9","8","7","6","5","4","3"};
        //创建Map集合
        Map<Integer, String> pokerMap = new HashMap<>();
        //给Map集合添加键值对对象
        int index =0;//定义变量作为集合的键
        pokerMap.put(index++, "大王");
        pokerMap.put(index++, "小王");
        for (int i = 0; i < numbers.length; i++) {
            for (int j = 0; j <colors.length ; j++) {
                pokerMap.put(index++, colors[j] + numbers[i]);

            }

        }
        return pokerMap;
    }

    //定义方法发牌,就是将扑克的键的集合中的元素分给玩家和底牌.参数为扑克键的集合和玩家的号码即1,2,3和底牌4.返回值为分到的扑克的键的集合
    public static ArrayList<Integer> givePoker(ArrayList<Integer> pokerKeys, int playerNumber) {
        //创建集合保存分到的扑克的键
        ArrayList<Integer> playerKeys = new ArrayList<>();
        for (int i = 0; i < pokerKeys.size(); i++) {
            //如果号码是1就是给第一个玩家发牌
            if (playerNumber == 1 && i % 3 == 0 && i<pokerKeys.size()-3){
                playerKeys.add(pokerKeys.get(i));
            }
            if (playerNumber == 2 && i % 3 == 1 && i<pokerKeys.size()-3){
                playerKeys.add(pokerKeys.get(i));
            }
            if (playerNumber == 3 && i % 3 == 2 && i<pokerKeys.size()-3){
                playerKeys.add(pokerKeys.get(i));
            }
            if (playerNumber == 4 && i >= pokerKeys.size() -3 ){
                playerKeys.add(pokerKeys.get(i));
            }
        }
        return playerKeys;
    }

    //定义方法看牌,参数是扑克的Map集合和玩家的键集合.返回值为拼接好的玩家牌面值的StringBuilder
    public static StringBuilder showPoker(Map<Integer, String> poker, ArrayList<Integer> playerKeys) {
        //先给玩家键集合中的元素排序
        Collections.sort(playerKeys);
        //创建StringBuildet对象
        StringBuilder sb = new StringBuilder("[ ");
        //变量集合拼接StringBuilder
        for (int i = 0; i < playerKeys.size(); i++) {
            if (i < playerKeys.size() - 1) {
                sb.append(poker.get(playerKeys.get(i))+" ,");
            }else {
                sb.append(poker.get(playerKeys.get(i))+" ]");
            }
        }
        return sb;
    }
}

猜你喜欢

转载自blog.csdn.net/xilin6664/article/details/88839160
今日推荐