模拟斗地主改良版

模拟斗地主发牌看牌.抢地主,如果三个玩家都不抢地主则重新来过.
*
斗地主模拟
 */
public class Poker {
    public static void main(String[] args) {
        //得到扑克
        Map<Integer, String> poker = getPoker2();
        //洗牌
        //创建扑克Map集合的键的Arraylist()集合(为了洗牌和后期发完牌的排序)
        ArrayList<Integer> keys = new ArrayList<>(poker.keySet());
        Collections.shuffle(keys);
        //发牌
        ArrayList<Integer> one = givePoker(keys, 1);
        ArrayList<Integer> two = givePoker(keys, 2);
        ArrayList<Integer> three = givePoker(keys, 3);
        ArrayList<Integer> dipai = givePoker(keys, 4);
        //看谁先抢地主
        int dizhukey= foundDizhu(keys);//地主的键
        int dizhuNumber = showDizhu(one, two, three,dizhukey);//得到地主的玩家编号
        //创建扫描器
        Scanner sc = new Scanner(System.in);
        //看牌,决定是否抢地主
        getDizhu(poker,one,two,three,dipai,dizhuNumber,sc);

    }
    //得到扑克
    public static Map<Integer,String> getPoker2(){
        //定义花色和点数数组
        String[] colors ={"♠","♥","♣","♦"};
        String[] numbers ={"2","A","K","Q","J","10","9","8","7","6","5","4","3"};
        //定义Map集合保存扑克,将扑克的牌面作为值,扑克的大小顺序作为键
        Map<Integer, String> poker = new HashMap<>();
        int index =0;//键
        poker.put(index++, "大王");
        poker.put(index++, "小王");
        for (int i = 0; i < numbers.length; i++) {//点数
            for (int j = 0; j < colors.length; j++) {//花色
                poker.put(index++, colors[j] + numbers[i]);
            }
        }
        return poker;
    }

    //定义方法用来将扑克发给三个玩家和留下底牌.参数类型为扑克键集合和玩家编号.返回值为:发好的对应的玩家牌的键集合
    public static ArrayList<Integer> givePoker(ArrayList<Integer> keys, int playerNumber) {
        //创建集合,用来保存所发的牌的键
        ArrayList<Integer> playerKeys = new ArrayList<>();
        if (playerNumber != 1&&playerNumber !=2&&playerNumber !=3&&playerNumber !=4){
            System.out.println("您输入的玩家号码非法,玩家编号只能是(1,2,3,4)");
            return null;
        }
        //遍历键集合将符合条件的键发给对应的玩家的集合中
        if (playerNumber == 4){//底牌
            playerKeys.add(keys.get(keys.size() - 1));
            playerKeys.add(keys.get(keys.size() - 2));
            playerKeys.add(keys.get(keys.size() - 3));
            
        }
        for (int i = 0; i < keys.size()-3; i++) {//发给玩家的牌(已经去掉底牌了)
            
                if (i % 3 == playerNumber - 1) {
                    playerKeys.add(keys.get(i));
                }
        }
        return playerKeys;
    }

    //定义方法将玩家的牌按照从大到小的顺序打印(模拟看牌),参数为:扑克集合,玩家的键集合,返回值空
    public static StringBuilder showPoker(Map<Integer, String> poker, ArrayList<Integer> playerKeys) {
        StringBuilder sb = new StringBuilder("[ ");
        //将玩家的键集合排序
        Collections.sort(playerKeys);
        //遍历键集合找到其对应的值(牌面)按规定格式拼接
        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;
    }

    //定义方法找到地主,参数为洗好的扑克的键,返回值为扑克键的集合除了三张底牌外的任意一个键
    public static int foundDizhu(ArrayList<Integer> pokerKeys) {
        //创建随机数范围0-50
        int dizhu = new Random().nextInt(51);
        return pokerKeys.get(dizhu);
    }

    //找到哪个玩家是地主并将其编号返回,参数为各个玩家的扑克键集合,返回值为玩家编号
    public static int showDizhu(ArrayList<Integer> one, ArrayList<Integer> two, ArrayList<Integer> three,int dizhuKey) {
        if (one.contains(dizhuKey)) {
            return 1;
        } else if (two.contains(dizhuKey)) {
            return 2;
        }else {
            return 3;
        }

    }

    //定义方法模拟是否抢地主,参数为扑克的Map集合,各个玩家的扑克键集合,扫描输入,地主编号.返回值为空
    public static void getDizhu(Map<Integer,String> poker,ArrayList<Integer> one, ArrayList<Integer> two, ArrayList<Integer> three,ArrayList<Integer> dipai, int dizhuNumber, Scanner scanner) {
        for (int i = 0; i < 3; i++) {//最多循环抢三次地主,都不抢则重来
            if ((i + dizhuNumber)%3 == 1) {
                System.out.println("请玩家一先决定是否抢地主(输入抢或不抢)");
                System.out.println(showPoker(poker, one));
                while (true) {
                    String str = scanner.next();
                    if (!str.equals("抢") && !str.equals("不抢")) {
                        System.out.println("您输入了非法字符,请重新输入");
                        scanner = new Scanner(System.in);
                        continue;
                    } else if (str.equals("抢")) {//如抢地主,则将底牌给该玩家,并显示所有玩家的牌
                        one.add(dipai.get(0));
                        one.add(dipai.get(1));
                        one.add(dipai.get(2));
                        System.out.println("玩家一的牌为:" + showPoker(poker, one));
                        System.out.println("玩家二的牌为:" + showPoker(poker, two));
                        System.out.println("玩家三的牌为:" + showPoker(poker, three));
                        return;
                    } else {
                        System.out.println("玩家一不抢");
                        break;
                    }
                }
            } else if ((i + dizhuNumber)%3 == 2) {
                System.out.println("请玩家二先决定是否抢地主(输入抢或不抢)");
                System.out.println(showPoker(poker, two));
                while (true) {
                    String str = scanner.next();
                    if (!str.equals("抢") && !str.equals("不抢")) {
                        System.out.println("您输入了非法字符,请重新输入");
                        scanner = new Scanner(System.in);
                        continue;
                    } else if (str.equals("抢")) {//如抢地主,则将底牌给该玩家,并显示所有玩家的牌
                        two.add(dipai.get(0));
                        two.add(dipai.get(1));
                        two.add(dipai.get(2));
                        System.out.println("玩家一的牌为:" + showPoker(poker, one));
                        System.out.println("玩家二的牌为:" + showPoker(poker, two));
                        System.out.println("玩家三的牌为:" + showPoker(poker, three));
                        return;
                    } else {
                        System.out.println("玩家二不抢");
                        break;
                    }


                }

            }else {
                System.out.println("请玩家三先决定是否抢地主(输入抢或不抢)");
                System.out.println(showPoker(poker, three));
                while (true) {
                    String str = scanner.next();
                    if (!str.equals("抢") && !str.equals("不抢")) {
                        System.out.println("您输入了非法字符,请重新输入");
                        scanner = new Scanner(System.in);
                        continue;
                    } else if (str.equals("抢")) {//如抢地主,则将底牌给该玩家,并显示所有玩家的牌
                        three.add(dipai.get(0));
                        three.add(dipai.get(1));
                        three.add(dipai.get(2));
                        System.out.println("玩家一的牌为:" + showPoker(poker, one));
                        System.out.println("玩家二的牌为:" + showPoker(poker, two));
                        System.out.println("玩家三的牌为:" + showPoker(poker, three));
                        return;
                    } else {
                        System.out.println("玩家三不抢");
                        break;
                    }


                }

            }
            if (i == 2) {
                System.out.println("都不抢地主,请重来!!!");
            }
        }
    }
}

最终的控制台打印效果为:

猜你喜欢

转载自blog.csdn.net/xilin6664/article/details/88924443