目录
题目
24点游戏是经典的纸牌益智游戏。
常见游戏规则:
从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏。
基本要求: 随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式。
分析
- 首先生成四个随机数(1~13之间)
- 进行结果为24的表达式计算
第一步:计算出四个随机数的排列组合
第二步:每一组数字去进行排列组合,找到等于24的表达式
具体的思想是:使用三层循环控制运算的优先级,也就是括号的存放位置
第一次:将四个数字的其中两个数字进行运算,得到三个数字,存入长度为3的数组temp1之中(第一个括号的位置)
第二次:将三个数字的其中两个数字再次进行运算,得到两个数字,存入长度为2的数组temp2之中(第二个括号的位置)
第三次:将最后的两个数字进行运算,得出最终的结果,sum
3.计算所有表达式的数量(总共有四种情况)
第一种:当四张卡牌的数字完全相同,那么组合方式只有一种
第二种:当四张卡牌的数字有两个相同,其余不同,那么它的组合方式有96种
第三种:当四张卡牌的数字全都不同,那么就有256种
第四种:当四张卡牌两两相同,那么就有36种情况
第五种:当四张卡牌种三张相同,那么就有16种情况
代码实现
randomNumber:存放四个随机数
getExpression():拿到所有结果为24的表达式
scard:数字double化,方便后面的运算
private static ArrayList<String> getExpression(){
ArrayList<String> exp = new ArrayList<String>();
for(int i = 0;i < 4;i++){
for(int j = 0;j < 4;j++){
if(j == i){
continue;
}
for(int m = 0;m < 4;m++){
if(m == i || m == j){
continue;
}
for(int n = 0;n < 4;n++){
if(n == i || n == j || n == m){
continue;
}
temp[i] = randomNumber[0];
temp[j] = randomNumber[1];
temp[m] = randomNumber[2];
temp[n] = randomNumber[3];
for(int k = 0;k < 4;k++){
scard[k] = (double)temp[k]%13;
if(temp[k]%13 == 0){
scard[k] = 13;
}
}
exp = search();
if(isCorrect){
isCorrect = false;
return exp;
}
}
}
}
}
return null;
}
/**
* 4个数字进行排列组合,找到等于24的表达式
* @return
*/
private static ArrayList<String> search(){
ArrayList<String> exp = new ArrayList<String>();
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
for (int k = 0; k < 4; k++) {
/**
* 将前两个数字进行计算,并将计算结果及剩余数字保存到temp3中
* 此时缩短为3个数字
*/
for (int m = 0; m < 3; m++) {
if (scard[m + 1] == 0 && operator[i] == '/') {
break;
}
temp3[m] = calcute(scard[m], scard[m + 1], operator[i]);
temp3[(m + 1) % 3] = scard[(m + 2) % 4];
temp3[(m + 2) % 3] = scard[(m + 3) % 4];
/**
* 将前两个数字进行计算,并将计算结果及剩余数字保存到temp2中
* 此时缩短为2个数字
*/
for (int n = 0; n < 2; n++) {
if (temp3[n + 1] == 0 && operator[j] == '/') {
break;
}
temp2[n] = calcute(temp3[n], temp3[n + 1], operator[j]);
temp2[(n + 1) % 2] = temp3[(n + 2) % 3];
/**
* 将temp2中的两个数字进行计算,等到sum值
*/
if (temp2[1] == 0 && operator[k] == '/') {
break;
}
sum = calcute(temp2[0], temp2[1], operator[k]);
/**
* 进行排列组合运算
*/
if (sum == 24) {
isCorrect = true;
//expression存储表达式
String expression = "";
if (m == 0 && n == 0) {
expression = "((" + (int) scard[0] + operator[i] + (int) scard[1] + ")"
+ operator[j] + (int) scard[2] + ")" + operator[k] + (int) scard[3] + "="
+ (int) sum;
} else if (m == 0 && n == 1) {
expression = "(" + (int) scard[0] + operator[i] + (int) scard[1] + ")" + operator[k]
+ "(" + (int) scard[2] + operator[j] + (int) scard[3] + ")=" + (int) sum;
} else if (m == 1 && n == 0) {
expression = "(" + (int) scard[0] + operator[j] + "(" + (int) scard[1] + operator[i]
+ (int) scard[2] + "))" + operator[k] + (int) scard[3] + "=" + (int) sum;
} else if (m == 2 && n == 0) {
expression = "(" + (int) scard[0] + operator[j] + (int) scard[1] + ")" + operator[k]
+ "(" + (int) scard[2] + operator[i] + (int) scard[3] + ")=" + (int) sum;
} else if (m == 2 && n == 0) {
expression = (int) scard[0] + operator[k] + "(" + (int) scard[1] + operator[j] + "("
+ (int) scard[2] + operator[i] + (int) scard[3] + "))=" + (int) sum;
}
// System.out.println(expression);
exp.add(expression);
}
}
}
}
}
}
return exp;
}