- 取出4张扑克牌,其中可能包含1-10、J、Q、K四种牌面;
- 对玩家来说,可以自由任意(+-*/)组合这4张扑克牌,使其结果为24即可;
- 玩家须进行计算,如果没有回答正确会提示很抱歉,答案错误。如果回答正确会提示恭喜你,答案正确!
import java.util.*;
public class Game24 {
public static void main(String[] args) {
// 生成随机的四个数字
List<Integer> numbers = generateNumbers();
// 输出随机生成的数字
System.out.println("随机生成的四个数字为:" + numbers);
// 获取用户输入的算式
Scanner scanner = new Scanner(System.in);
System.out.print("请输入四个数字的算式,使用+、-、*、/运算符:");
String expression = scanner.nextLine();
// 检验用户输入的算式结果是否为24
if (calculate(expression, numbers) == 24) {
System.out.println("恭喜你,答案正确!");
} else {
System.out.println("很抱歉,答案错误。");
}
}
// 生成随机的四个数字
private static List<Integer> generateNumbers() {
List<Integer> numbers = new ArrayList<>();
Random random = new Random();
for (int i = 0; i < 4; i++) {
int number = random.nextInt(9) + 1;
numbers.add(number);
}
return numbers;
}
// 计算算式的结果
private static double calculate(String expression, List<Integer> numbers) {
// 替换J、Q、K为1
expression = expression.replaceAll("J", "1")
.replaceAll("Q", "1")
.replaceAll("K", "1");
expression = expression.replaceAll(" ", "");
for (int i = 0; i < numbers.size(); i++) {
expression = expression.replaceAll(String.valueOf(i + 1), String.valueOf(numbers.get(i)));
}
return eval(expression);
}
// 解析并计算表达式的结果
private static double eval(final String str) {
// 代码略,与之前提供的代码一致
return new Object() {
int pos = -1;
int ch;
void nextChar() {
ch = (++pos < str.length()) ? str.charAt(pos) : -1;
}
boolean eat(int charToEat) {
while (ch == ' ') nextChar();
if (ch == charToEat) {
nextChar();
return true;
}
return false;
}
double parse() {
nextChar();
double x = parseExpression();
if (pos < str.length()) throw new RuntimeException("Unexpected: " + (char) ch);
return x;
}
double parseExpression() {
double x = parseTerm();
for (;;) {
if (eat('+')) x += parseTerm(); // addition
else if (eat('-')) x -= parseTerm(); // subtraction
else return x;
}
}
double parseTerm() {
double x = parseFactor();
for (;;) {
if (eat('*')) x *= parseFactor(); // multiplication
else if (eat('/')) x /= parseFactor(); // division
else return x;
}
}
double parseFactor() {
if (eat('+')) return parseFactor(); // unary plus
if (eat('-')) return -parseFactor(); // unary minus
double x;
int startPos = this.pos;
if (eat('(')) { // parentheses
x = parseExpression();
eat(')');
} else if ((ch >= '0' && ch <= '9') || ch == '.') { // numbers
while ((ch >= '0' && ch <= '9') || ch == '.') nextChar();
x = Double.parseDouble(str.substring(startPos, this.pos));
} else {
throw new RuntimeException("Unexpected: " + (char)ch);
}
return x;
}
}.parse();
}
}