利用java编写扑克牌24点游戏
文件名称:利用java编写扑克牌24点游戏
编程语言:java
编译器:IntelliJ IDEA 2020.3.2 x64
完成日期:2021年5月8日
一、问题描述:
从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏。基本要求: 随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式,用擅长的语言(C/C++/Java或其他均可)实现程序解决问题。
基础要求:1.程序风格良好(使用自定义注释模板) 2.列出的表达式无重复
提高要求:用户初始生命值为一给定值(比如3),初始分数为0。随机生成4个代表扑克牌牌面的数字或字母,由用户输入包含这4个数字或字母的运算表达式(可包含括号),如果表达式计算结果为24则代表用户赢了此局。 1. 程序风格良好(使用自定义注释模板) 2.使用计时器要求用户在规定时间内输入表达式,如果规定时间内运算正确则加分,超时或运算错误则进入下一题并减少生命值(不扣分)。 3.所有成绩均可记录在TopList.txt文件中。
二、算法分析:
主要思路:取四张牌,只有4个数,所以可以通过穷举法列出所有情况下值等于24的表达式。即列出4个数字加减乘除的以及括号的各种可能性。通过random随机数对象产生4个范围在1-13之间的随机数,通过4个数字,4个运算符号和2对括号,列出所有符合条件的有效表达式。
三、概要设计:
1、主要结构设计
将整个程序分为两个部分:查看随机数及结果为24的表达式和用户输入表达式并开始游戏。一共设计两个类:play类和game类。
play类设计了相关提示语句开始游戏以及获取随机数并打印出符合结果的表达式的函数getdata()。
getdata()函数首先获取了四个随机数然后采用穷举法列出了结果可能为24的全部表达式。
public static void getdata() {
System.out.println("随机生成四个1-13内的整数");
Random random = new Random();//随机数
int x= random.nextInt(13) + 1;
int y = random.nextInt(13)+1;
int z = random.nextInt(13)+1;
int w = random.nextInt(13)+1;
System.out.println("这四个数分别为:"+x+","+y+","+z+","+w);
System.out.println("运算结果为24的表达式有:");
if(x*y-z+w==24)
System.out.println(x+"*"+y+"-"+z+"+"+w+"=24");
if ((x-y)*z*w==24)
System.out.println("("+x+"-"+y+")"+"*"+z+"*"+w+"=24");
if ((x*y)+(z*w)==24)
System.out.println("("+x+"*"+y+")+("+z+"*"+w+")"+"=24");
if ((x+y)*z*w==24)
System.out.println("("+x+"+"+y+")"+"*"+z+"*"+w+")"+"=24");
if (x*y*z*w==24)
System.out.println(x+"*"+y+"*"+z+"*"+w+"=24");
if ((x+y*z)*w==24)
System.out.println("("+x+"+"+y+"*"+z+")"+"*"+w+"=24");
if ((x*y-z)*w==24)
System.out.println("("+x+"*"+y+"-"+z+")"+"*"+w+"=24");
if ((x*y)+z+w==24)
System.out.println("("+x+"*"+y+")+"+z+"+"+w+"=24");
if ((x/y-z)*w==24)
System.out.println("("+x+"/"+y+"-"+z+")"+"*"+w+"=24");
if ((x-(y-z))*w==24)
System.out.println("("+x+"-"+"("+y+"-"+z+")"+")*"+w+"=24");
if (x-(y-z-w)==24)
System.out.println(x+"-"+"("+y+"-"+z+"-"+w+")"+"=24");
if (x+y-(z-w)==24)
System.out.println(x+"+"+y+"-"+"("+z+"-"+w+")"+"=24"+"\n");
if (x*(y/z-w)==24)
System.out.println(x+"*"+"("+y+"/"+z+"-"+w+")"+"=24");
if ((x-y*z)*w==24)
System.out.println("("+x+"-"+y+"*"+z+")"+"*"+w+"=24");
if (x*(y-z)+w==24)
System.out.println(x+"*"+"("+y+"-"+z+")"+"+"+w+"=24");
if (x+y+z/w==24)
System.out.println(x+"+"+y+"+"+z+"/"+w+"=24");
if ((x-y)*(z-w)==24)
System.out.println( "("+x+"-"+y+")*("+z+"-"+w+")=24");
if ((x+y)*z/w==24)
System.out.println("("+x+"+"+y+")*"+z+"/"+w+"=24");
if (x*y/(z-w)==24)
System.out.println(x+"*"+y+"/"+"("+z+"-"+w+")"+"=24");
if ((x+y)*(z+w)==24)
System.out.println("("+x+"+"+y+")*("+z+"+"+w+")=24");
if ((x-y)*z/w==24)
System.out.println("("+x+"-"+y+")*"+z+"/"+w+"=24");
if (x+(y+z)/w==24)
System.out.println(x+"+"+"("+y+"+"+z+")"+"/"+w+"=24");
if (x*y/(z+w)==24)
System.out.println(x+"*"+y+"/"+"("+z+"+"+w+")"+"=24");
if ((x+y)*z/w==24)
System.out.println("("+x+"+"+y+")*"+z+"/"+w+"=24");
if ((x*y+z)*w==24)
System.out.println("("+x+"*"+y+"+"+z+")"+"*"+w+"=24");
if ((x*y-z)/w==24)
System.out.println("("+x+"*"+y+"-"+z+")"+"/"+w+"=24");
if ((x/y+z)*w==24)
System.out.println("("+x+"/"+y+"+"+z+")"+"*"+w+"=24");
if ((x*y)/z/w==24)
System.out.println("("+x+"*"+y+")/"+z+"/"+w+"=24");
if (x+y+z-w==24)
System.out.println(x+"+"+y+"+"+z+"-"+w+"=24");
if (x-(y-z)+w==24)
System.out.println(x+"-"+"("+y+"-"+z+")"+"+"+w+"=24");
if (x/(y-z/w)==24)
System.out.println(x+"/"+"("+y+"-"+z+"/"+w+")"+"=24");
if (x+(y-z)*w==24)
System.out.println(x+"+"+"("+y+"-"+z+")*"+w+"=24");
if ((x+y+z)*w==24)
System.out.println("("+x+"+"+y+"+"+z+")*"+w+"=24");
if (x+y*z-w==24)
System.out.println(x+"+"+y+"*"+z+"-"+w+"=24");
if (x*y-z/w==24)
System.out.println(x+"*"+y+"-"+z+"/"+w+"=24");
if ((x+y)*z-w==24)
System.out.println("("+x+"+"+y+")"+"*"+z+"-"+w+"=24");
if ((x-y/z)*w==24)
System.out.println("("+x+"-"+y+"/"+z+")*"+w+"=24");
if (x*(y+z)+w==24)
System.out.println(x+"*"+"("+y+"+"+z+")"+"+"+w+"=24");
if ((x*y)+(z/w)==24)
System.out.println("("+x+"*"+y+")+("+z+"/"+w+")"+"=24");
if ((x*y)/z-w==24)
System.out.println("("+x+"*"+y+")/"+z+"-"+w+"=24");
if ((x+y/z)*w==24)
System.out.println("("+x+"+"+y+"/"+z+")*"+w+"=24");
if ((x*y*z)/w==24)
System.out.println("("+x+"*"+y+"*"+z+")/"+w+"=24");
if ((x+y*z)/w==24)
System.out.println("("+x+"+"+y+"*"+z+")/"+w+"=24");
if (x+(y*z)+w==24)
System.out.println(x+"+"+"("+y+"*"+z+")+"+w+"=24");
if (x-(y+z)*w==24)
System.out.println(x+"-("+y+"+"+z+")*"+w+"=24");
if (x-(y-z)*w==24)
System.out.println(x+"-("+y+"-"+z+")*"+w+"=24");
if ((x*y)-z-w==24)
System.out.println("("+x+"*"+y+")-"+z+"-"+w+"=24");
if (x+y/z+w==24)
System.out.println( x+"+"+y+"/"+z+"+"+w+"=24");
if ((x-y)*z-w==24)
System.out.println( "("+x+"-"+y+")*"+z+"-"+w+"=24");
if ((x+y)/z+w==24)
System.out.println( "("+x+"+"+y+"/"+z+"+"+w+"=24");
if ((x*y)+z-w==24)
System.out.println("("+x+"*"+y+")+"+z+"-"+w+"=24");
if ((x/y)+z+w==24)
System.out.println("("+x+"/"+y+")"+"+"+z+"+"+w+"=24");
if ((x*y)*z-w==24)
System.out.println("("+x+"*"+y+")*("+z+")-"+w+"=24");
if ((x*y+z)/w==24)
System.out.println("("+x+"*"+y+"+"+z+")/"+w+"=24");
if (x+y+z*w==24)
System.out.println(x+"+"+y+"+"+z+"*"+w+"=24");
if (x*(y-z)/w==24)
System.out.println(x+"*"+"("+y+"-"+z+")/"+w+"=24");
if (x/y*z+w==24)
System.out.println(x+"/"+y+"*"+z+"+"+w+"=24");
if (x+y*z*w==24)
System.out.println(x+"+"+y+"*"+z+"*"+w+"=24");
if (x+y+z+w==24)
System.out.println(x+"+"+y+"+"+z+"+"+w+"=24");
if ((x*y)/(z*w)==24)
System.out.println("("+x+"*"+y+")/("+z+"*"+w+")"+"=24");
if (x+(y+z)*w==24)
System.out.println(x+"+("+y+"+"+z+")*"+w+"=24");
if ((x-y)*z+w==24)
System.out.println("("+x+"-"+y+")"+"*"+z+"+"+w+"=24");
if ((x+y+z)/w==24)
System.out.println("("+x+"+"+y+"+"+z+")/"+w+"=24");
if ((x+y)*z+w==24)
System.out.println( "("+x+"+"+y+")*"+z+"+"+w+"=24");
if ((x*y)-(z-w)==24)
System.out.println("("+x+"*"+y+")-("+z+"-"+w+")"+"=24");
if ((x*y)-(z+w)==24)
System.out.println("("+x+"*"+y+")-("+z+"+"+w+")"+"=24");
if ((x-y-z)*w==24)
System.out.println("("+x+"-"+y+"-"+z+")*"+w+"=24");
if ((x*y)/z+w==24)
System.out.println("("+x+"*"+y+")/"+z+"+"+w+"=24");
if ((x+y-z)*w==24)
System.out.println("("+x+"+"+y+"-"+z+")*"+w+"=24");
if (x/(y/z-w)==24)
System.out.println(x+"/("+y+"/"+z+"-"+w+")=24");
if ((x*y)-(z*w)==24)
System.out.println("("+x+"*"+y+")-("+z+"*"+w+")"+"=24");
if(((x+y)*z)/w==24)
System.out.println("(("+x+y+")*"+z+")/"+w+"=24");
}
game类设计思路:使用currentTimeMillis()来获取开始和结束时间,并限定时间为30s,由此可以实现定时功能。而判断表达式是否正确,在java中使用Script引擎调用eval方法判断,具体思路如下:
始化生命值和分数,由系统给出四个数字,用户输入表达式,判断给出的答案中的数字和系统给出的数字是否相同,不同生命值减一。根据定时功能判断是否超时,如果超时生命值减一。通过script引擎的eval()方法判断表达式的值是否为24,如果正确并且时间小于30s,分数加一,若结果不是24则生命值减一。最后将成绩写入TopList.txt中。game类设置了生命值和分数以及游戏开始和结束时间共四个成员变量,四个成员方法,分别为start()、getdata()、result()、Write()。
public int life = 3; //初始生命值
public int score = 0; //初始化分数
public long startTime = System.currentTimeMillis(); //获取开始时间
public long endTime = System.currentTimeMillis(); //获取结束时间
start()方法是开始游戏的方法,主要是输出相关提示语句并调用其他方法启动游戏。
public void start() throws IOException{
while(life!=0){
int answer=result();
switch(answer) {
case -1:
System.out.println("表达式错误! 当前生命值为:"+life+" 分数为:"+score);
System.out.println("进入下一关");
break;
case -2:
System.out.println("输入超时! 当前生命值为:"+life+" 分数为:"+score);
System.out.println("进入下一关");
break;
case 0:
System.out.println("结果错误! 当前生命值为:"+life+" 分数为:"+score);
System.out.println("进入下一关");
break;
case 1:
System.out.println("回答正确,得分加1! 当前生命值为:"+life+" 分数为:"+score);
System.out.println("进入下一关");
break;
}
}
System.out.println("游戏结束,分数为:"+score); //循环结束即生命值为0时游戏结束
Write(score); //将成绩存入文件中
}
getdata()方法是用于数据获取,采用int类型数组存储生成的四个随机数。
public int[] getdata() {
int[] data = new int[4];
Random r = new Random();//随机生成四个数据存入数组中
data[0] = r.nextInt(13) + 1;
data[1] = r.nextInt(13) + 1;
data[2] = r.nextInt(13) + 1;
data[3] = r.nextInt(13) + 1;
System.out.println("四个随机数分别为:"+data[0]+","+data[1]+","+data[2]+","+data[3]);
return data;
}
result()方法实现用户根据系统生成的随机数进行表达式的输入,并根据结果以及是否超时进行计分。
public int result() {
int[] data = getdata();//获取给定的数据
System.out.println("请您输入表达式:");
Scanner sc = new Scanner(System.in); //用户输入表达式
//获取script,调用eval()方法来判断表达式是否正确
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine scriptEngine = scriptEngineManager.getEngineByName("nashorn");
String s1 = sc.next();
try {
String s2 = String.valueOf(scriptEngine.eval(s1));
for (int i = 0; i < data.length; i++)
if (!s1.contains(data[i] + "")) { //输入的表达式不正确
life--;
return -1;
}
if (s2.equals("24") && (endTime - startTime) / 1000.0 < 30) { //回答正确
score++;
return 1;
}
if ((endTime - startTime) / 1000.0 >= 30){ //超时
life--;
return -2;
}
else
life--;
} catch (ScriptException e) {
e.printStackTrace();
}
return 0;
}
Write()方法是将用户的得分写入TopList.txt中。
public void Write(int score) //成绩写入文本文件中
{
try {
FileWriter w = new FileWriter("TopList.txt",true);
w.write(score+"\r\n");
w.close();
}catch(IOException e) {
e.printStackTrace();
}
}
2、流程图
四、调试:
1、调试输入部分
2、调试输出部分
3、调试获取随机数部分
4、调试游戏部分,包括开始游戏、产生随机数、相关输入和输出等
五、测试:
1、结果显示:
当选择“1”功能时,查看结果为24的所有表达式
当选择“2”功能时,开始游戏
TopList.txt中游戏结束后的总成绩
六、总结
本次程序设计,主要分为两个环节,基础要求和提高要求。其中基础要求部分难点在于利用穷举法,通过random随机数对象产生的4个随机数,4个运算符号和2对括号,列出所有符合条件的有效表达式。这一部分量较大,刚开始由于思路混乱遗漏了许多可能,后查资料按照一定的方法列出了所有情况。而提高要求则难度较大,首先是要判断用户输入的表达式所得到的结果是否为24,这一部分在查阅资料后,通过script引擎的eval()方法去判断,简便了很多。其次是关于定时器,这里利用currentTimeMillis()来获取开始和结束时间,并限定时间为30s,由此实现定时。以及通过此次作业,我的文件读写能力有所增加,已经能够熟练地运用文件的打开和写入方式。也提高了对java中相关函数使用的熟练度。如有错误也欢迎大家进行指正。
最后附上本次程序的完整版代码:
package homework;
import java.io.IOException;
import java.util.Random;
import java.util.Scanner;
/**
* @author wangym
* @create 2021-05-07 18:24
* @Description 24点游戏
*/
public class play {
public static void main(String[] args) throws IOException {
Scanner scanner = new Scanner(System.in);
System.out.println("24点游戏开始!");
System.out.println("1.查看生成的随机数及结果为24的表达式:");
System.out.println("2.用户输入表达式并开始游戏:");
System.out.println("请做出您的选择:");
char c = scanner.next().charAt(0);
switch (c) {
case '1':
getdata();
break;
case '2':
game g1 = new game();
g1.start();
break;
default:
System.out.println("输入错误");
}
}
public static void getdata() {
System.out.println("随机生成四个1-13内的整数");
Random random = new Random();//随机数
int x= random.nextInt(13) + 1;
int y = random.nextInt(13)+1;
int z = random.nextInt(13)+1;
int w = random.nextInt(13)+1;
System.out.println("这四个数分别为:"+x+","+y+","+z+","+w);
System.out.println("运算结果为24的表达式有:");
if(x*y-z+w==24)
System.out.println(x+"*"+y+"-"+z+"+"+w+"=24");
if ((x-y)*z*w==24)
System.out.println("("+x+"-"+y+")"+"*"+z+"*"+w+"=24");
if ((x*y)+(z*w)==24)
System.out.println("("+x+"*"+y+")+("+z+"*"+w+")"+"=24");
if ((x+y)*z*w==24)
System.out.println("("+x+"+"+y+")"+"*"+z+"*"+w+")"+"=24");
if (x*y*z*w==24)
System.out.println(x+"*"+y+"*"+z+"*"+w+"=24");
if ((x+y*z)*w==24)
System.out.println("("+x+"+"+y+"*"+z+")"+"*"+w+"=24");
if ((x*y-z)*w==24)
System.out.println("("+x+"*"+y+"-"+z+")"+"*"+w+"=24");
if ((x*y)+z+w==24)
System.out.println("("+x+"*"+y+")+"+z+"+"+w+"=24");
if ((x/y-z)*w==24)
System.out.println("("+x+"/"+y+"-"+z+")"+"*"+w+"=24");
if ((x-(y-z))*w==24)
System.out.println("("+x+"-"+"("+y+"-"+z+")"+")*"+w+"=24");
if (x-(y-z-w)==24)
System.out.println(x+"-"+"("+y+"-"+z+"-"+w+")"+"=24");
if (x+y-(z-w)==24)
System.out.println(x+"+"+y+"-"+"("+z+"-"+w+")"+"=24"+"\n");
if (x*(y/z-w)==24)
System.out.println(x+"*"+"("+y+"/"+z+"-"+w+")"+"=24");
if ((x-y*z)*w==24)
System.out.println("("+x+"-"+y+"*"+z+")"+"*"+w+"=24");
if (x*(y-z)+w==24)
System.out.println(x+"*"+"("+y+"-"+z+")"+"+"+w+"=24");
if (x+y+z/w==24)
System.out.println(x+"+"+y+"+"+z+"/"+w+"=24");
if ((x-y)*(z-w)==24)
System.out.println( "("+x+"-"+y+")*("+z+"-"+w+")=24");
if ((x+y)*z/w==24)
System.out.println("("+x+"+"+y+")*"+z+"/"+w+"=24");
if (x*y/(z-w)==24)
System.out.println(x+"*"+y+"/"+"("+z+"-"+w+")"+"=24");
if ((x+y)*(z+w)==24)
System.out.println("("+x+"+"+y+")*("+z+"+"+w+")=24");
if ((x-y)*z/w==24)
System.out.println("("+x+"-"+y+")*"+z+"/"+w+"=24");
if (x+(y+z)/w==24)
System.out.println(x+"+"+"("+y+"+"+z+")"+"/"+w+"=24");
if (x*y/(z+w)==24)
System.out.println(x+"*"+y+"/"+"("+z+"+"+w+")"+"=24");
if ((x+y)*z/w==24)
System.out.println("("+x+"+"+y+")*"+z+"/"+w+"=24");
if ((x*y+z)*w==24)
System.out.println("("+x+"*"+y+"+"+z+")"+"*"+w+"=24");
if ((x*y-z)/w==24)
System.out.println("("+x+"*"+y+"-"+z+")"+"/"+w+"=24");
if ((x/y+z)*w==24)
System.out.println("("+x+"/"+y+"+"+z+")"+"*"+w+"=24");
if ((x*y)/z/w==24)
System.out.println("("+x+"*"+y+")/"+z+"/"+w+"=24");
if (x+y+z-w==24)
System.out.println(x+"+"+y+"+"+z+"-"+w+"=24");
if (x-(y-z)+w==24)
System.out.println(x+"-"+"("+y+"-"+z+")"+"+"+w+"=24");
if (x/(y-z/w)==24)
System.out.println(x+"/"+"("+y+"-"+z+"/"+w+")"+"=24");
if (x+(y-z)*w==24)
System.out.println(x+"+"+"("+y+"-"+z+")*"+w+"=24");
if ((x+y+z)*w==24)
System.out.println("("+x+"+"+y+"+"+z+")*"+w+"=24");
if (x+y*z-w==24)
System.out.println(x+"+"+y+"*"+z+"-"+w+"=24");
if (x*y-z/w==24)
System.out.println(x+"*"+y+"-"+z+"/"+w+"=24");
if ((x+y)*z-w==24)
System.out.println("("+x+"+"+y+")"+"*"+z+"-"+w+"=24");
if ((x-y/z)*w==24)
System.out.println("("+x+"-"+y+"/"+z+")*"+w+"=24");
if (x*(y+z)+w==24)
System.out.println(x+"*"+"("+y+"+"+z+")"+"+"+w+"=24");
if ((x*y)+(z/w)==24)
System.out.println("("+x+"*"+y+")+("+z+"/"+w+")"+"=24");
if ((x*y)/z-w==24)
System.out.println("("+x+"*"+y+")/"+z+"-"+w+"=24");
if ((x+y/z)*w==24)
System.out.println("("+x+"+"+y+"/"+z+")*"+w+"=24");
if ((x*y*z)/w==24)
System.out.println("("+x+"*"+y+"*"+z+")/"+w+"=24");
if ((x+y*z)/w==24)
System.out.println("("+x+"+"+y+"*"+z+")/"+w+"=24");
if (x+(y*z)+w==24)
System.out.println(x+"+"+"("+y+"*"+z+")+"+w+"=24");
if (x-(y+z)*w==24)
System.out.println(x+"-("+y+"+"+z+")*"+w+"=24");
if (x-(y-z)*w==24)
System.out.println(x+"-("+y+"-"+z+")*"+w+"=24");
if ((x*y)-z-w==24)
System.out.println("("+x+"*"+y+")-"+z+"-"+w+"=24");
if (x+y/z+w==24)
System.out.println( x+"+"+y+"/"+z+"+"+w+"=24");
if ((x-y)*z-w==24)
System.out.println( "("+x+"-"+y+")*"+z+"-"+w+"=24");
if ((x+y)/z+w==24)
System.out.println( "("+x+"+"+y+"/"+z+"+"+w+"=24");
if ((x*y)+z-w==24)
System.out.println("("+x+"*"+y+")+"+z+"-"+w+"=24");
if ((x/y)+z+w==24)
System.out.println("("+x+"/"+y+")"+"+"+z+"+"+w+"=24");
if ((x*y)*z-w==24)
System.out.println("("+x+"*"+y+")*("+z+")-"+w+"=24");
if ((x*y+z)/w==24)
System.out.println("("+x+"*"+y+"+"+z+")/"+w+"=24");
if (x+y+z*w==24)
System.out.println(x+"+"+y+"+"+z+"*"+w+"=24");
if (x*(y-z)/w==24)
System.out.println(x+"*"+"("+y+"-"+z+")/"+w+"=24");
if (x/y*z+w==24)
System.out.println(x+"/"+y+"*"+z+"+"+w+"=24");
if (x+y*z*w==24)
System.out.println(x+"+"+y+"*"+z+"*"+w+"=24");
if (x+y+z+w==24)
System.out.println(x+"+"+y+"+"+z+"+"+w+"=24");
if ((x*y)/(z*w)==24)
System.out.println("("+x+"*"+y+")/("+z+"*"+w+")"+"=24");
if (x+(y+z)*w==24)
System.out.println(x+"+("+y+"+"+z+")*"+w+"=24");
if ((x-y)*z+w==24)
System.out.println("("+x+"-"+y+")"+"*"+z+"+"+w+"=24");
if ((x+y+z)/w==24)
System.out.println("("+x+"+"+y+"+"+z+")/"+w+"=24");
if ((x+y)*z+w==24)
System.out.println( "("+x+"+"+y+")*"+z+"+"+w+"=24");
if ((x*y)-(z-w)==24)
System.out.println("("+x+"*"+y+")-("+z+"-"+w+")"+"=24");
if ((x*y)-(z+w)==24)
System.out.println("("+x+"*"+y+")-("+z+"+"+w+")"+"=24");
if ((x-y-z)*w==24)
System.out.println("("+x+"-"+y+"-"+z+")*"+w+"=24");
if ((x*y)/z+w==24)
System.out.println("("+x+"*"+y+")/"+z+"+"+w+"=24");
if ((x+y-z)*w==24)
System.out.println("("+x+"+"+y+"-"+z+")*"+w+"=24");
if (x/(y/z-w)==24)
System.out.println(x+"/("+y+"/"+z+"-"+w+")=24");
if ((x*y)-(z*w)==24)
System.out.println("("+x+"*"+y+")-("+z+"*"+w+")"+"=24");
if(((x+y)*z)/w==24)
System.out.println("(("+x+y+")*"+z+")/"+w+"=24");
}
}
package homework;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Random;
import java.util.Scanner;
/**
* @author wangym
* @create 2021-05-07 17:47
* @Description
*/
public class game {
public int life = 3; //初始生命值
public int score = 0; //初始化分数
public long startTime = System.currentTimeMillis(); //获取开始时间
public long endTime = System.currentTimeMillis(); //获取结束时间
public void start() throws IOException{
while(life!=0){
int answer=result();
switch(answer) {
case -1:
System.out.println("表达式错误! 当前生命值为:"+life+" 分数为:"+score);
System.out.println("进入下一关");
break;
case -2:
System.out.println("输入超时! 当前生命值为:"+life+" 分数为:"+score);
System.out.println("进入下一关");
break;
case 0:
System.out.println("结果错误! 当前生命值为:"+life+" 分数为:"+score);
System.out.println("进入下一关");
break;
case 1:
System.out.println("回答正确,得分加1! 当前生命值为:"+life+" 分数为:"+score);
System.out.println("进入下一关");
break;
}
}
System.out.println("游戏结束,分数为:"+score); //循环结束即生命值为0时游戏结束
Write(score); //将成绩存入文件中
}
public int[] getdata() {
int[] data = new int[4];
Random r = new Random();//随机生成四个数据存入数组中
data[0] = r.nextInt(13) + 1;
data[1] = r.nextInt(13) + 1;
data[2] = r.nextInt(13) + 1;
data[3] = r.nextInt(13) + 1;
System.out.println("四个随机数分别为:"+data[0]+","+data[1]+","+data[2]+","+data[3]);
return data;
}
public int result() {
int[] data = getdata();//获取给定的数据
System.out.println("请您输入表达式:");
Scanner sc = new Scanner(System.in); //用户输入表达式
//获取script,调用eval()方法来判断表达式是否正确
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine scriptEngine = scriptEngineManager.getEngineByName("nashorn");
String s1 = sc.next();
try {
String s2 = String.valueOf(scriptEngine.eval(s1));
for (int i = 0; i < data.length; i++)
if (!s1.contains(data[i] + "")) { //输入的表达式不正确
life--;
return -1;
}
if (s2.equals("24") && (endTime - startTime) / 1000.0 < 30) { //回答正确
score++;
return 1;
}
if ((endTime - startTime) / 1000.0 >= 30){ //超时
life--;
return -2;
}
else
life--;
} catch (ScriptException e) {
e.printStackTrace();
}
return 0;
}
public void Write(int score) //成绩写入文本文件中
{
try {
FileWriter w = new FileWriter("TopList.txt",true);
w.write(score+"\r\n");
w.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}