模拟斗地主发牌看牌.抢地主,如果三个玩家都不抢地主则重新来过. * 斗地主模拟 */ 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("都不抢地主,请重来!!!"); } } } }
最终的控制台打印效果为: