前段时间遇到这个问题,想了一些,也搜了一些,发现网上也只是零星讲了一些笼统思想,复杂的我也没看懂,便自己去尝试写了一些代码来处理这个问题。还是先说明一下适用场景,只是针对一副牌去掉大小王,规则是常见的四人跑得快游戏规则。大致流程,先分析整理手牌,再分析上家出牌牌型,然后对比自家手牌出牌,显示剩余手牌。只是实现这个精简的且有代表性的步骤。
1、整理手牌
获取一段字符串,整理并记录手牌
HashMap<String, Integer> cmpMap = new HashMap<String, Integer>();
// 存储牌大小的对比库,I代表10,A用14记录,2用15记录
cmpMap.put("A", 14);
cmpMap.put("2", 15);
cmpMap.put("3", 3);
cmpMap.put("4", 4);
cmpMap.put("5", 5);
cmpMap.put("6", 6);
cmpMap.put("7", 7);
cmpMap.put("8", 8);
cmpMap.put("9", 9);
cmpMap.put("I", 10);
cmpMap.put("J", 11);
cmpMap.put("Q", 12);
cmpMap.put("K", 13);
再用一个数组int[] myCard = new int[16];// 有效范围myCard[3]~myCard[15]
下标对应cmpMap的纸牌大小,该下标对应数组值是手牌的张数。
String temp;
int length = mypoker.length();//mypoker是输入手牌字符串
int weight;// 牌大小临时变量
for (int i = 0; i < length; i++) {
temp = mypoker.substring(i, i + 1);
if (cmpMap.containsKey(temp)) {
weight = cmpMap.get(temp);
myCard[weight]++;
} else {
System.out.println("ERROR");
return;
}
}
接下来是存储手牌单双三炸
//有效范围3~15,小标对应牌大小,值对应是否存在这样牌型
//至于为什么要区分开,是为后续出牌策略的妥协
boolean[] myCardType1 = new boolean[16];//存在一张牌
boolean[] myCardSingle = new boolean[16];//只是一张牌
boolean[] myCardType2 = new boolean[16];
boolean[] myCardDouble = new boolean[16];
boolean[] myCardType3 = new boolean[16];
boolean[] myCardTreble = new boolean[16];
boolean[] myCardType4 = new boolean[16];
for (int i = 3; i < 16; i++) {
if (myCard[i] < 0 || myCard[i] > 4) {
System.out.println("ERROR");
return;
}
switch (myCard[i]) {
case 4:
myCardType1[i] = true;
myCardType2[i] = true;
myCardType3[i] = true;
myCardType4[i] = true;
break;
case 3:
myCardType1[i] = true;
myCardType2[i] = true;
myCardType3[i] = true;
myCardTreble[i] = true;
break;
case 2:
myCardType1[i] = true;
myCardType2[i] = true;
myCardDouble[i] = true;