24点游戏 订阅
棋牌类益智游戏,要求结果等于二十四,一起来玩玩吧! 展开全文
棋牌类益智游戏,要求结果等于二十四,一起来玩玩吧!
信息
游戏画面
2D
游戏大小
153k
游戏类型
益智
中文名
24点游戏
内容主题
益智
24点游戏游戏介绍
棋牌类益智游戏,要求结果等于二十四,一起来玩玩吧!
收起全文
精华内容
下载资源
问答
  • 24点游戏

    2021-05-09 22:19:22
    24点游戏是经典的纸牌益智游戏。 常见游戏规则: 从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏。 基本要求: 随机生成4个...

    24点纸牌游戏

    题目:

    24点游戏是经典的纸牌益智游戏。
    常见游戏规则:
    从扑克中每次取出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文件中。

    概要设计

    在这里插入图片描述

    代码:

    import java.util.HashMap;
    import java.util.Map;
    import java.util.Random;
    
    
    public class Solution {
    	//定义随机产生的四个数
    		static int data[] = new int[4];
    		//转换后的num1,num2,num3,num4
    		static int reData[]=new int [4];
    		static String dataString[] = new String[4];
    		//用来判断是否有解
    		static boolean flag = false;
    		//存放操作符
    		static char[] op = { '+', '-', '*', '/' };
    		private static Object key;
    		public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Random rand = new Random();
    		System.out.println("下列随机给出四个数字,列出计算结果为24的表达式:");
    		for(int i=0;i<4;i++){
    			data[i]=rand.nextInt(13)+1;//随机生成四个int型数
    
    			if(data[i]==1){
    				System.out.println("A");//如果随机生成的数为1,则显示为扑克牌牌面中的A
    			}
    			else if(data[i]==11){
    				System.out.println("J");//如果随机生成的数为11,则显示为扑克牌牌面中的J
    			}
    			else if(data[i]==12){
    				System.out.println("Q");//如果随机生成的数为12,则显示为扑克牌牌面中的Q
    			}
    			else if(data[i]==13){
    				System.out.println("K");//如果随机生成的数为13,则显示为扑克牌牌面中的K
    			}
    			else
    			System.out.println(data[i]);
    			}
    		System.out.println("可能的结果有:");
    		calculate();
    
    	}
    public static int cal(int count1, int count2, char operator) {
    		if (operator == '+') {
    	    	return count1 + count2;
    	    }
    	    else if (operator == '-') {
    	    	return count1 - count2;
    	    }
    	    else if (operator == '*') {
    	    	return count1 * count2;
    	    }
    	    else if ((operator == '/' )&& (count2 != 0) && (count1%count2==0)) {
    	    	return count1 / count2;
    	   	}
    	    else {
    	    	return -1;
    	    }
    	}
    	public static void calculate(){
    
    		Map<Integer, Integer> map = new HashMap<Integer, Integer>();
    		//存放数字,用来判断输入的4个数字中有几个重复的,和重复的情况
    		for (int i = 0; i < data.length; i++) {
    			if(map.get(data[i]) == null){
    				map.put(data[i], 1);
    			}
    			else {
    				map.put(data[i], map.get(data[i]) + 1);
    			}
    		}
    		if(map.size() == 1){
    			//如果只有一种数字,此时只有一种排列组合,如1,1,1,1
    			calculation(data[0], data[1],data[2],data[3]);
    		}
    		else if(map.size()==2){
    			//如果只有2种数字,有2种情况,如2,2,4,4和2,2,2,4
    			int index = 0;//用于数据处理
    			int state = 0;//判断是哪种情况
    			for (Integer key : map.keySet()) {
    				if(map.get(key) == 1){
    					//如果是有1个数字和其他3个都不同,将data变为 data[0]=data[1]=data[2],
    					//将不同的那个放到data[3],方便计算
    					data[3] = key;
    					state = 1;
    				}
    				else if(map.get(key)==2){
    					//如果是两两相同的情况,将data变为data[0]=data[1],data[2]=data[3]的情况
    					data[index++]=key;
    					data[index++]=key;
    				}
    				else{
    					data[index++]=key;
    				}
    			}
    			//列出2种情况的所有排列组合,并分别计算
    			if(state == 1){
    				calculation(data[3],data[1],data[1],data[1]);
    				calculation(data[1],data[3],data[1],data[1]);
    				calculation(data[1],data[1],data[3],data[1]);
    				calculation(data[1],data[1],data[1],data[3]);
    			}
    			if(state==0){
    				calculation(data[1],data[1],data[3],data[3]);
    				calculation(data[1],data[3],data[1],data[3]);
    				calculation(data[1],data[3],data[3],data[1]);
    				calculation(data[3],data[3],data[1],data[1]);
    				calculation(data[3],data[1],data[3],data[1]);
    				calculation(data[3],data[1],data[1],data[3]);
    			}
    		}
    		else if(map.size()==3){
    			//有3种数字的情况
    			int index = 0;
    			for (Integer key : map.keySet()) {
    				if(map.get(key) == 2){
    					//将相同的2个数字放到data[2]=data[3]
    					data[2] = key;
    					data[3] = key;
    				}
    				else {
    					data[index++] = key;
    				}
    			}
    			//排列组合,所有情况
    			calculation(data[0],data[1],data[3],data[3]);
    			calculation(data[0],data[3],data[1],data[3]);
    			calculation(data[0],data[3],data[3],data[1]);
    			calculation(data[1],data[0],data[3],data[3]);
    			calculation(data[1],data[3],data[0],data[3]);
    			calculation(data[1],data[3],data[3],data[0]);
    			calculation(data[3],data[3],data[0],data[1]);
    			calculation(data[3],data[3],data[1],data[0]);
    			calculation(data[3],data[1],data[3],data[0]);
    			calculation(data[3],data[0],data[3],data[1]);
    			calculation(data[3],data[0],data[1],data[3]);
    			calculation(data[3],data[1],data[0],data[3]);
    		}
    		else if(map.size() == 4){
    			//4个数都不同的情况
    			calculation(data[0],data[1],data[2],data[3]);
    			calculation(data[0],data[1],data[3],data[2]);
    			calculation(data[0],data[2],data[1],data[3]);
    			calculation(data[0],data[2],data[3],data[1]);
    			calculation(data[0],data[3],data[1],data[2]);
    			calculation(data[0],data[3],data[2],data[1]);
    			calculation(data[1],data[0],data[2],data[3]);
    			calculation(data[1],data[0],data[3],data[2]);
    			calculation(data[1],data[2],data[3],data[0]);
    			calculation(data[1],data[2],data[0],data[3]);
    			calculation(data[1],data[3],data[0],data[2]);
    			calculation(data[1],data[3],data[2],data[0]);
    			calculation(data[2],data[0],data[1],data[3]);
    			calculation(data[2],data[0],data[3],data[1]);
    			calculation(data[2],data[1],data[0],data[3]);
    			calculation(data[2],data[1],data[3],data[0]);
    			calculation(data[2],data[3],data[0],data[1]);
    			calculation(data[2],data[3],data[1],data[0]);
    			calculation(data[3],data[0],data[1],data[2]);
    			calculation(data[3],data[0],data[2],data[1]);
    			calculation(data[3],data[1],data[0],data[2]);
    			calculation(data[3],data[1],data[2],data[0]);
    			calculation(data[3],data[2],data[0],data[1]);
    			calculation(data[3],data[2],data[1],data[0]);
    		}
    		if(flag==false)
    			System.out.println("这四张牌面数字无法经过运算得到24!");
    	}
    
    public static void calculation(int num1, int num2, int num3, int num4){
    
    		for (int i = 0; i < 4; i++){
    			//第1次计算,先从四个数中任意选择两个进行计算
    			char operator1 = op[i];
    			int firstResult = cal(num1, num2, operator1);//先选第一,和第二个数进行计算
    			int midResult = cal(num2, num3, operator1);//先选第二和第三两个数进行计算
    			int tailResult = cal(num3,num4, operator1);//先选第三和第四俩个数进行计算
    			for (int j = 0; j < 4; j++){
    				//第2次计算,从上次计算的结果继续执行,这次从三个数中选择两个进行计算
    				char operator2 = op[j];
    				int firstMidResult = cal(firstResult, num3, operator2);
    				int firstTailResult = cal(num3,num4,operator2);
    				int midFirstResult = cal(num1, midResult, operator2);
    				int midTailResult= cal(midResult,num4,operator2);
    				int tailMidResult = cal(num2, tailResult, operator2);
    				for (int k = 0; k < 4; k++){
    					//第3次计算,也是最后1次计算,计算两个数的结果,如果是24则输出表达式
    					char operator3 = op[k];
    					//在以上的计算中num1,num2,num3,num4都是整型数值,但若要输出为带有A,J,Q,K的表达式,则要将这四个数都变为String类型,下同
    					if(cal(firstMidResult, num4, operator3) == 24){
    						reData[0]=num1;
    						reData[1]=num2;
    						reData[2]=num3;
    						reData[3]=num4;
    						for(int p=0;p<4;p++){
    							if(reData[p]==1){
    								dataString[p]="A";}
    							if(reData[p]==2){
    								dataString[p]="2";}
    							if(reData[p]==3){
    								dataString[p]="3";}
    							if(reData[p]==4){
    								dataString[p]="4";}
    							if(reData[p]==5){
    								dataString[p]="5";}
    							if(reData[p]==6){
    								dataString[p]="6";}
    							if(reData[p]==7){
    								dataString[p]="7";}
    							if(reData[p]==8){
    								dataString[p]="8";}
    							if(reData[p]==9){
    								dataString[p]="9";}
    							if(reData[p]==10){
    								dataString[p]="10";}
    							if(reData[p]==11){
    								dataString[p]="J";}
    							if(reData[p]==12){
    								dataString[p]="Q";}
    							if(reData[p]==13){
    								dataString[p]="k";}
    						}
    						System.out.println("((" + dataString[0] + operator1 + dataString[1] + ")"
    								+ operator2 + dataString[2] + ")" + operator3 + dataString[3]);
    						flag = true;//若有表达式输出,则将说明有解,下同
    					}
    					if(cal(firstResult, firstTailResult, operator3) == 24){
    						System.out.println("(" + dataString[0] + operator1 + dataString[1] + ")"
    								+ operator3 + "(" + dataString[2] + operator2 + dataString[3] + ")");
    						flag = true;
    					}
    					if(cal(midFirstResult, num4, operator3) == 24){
    						reData[0]=num1;
    						reData[1]=num2;
    						reData[2]=num3;
    						reData[3]=num4;
    						for(int p=0;p<4;p++){
    							if(reData[p]==1){
    								dataString[p]="A";}
    							if(reData[p]==2){
    								dataString[p]="2";}
    							if(reData[p]==3){
    								dataString[p]="3";}
    							if(reData[p]==4){
    								dataString[p]="4";}
    							if(reData[p]==5){
    								dataString[p]="5";}
    							if(reData[p]==6){
    								dataString[p]="6";}
    							if(reData[p]==7){
    								dataString[p]="7";}
    							if(reData[p]==8){
    								dataString[p]="8";}
    							if(reData[p]==9){
    								dataString[p]="9";}
    							if(reData[p]==10){
    								dataString[p]="10";}
    							if(reData[p]==11){
    								dataString[p]="J";}
    							if(reData[p]==12){
    								dataString[p]="Q";}
    							if(reData[p]==13){
    								dataString[p]="k";}
    						}
    						System.out.println("(" + dataString[0] + operator2 + "(" + dataString[1]
    								+ operator1 + dataString[2] + "))" + operator3 + dataString[3]);
    						flag = true;
    					}
    					if(cal(num1,midTailResult, operator3) == 24){
    						reData[0]=num1;
    						reData[1]=num2;
    						reData[2]=num3;
    						reData[3]=num4;
    						for(int p=0;p<4;p++){
    							if(reData[p]==1){
    								dataString[p]="A";}
    							if(reData[p]==2){
    								dataString[p]="2";}
    							if(reData[p]==3){
    								dataString[p]="3";}
    							if(reData[p]==4){
    								dataString[p]="4";}
    							if(reData[p]==5){
    								dataString[p]="5";}
    							if(reData[p]==6){
    								dataString[p]="6";}
    							if(reData[p]==7){
    								dataString[p]="7";}
    							if(reData[p]==8){
    								dataString[p]="8";}
    							if(reData[p]==9){
    								dataString[p]="9";}
    							if(reData[p]==10){
    								dataString[p]="10";}
    							if(reData[p]==11){
    								dataString[p]="J";}
    							if(reData[p]==12){
    								dataString[p]="Q";}
    							if(reData[p]==13){
    								dataString[p]="k";}
    						}
    						System.out.println(" " + dataString[0] + operator3 + "((" + dataString[1]
    								+ operator1 + dataString[2] + ")" + operator2 + dataString[3] + ")");
    						flag = true;
    					}
    					if(cal(num1,tailMidResult,operator3) == 24){
    						reData[0]=num1;
    						reData[1]=num2;
    						reData[2]=num3;
    						reData[3]=num4;
    						for(int p=0;p<4;p++){
    							if(reData[p]==1){
    								dataString[p]="A";}
    							if(reData[p]==2){
    								dataString[p]="2";}
    							if(reData[p]==3){
    								dataString[p]="3";}
    							if(reData[p]==4){
    								dataString[p]="4";}
    							if(reData[p]==5){
    								dataString[p]="5";}
    							if(reData[p]==6){
    								dataString[p]="6";}
    							if(reData[p]==7){
    								dataString[p]="7";}
    							if(reData[p]==8){
    								dataString[p]="8";}
    							if(reData[p]==9){
    								dataString[p]="9";}
    							if(reData[p]==10){
    								dataString[p]="10";}
    							if(reData[p]==11){
    								dataString[p]="J";}
    							if(reData[p]==12){
    								dataString[p]="Q";}
    							if(reData[p]==13){
    								dataString[p]="k";}
    						}
    						System.out.println(" " + dataString[0] + operator3 + "(" + dataString[1]
    								+ operator2 + "(" + dataString[2] + operator1 + dataString[3] + "))");
    						flag = true;
    					}
    				}
    			}
    		}
    	}
    }
    
    

    测试

    在这里插入图片描述

    总结

    再做此题的过程中开始对四个数如何处理才能输出一个结果为24的算式有些苦恼,几经尝试结果都不太如意出现了重复使用一个数的情况,经过在网页上查找资料,将随机生成的四个数分成几类情况:不同的数有4、3、2、1个 分类处理,再计算处理;

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,878
精华内容 1,151
关键字:

24点游戏