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