24点游戏是经典的纸牌益智游戏。
常见游戏规则:
从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏。
基本要求: 随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式,用擅长的语言(C/C++/Java或其他均可)实现程序解决问题。
1.程序风格良好(使用自定义注释模板)
2.列出表达式无重复。
package zuoye;
import java.util.Scanner;
/**
* 具体做法是:
* 1.先随机拿出2个数
* 2.先将这两个数进行+ - * /运算,得到的结果放在一个新的数组,再将这个数和第三个数进行运算
* 3.以此类推,运用递归运算,直到四个数运算结束
* 4.当四个数运算结束(即n = 1)时,判断结果是否是24,是返回"可以组成24",否则"不能组成24"
* @author
*
*/
public class TfPointGame {
private static int COUNT = 4; //抽取的扑克牌数量
private static double[] number = new double[COUNT]; //定义扑克牌的数组
private static String[] expressformula = new String[COUNT]; //定义表达式数组
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in); //从键盘输入
System.out.println("请输入1-13之间的"+COUNT+"个正整数");
for (int i = 0; i < COUNT; i++) { //连续输入1-13之间的4个数
number[i] = scanner.nextInt();
int x = (int)number[i];
expressformula[i] = String.valueOf(x);
}
if(checkCondition(COUNT))
System.out.println("可以组成24!");
else
System.out.println("不能组成24!");
}
/**
* 先对随机产生的两个数进行运算,这两个数计算的结果和第三个数组成两数计算,
* 以此类推,直到四个数经过运算组合成一个数(即n = 1)时,判断这个数是否等于24
* 若等于24,输出这四个数的运算,否则返回false
* @param n
* @return
*/
public static boolean checkCondition(int n){
//当递归到只有一个数时,判断是否满足等于24的条件
if(n == 1){
if(number[0] == 24){
/*
* 输出可以构成24的表达式
* substring(x) 是从字符串的的第x个字符截取
* substring(x,y)是从x到y前的位置停止
*/
System.out.println(expressformula[0].substring(1, expressformula[0].length()-1));
return true;
}
else
return false;
}
for (int i = 0; i < n - 1; i++) {
for(int j = i + 1; j < n; j++){
//首先对两个数进行运算,定义两个变量,和两个表达式
double num1 = number[i];
double num2 = number[j];
//两个表达式
String express1 = expressformula[i];
String express2 = expressformula[j];
number[j] = number[n-1];
expressformula[j] = expressformula[n-1];
//做加法运算
expressformula[i] = "("+express1+"+"+express2+")";
number[i] = num1+num2;
if(checkCondition(n-1))
return true;
/*减法运算:
* (1)num1-num2
* (2)num2-num1
*/
expressformula[i] = "("+express1+"-"+express2+")";
number[i] = num1-num2;
if(checkCondition(n-1))
return true;
expressformula[i] = "("+express2+"-"+express1+")";
number[i] = num2-num1;
if(checkCondition(n-1))
return true;
//乘法运算
expressformula[i] = "("+express1+"*"+express2+")";
number[i] = num1*num2;
if(checkCondition(n-1))
return true;
/*除法运算两种情况(分母不为0)
* (1)num1/num2
* (2)num2/num1
*/
//第一种
if(num2 != 0){//分母不为0
expressformula[i] = "("+express1+"/"+express2+")";
number[i] = num1/num2;
if(checkCondition(n-1))
return true;
}
//第二种
if(num1 != 0){//分母不为0
expressformula[i] = "("+express2+"/"+express1+")";
number[i] = num2/num1;
if(checkCondition(n-1))
return true;
}
number[i] = num1;
number[j] = num2;
expressformula[i] = express1;
expressformula[j] = express2;
}
}
return false;
}
}