要求:用户初始生命值为一给定值(比如3),初始分数为0。随机生成4个代表扑克牌牌面的数字或字母,由用户输入包含这4个数字或字母的运算表达式(可
1. 程序风格良好(使用自定义注释模板)
2.使用计时器要求用户在规定时间内输入表达式,如果规定时间内运算正确则加分,超时或运算错误则进入下一题并减少生命值(不扣分)。
3.所有成绩均可记录在TopList.txt文件中。
包含括号),如果表达式计算结果为24则代表用户赢了此局。
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;
/*扑克中每次取出4张牌。使用加减乘除,(其中,J代表11,Q代表12,K代表13,A代表1),
* 按照要求编程解决24点游戏。
* 基本要求: 随机生成4个代表扑克牌牌面的数字字母,
* 程序自动列出所有可能算出24的表达式,用擅长的语言(C/C++/Java或其他均可)实现程序解决问题。
*24 点游戏 玩家有三条命 每4张牌有1分钟时间 来写出算式 或者写Null代表无法得出 A-1 J-11 Q-12 K-14*/
/*
*@author kxd
*此程序核心算法,采用ArrayList来做容器 递归 math类 做计算
* 由于核心算法会很频繁的使用递归所以本人逻辑思维被搞得有点乱
* 程序中有一小亮点 静态getRandomNumber函数 是本人吧Random 函数集成 编写成了一个很方便可随意改变生成范围的函数
*
* */
public class Demo1 {
private String deal (){//发牌函数
String cards=null;
for(int i=0;i<3;i++) {
int card =getRandomNumber(1,13);//调用getRandomNumber函数
if(i==0) {
if(card==1) {
cards ="A ";
}if(card==11) {
cards ="J ";
}if(card==12) {
cards ="Q ";
}if(card==13) {
cards ="K ";
}if(card>=2&card<=10) {
cards=Integer.toString(card)+" ";
}
}
if(i==3) {//最后
if(card==1) {
cards = cards+"A";
}if(card==11) {
cards = cards+"J";
}if(card==12) {
cards = cards+"Q";
}if(card==13) {
cards = cards+"K";
}if(card>=2&card<=10) {
cards=cards+Integer.toString(card);
}
}
else {
if(card==1) {
cards = cards+"A ";
}if(card==11) {
cards = cards+"J ";
}if(card==12) {
cards = cards+"Q ";
}if(card==13) {
cards = cards+"K ";
}if(card>=2&card<=10) {
cards=cards+Integer.toString(card)+" ";
}
}
}
System.out.println(cards);
return cards ;
}
public static int getRandomNumber(int start,int end) {//获取随机数函数
return (int)(Math.random()*(end-start+1)+start);//数学得学好 ,程序没烦恼
}
//转换牌为数字
private double transform(String s){
if(s.equals("A")){
return 1;
}
if(s.equals("J")){
return 11;
}
if(s.equals("Q")){
return 12;
}
if(s.equals("K")){
return 13;
}
int n=Integer.parseInt(s);
if(n<2||n>10){
return -1;
}
return n;
}
public static String res=null;
public String Point24(String cards) {//读取卡牌 函数
if(cards==null||cards.contains("joker")||cards.contains("JOKER")){
return "ERROR";
}
String[] c=cards.split(" ");
if(c.length!=4){
return "ERROR";
}
ArrayList<Double> d=new ArrayList<Double>();
ArrayList<String> s=new ArrayList<String>();
for(int i=0;i<4;i++){
double td=transform(c[i]);
if(td==-1){
return "ERROR";
}
d.add(td);
s.add(c[i]);
}
res=null; //清空数据
recursion(d,s);
if(res==null){
return "Null";
}
return res;
}
//递归,数组中取出两个数计算后结果放回数组
private void recursion(ArrayList<Double> d,ArrayList<String> s){
int n=d.size();
if(n==1){
if(Math.abs(d.get(0)-24.0)<=0.000000001){ //防止有分数而产生误差
res=s.get(0); //若数组只有一个数,且为24,则将算式字符串赋值给类静态变量
// System.out.println(res);
}
return;
}
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
ArrayList<Double> dd=new ArrayList<Double>();//用于递归的新数组
ArrayList<String> ss=new ArrayList<String>();//用于存放算式的新数组
//任意取出两个数的不同组合情况
for(int r=0;r<n;r++){
if(r!=i&&r!=j){
dd.add(d.get(r));
ss.add(s.get(r));
}
}
dd.add(d.get(i)+d.get(j));//加入取出的两数计算结果 a+b
ss.add("("+s.get(i)+"+"+s.get(j)+")");//记录两数计算的算式
recursion(dd, ss);//递归
if(res!=null){ //若静态变量已有值,则返回
return;
}
dd.remove(dd.size()-1);//移除上次添加的两数计算结果
ss.remove(ss.size()-1);
dd.add(d.get(i)-d.get(j));//a-b
ss.add("("+s.get(i)+"-"+s.get(j)+")");
recursion(dd, ss);
if(res!=null){
return;
}
dd.remove(dd.size()-1);
ss.remove(ss.size()-1);
dd.add(d.get(i)*d.get(j));//a*b
ss.add(s.get(i)+"*"+s.get(j));
recursion(dd, ss);
if(res!=null){
return;
}
dd.remove(dd.size()-1);
ss.remove(ss.size()-1);
dd.add(d.get(i)/d.get(j));//a/b
ss.add(s.get(i)+"/"+s.get(j));
recursion(dd, ss);
if(res!=null){
return;
}
dd.remove(dd.size()-1);
ss.remove(ss.size()-1);
dd.add(d.get(j)-d.get(i));//b-a
ss.add("("+s.get(j)+"-"+s.get(i)+")");
recursion(dd, ss);
if(res!=null){
return;
}
dd.remove(dd.size()-1);
ss.remove(ss.size()-1);
dd.add(d.get(j)/d.get(i));//b/a
ss.add(s.get(j)+"/"+s.get(i));
recursion(dd, ss);
if(res!=null){
return;
}
}
}
}
public static void setFile (String s) throws IOException { //文件写入函数
byte[] bs = s.getBytes();//定义字节数组用来当作缓冲区
FileOutputStream fos=new FileOutputStream("E:\\eclipes 英文版工作空间\\程序设计作业\\bin\\作业4扑克牌\\TopList.txt");
try {
fos.write(bs);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//从缓冲区字节数组中以字节流形式取出
fos.close();//关闭读取流
File file=new File("E:\\eclipes 英文版工作空间\\程序设计作业\\bin\\作业4扑克牌\\TopList.txt");//创建文件对象
if(file.exists()){//if语句的条件,调用exists方法判断文件是否存在
// System.out.println("文件成功读入到指定路径下");//若文件存在,则输出文件存在
}
else{//否则
System.out.println("输出文件不存在");//输出文件不存在
}
}
public static void main(String[] args) throws IOException {
System.out.println("24 点游戏 玩家有三条命 每4张牌有1分钟时间 来写出算式 或者写Null代表无法得出 A-1 J-11 Q-12 K-14");
System.out.println("例如:7 7 3 9 ");
System.out.println("The method to make 24 points is: 3*(9-7/7)");
int count =3; int score=0;
boolean bl=true;
while (bl) {
if(count>0) {
long startTime = System.currentTimeMillis(); //获取开始时间
System.out.println(" 发牌如下:");
Demo1 c = new Demo1();
String cards=c.deal();//发牌
System.out.print("The method to make 24 points is: ");
Scanner s= new Scanner(System.in);
String str = s.nextLine();
long endTime = System.currentTimeMillis();
if(endTime-startTime>=60*1000) {
System.out.println("Too Late! ");
count--;
System.out.println("还有生命值"+count);
continue;
}
if ( str.equals(c.Point24(cards))) {
System.out.println("正确 真skr小机灵鬼!");
System.out.println("还有生命值"+count);
score++;
continue;
}else {
System.out.println("错误 继续加油!");
count--;
System.out.println("还有生命值"+count);
continue;
}
}else {
bl=false;
}
}
System.out.println("本次成绩 :"+score);
String sc= Integer.toString(score);
setFile (sc);
System.out.println("Game Over!");
}
}
运行结果:
打开文件: