java 扑克牌 24点小游戏

要求:用户初始生命值为一给定值(比如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!");
	}
}

运行结果:

打开文件:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值