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;
}
}