24点游戏

24点游戏:用户初始生命值为一给定值(比如3),初始分数为0。随机生成4个代表扑克牌牌面的数字或字母,由用户输入包含这4个数字或字母的运算表达式(可包含括号),如果表达式计算结果为24则代表用户赢了此局。

  1. 算法分析
    (1)将13张牌面以字符串的形式存入列表,随机从列表中取出四张牌面,并将牌面字符串转换为字符型存入字符数组ch[]中,供后面使用。
    (2)输入包含程序生成的数字或字母的表达式,筛选出表达式中的字母或数字,并与ch[]数组做匹配,判断是否包含全部生成字符,如果包含,则进行表达式计算,如果不包含,则需重新输入表达式。
    (3)计算表达式时,先通过Change类的changeM()方法将表达式中的字母转换为对应数字,然后再带入SuffixExpression类中的calculateSuffixExpression()方法计算表达式的值。
    (4)如果表达式值为24则此局胜利,加1分,负责生命值-1,如果输入表达式不包含程序所给字母数字达到三次,则生命值-1,生命值初始值为3,当生命值为0时,游戏结束。
  2. 源代码
import java.util.Arrays;
import java.util.List;
import java.util.Queue;
import java.util.Scanner;

/**
 * ClassName: Point24 
 * @Description: 24点游戏的主类,完成整个游戏流程
 * @author Admin
 * @date 2021年5月11日 上午11:56:57
 * @version V1.0
 * @project 24点游戏
*/
public class Point24 {

	public static void main(String[] args) {
		int lifeV=3;   //生命值变量
		int score=0;   //得分
		int chance=0;  //输入错误表达式次数
		int begin;     //判断游戏是否开始
		Scanner s=new Scanner(System.in);
		List<String> list = Arrays.asList("A","2","3","4","5","6","7",
				"8","9","10","J","Q","K");
		System.out.println("游戏说明:游戏开始将随机产生四个数字或字母,您可使用这四个数字或字母进行四则运算,");
		System.out.println("您有60秒时间写出表达式,如果计算结果为24,则本局胜利,您将得1分,否则");
		System.out.println("您将损失1点生命值,进入下一局,当输入表达式未包含上述未包含程序生成的数字或字母达到三次时");
		System.out.println("您将损失1点生命值,当生命值为0时,游戏结束");
		System.out.println();
		System.out.println("是否开始游戏?(输入1开始)");
		begin=s.nextInt();
		if(begin==1) {
		do {
		//随机生成上面列表中任一字符串,生成 牌面	
        int index1 = (int) (Math.random()* list.size());
        int index2 = (int) (Math.random()* list.size());
        int index3 = (int) (Math.random()* list.size());
        int index4 = (int) (Math.random()* list.size());
        String a=list.get(index1);
        String b=list.get(index2);
        String c=list.get(index3);
        String d=list.get(index4);
        char e=a.charAt(0);
        char f=b.charAt(0);
        char g=c.charAt(0);
        char h=d.charAt(0);
        char[] ch=new char[] {e,f,g,h};
        System.out.println("☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆");
        System.out.println("随机生成4个代表扑克牌牌面的数字或字母:");
        System.out.println("第一个随机生成的牌面为:"+a);
        System.out.println("第二个随机生成的牌面为:"+b);
        System.out.println("第三个随机生成的牌面为:"+c);
        System.out.println("第四个随机生成的牌面为:"+d);
        System.out.println("请输入包含以上四个数字或字母的运算表达式(运算符可为+-*/,可带括号):");
        String st=s.next();
        String str=st.replaceAll("[^A-Z0-9]", "");     //筛选出输入表达式的字母或数字,并存入字符数组
        char[] charArray=str.toCharArray();
        int l=0;
        //判断输入表达式是否完全包含程序生成的字母或数字
        for(int i=0;i<charArray.length;i++) {
        	for(int j=0;j<4;j++) {
        		if(charArray[i]==ch[j]) {
        			ch[j]=0;
        			l++;
        			break;
        		}
        	}
        }
        if(l==4) {
        Change cc=new Change();
        String cs=cc.changeM(st);
        Queue<String> strings = SuffixExpression.infixConverSuffixExpression(cs);
        int sign=SuffixExpression.calculateSuffixExpression(strings);   //计算输入表达式的值
        System.out.println("表达式计算结果为:"+sign);
        if(sign==24) {
        	System.out.println("恭喜您,此局胜利!");
        	score++;
        	System.out.println("您当前生命值为:"+lifeV+"   您当前得分为:"+score);
        }else {
        	System.out.println("很遗憾,此局失败!");
        	lifeV--;
        	System.out.println("您当前生命值为:"+lifeV+"   您当前得分为:"+score);
        }
        System.out.println();
        }else {
        	System.out.println("输入表达式未包含上述四个数字字母!");
        	chance++;
        	if(chance==3) {
        		lifeV--;
        		chance=0;
        		System.out.println("您的表达式输入已经错误三次!生命值-1");
        		System.out.println("您当前生命值为:"+lifeV);
        	}
        }
		}while(lifeV!=0);      //生命值为0时,游戏结束
		System.out.println("GAME OVER!");
		System.out.println("您的最终得分为:"+score);
	}
	}

}
/**
 * ClassName: Change 
 * @Description: 用于将输入表达式中的字母转换为相应数字
 * @author Admin
 * @date 2021年5月11日 上午11:59:13
 * @version V1.0
 * @project 24点游戏
*/
public class Change {
	public String changeM(String x) {
		String str=x;
		if(str.indexOf("A")!=-1) {
			str=str.replace("A","1");
		}
		if(str.indexOf("J")!=-1) {
			str=str.replace("J","11");
		}
		if(str.indexOf("Q")!=-1) {
			str=str.replace("Q","12");
		}
		if(str.indexOf("K")!=-1) {
			str=str.replace("K","13");
		}
		return str;
		
	}
import java.util.Queue;
import java.util.Stack;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * ClassName: SuffixExpression 
 * @Description: 用于计算输入表达式的值
 * @author Admin
 * @date 2021年5月11日 下午12:01:08
 * @version V1.0
 * @project 24点游戏
*/
public class SuffixExpression {
	    public static Queue<String> infixConverSuffixExpression(String expression){
	    	char[] expressionArr=expression.toCharArray();
	        Stack<Character> symbolStack=new Stack<>();
	        Queue<String> contentQueue=new ConcurrentLinkedQueue<>();
	        String numberLinked="";
	        for(int index=0;index<expressionArr.length;index++){
	            Character currentChar=expressionArr[index];
	            if(currentChar==' ')continue;
	            if(isSymbol(currentChar+"")){
	                if(currentChar=='-'&&index==0||!isNumeric(expressionArr[index-1]+"")&&expressionArr[index-1]!=')'&&expressionArr[index-1]!=' '){
	                    numberLinked+=currentChar;
	                }else{
	                    while(!symbolStack.isEmpty()){
	                        if(symbolLevel(currentChar)<=symbolLevel(symbolStack.peek())){
	                            contentQueue.add(symbolStack.pop()+"");
	                        }else{
	                            break;
	                        }
	                    }
	                    symbolStack.push(currentChar);
	                }
	            }
	            else if(currentChar=='('|| currentChar==')'){
	                if(currentChar=='('){
	                    symbolStack.push(currentChar);
	                }else{	                 
	                    while(!symbolStack.isEmpty()){
	                        char currPopChar=symbolStack.pop();
	                        if(currPopChar!='('){
	                            contentQueue.add(currPopChar+"");
	                        }else{
	                            break;
	                        }
	                    }
	                }
	            }else{              
	                numberLinked+=currentChar;
	                if(index>=expressionArr.length-1){
	                    contentQueue.add(numberLinked);
	                }else{
	                    if(!isNumeric(expressionArr[index+1]+"")){
	                        contentQueue.add(numberLinked);
	                        numberLinked="";
	                    }
	                }
	            }
	        }
	        while(!symbolStack.isEmpty()){
	            contentQueue.add(symbolStack.pop()+"");
	        }
	        return contentQueue;
	    }
	    public static Integer calculateSuffixExpression(Queue<String> contentQueue){
	        Stack<Integer> numberStack=new Stack<>();
	        while(!contentQueue.isEmpty()){
	            String currentContent=contentQueue.poll();
	            if(isSymbol(currentContent)){
	                int num1=numberStack.pop();
	                int num2=numberStack.pop();
	                numberStack.push(calculate(num1,num2,currentContent.toCharArray()[0]));
	            }else{
	                numberStack.push(Integer.parseInt(currentContent));
	            }
	        }
	        return numberStack.pop();
	    }


	    public static boolean isSymbol(String ch){
	        return ch.equals("+") || ch.equals("-") || ch.equals("*") || ch.equals("/");
	    }
	    public static boolean isNumeric(String str){
	        Pattern pattern = Pattern.compile("^-?\\d+(\\.\\d+)?$");
	        Matcher isNum = pattern.matcher(str);
	        if( !isNum.matches() ){
	            return false;
	        }
	        return true;
	    }
	    public static int symbolLevel(int ch){
	        if(ch=='+'|| ch=='-'){
	            return 1;
	        }else if(ch=='*'|| ch=='/'){
	            return 2;
	        }else{
	            return -1;
	        }
	    }
	    public static int calculate(int num1,int num2,Character ch){
	        switch (ch){
	            case '+':
	                return num2+num1; 

	            case '-':
	                return num2-num1; 
	            case '*':
	                return num2*num1; 

	            case '/':
	                return num2/num1; 
	            default:
	                return -1;
	        }
	    }
	

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值