时间:2021-05-20
本文实例为大家分享了Java实现24点小游戏的具体代码,供大家参考,具体内容如下
程序设计要求:
24点游戏是经典的纸牌益智游戏。
常见游戏规则:
从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏。
基本要求: 随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式,用擅长的语言(C/C++/Java或其他均可)实现程序解决问题。
1.程序风格良好(使用自定义注释模板)
2.列出表达式无重复。
算法设计思路:
算法采用了穷举的方法,对所有数字和操作符进行组合,从而找到所有的情况。
刚开始将四个数进行分组排序。
算法中我采用了将四个数分为1种的,两种的(在两种中又分为两种数的个数分别为1和3的,个数分别为2和2的),三种的和四种的,将所有情况排序排了出来。
每次只运算2个数,然后将结果拿去进行下一次运算。刚开始有4个数,拿出两个数进行第一次运算,运算后得出三个数,然后在这三个数中再拿出两个进行第二次运算,运算后就有两个数了,第三次运算就是将这两个数进行计算,得出最后值,判断最后这个值是否为24,若为24,则输出表达式,若不是,则输出提示消息。
现在在这4个数确定位置的情况下,再来改变操作符,即每次2个数进行运算的时候,有4种情况。在下一次计算的时候同样有4种情况,最后一次计算(第3次)同理。这样就找到了所有解的情况。
算法流程图为:
下面是代码:
package Game;import java.util.ArrayList;import java.util.HashMap;import java.util.Map;import java.util.Random;public class Compute { //定义随机产生的四个数 static int number[] = new int[4]; //转换后的num1,num2,num3,num4 static int m[]=new int [4]; static String n[] = new String[4]; //用来判断是否有解 static boolean flag = false; //存放操作符 static char[] operator = { '+', '-', '*', '/' }; private static Object key; public static void main(String[] args){ Random rand = new Random(); System.out.println("下列给出四个数字,使用+,-,*,/进行计算使最后计算结果为24"); for(int i=0;i<4;i++){ number[i]=rand.nextInt(13)+1;//随机生成四个int型数 if(number[i]==1){ System.out.println("A");//如果随机生成的数为1,则显示为扑克牌牌面中的A } else if(number[i]==11){ System.out.println("J");//如果随机生成的数为11,则显示为扑克牌牌面中的J } else if(number[i]==12){ System.out.println("Q");//如果随机生成的数为12,则显示为扑克牌牌面中的Q } else if(number[i]==13){ System.out.println("K");//如果随机生成的数为13,则显示为扑克牌牌面中的K } else System.out.println(number[i]); } System.out.println("可能的结果有:"); calculate(); } //给定2个数和指定操作符的计算 public static int calcute(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; } } //计算生成24的函数 public static void calculate(){ Map<Integer, Integer> map = new HashMap<Integer, Integer>(); //存放数字,用来判断输入的4个数字中有几个重复的,和重复的情况 for (int i = 0; i < number.length; i++) { if(map.get(number[i]) == null){ map.put(number[i], 1); } else { map.put(number[i], map.get(number[i]) + 1); } } if(map.size() == 1){ //如果只有一种数字,此时只有一种排列组合,如5,5,5,5 calculation(number[0], number[1],number[2],number[3]); } else if(map.size()==2){ //如果只有2种数字,有2种情况,如1,1,2,2和1,1,1,2 int index = 0;//用于数据处理 int state = 0;//判断是哪种情况 for (Integer key : map.keySet()) { if(map.get(key) == 1){ //如果是有1个数字和其他3个都不同,将number变为 number[0]=number[1]=number[2], //将不同的那个放到number[3],方便计算 number[3] = key; state = 1; } else if(map.get(key)==2){ //如果是两两相同的情况,将number变为number[0]=number[1],number[2]=number[3]的情况 number[index++]=key; number[index++]=key; } else{ number[index++]=key; } } //列出2种情况的所有排列组合,并分别计算 if(state == 1){ calculation(number[3],number[1],number[1],number[1]); calculation(number[1],number[3],number[1],number[1]); calculation(number[1],number[1],number[3],number[1]); calculation(number[1],number[1],number[1],number[3]); } if(state==0){ calculation(number[1],number[1],number[3],number[3]); calculation(number[1],number[3],number[1],number[3]); calculation(number[1],number[3],number[3],number[1]); calculation(number[3],number[3],number[1],number[1]); calculation(number[3],number[1],number[3],number[1]); calculation(number[3],number[1],number[1],number[3]); } } else if(map.size()==3){ //有3种数字的情况 int index = 0; for (Integer key : map.keySet()) { if(map.get(key) == 2){ //将相同的2个数字放到number[2]=number[3] number[2] = key; number[3] = key; } else { number[index++] = key; } } //排列组合,所有情况 calculation(number[0],number[1],number[3],number[3]); calculation(number[0],number[3],number[1],number[3]); calculation(number[0],number[3],number[3],number[1]); calculation(number[1],number[0],number[3],number[3]); calculation(number[1],number[3],number[0],number[3]); calculation(number[1],number[3],number[3],number[0]); calculation(number[3],number[3],number[0],number[1]); calculation(number[3],number[3],number[1],number[0]); calculation(number[3],number[1],number[3],number[0]); calculation(number[3],number[0],number[3],number[1]); calculation(number[3],number[0],number[1],number[3]); calculation(number[3],number[1],number[0],number[3]); } else if(map.size() == 4){ //4个数都不同的情况 calculation(number[0],number[1],number[2],number[3]); calculation(number[0],number[1],number[3],number[2]); calculation(number[0],number[2],number[1],number[3]); calculation(number[0],number[2],number[3],number[1]); calculation(number[0],number[3],number[1],number[2]); calculation(number[0],number[3],number[2],number[1]); calculation(number[1],number[0],number[2],number[3]); calculation(number[1],number[0],number[3],number[2]); calculation(number[1],number[2],number[3],number[0]); calculation(number[1],number[2],number[0],number[3]); calculation(number[1],number[3],number[0],number[2]); calculation(number[1],number[3],number[2],number[0]); calculation(number[2],number[0],number[1],number[3]); calculation(number[2],number[0],number[3],number[1]); calculation(number[2],number[1],number[0],number[3]); calculation(number[2],number[1],number[3],number[0]); calculation(number[2],number[3],number[0],number[1]); calculation(number[2],number[3],number[1],number[0]); calculation(number[3],number[0],number[1],number[2]); calculation(number[3],number[0],number[2],number[1]); calculation(number[3],number[1],number[0],number[2]); calculation(number[3],number[1],number[2],number[0]); calculation(number[3],number[2],number[0],number[1]); calculation(number[3],number[2],number[1],number[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 = operator[i]; int firstResult = calcute(num1, num2, operator1);//先选第一,和第二个数进行计算 int midResult = calcute(num2, num3, operator1);//先选第二和第三两个数进行计算 int tailResult = calcute(num3,num4, operator1);//先选第三和第四俩个数进行计算 for (int j = 0; j < 4; j++){ //第2次计算,从上次计算的结果继续执行,这次从三个数中选择两个进行计算 char operator2 = operator[j]; int firstMidResult = calcute(firstResult, num3, operator2); int firstTailResult = calcute(num3,num4,operator2); int midFirstResult = calcute(num1, midResult, operator2); int midTailResult= calcute(midResult,num4,operator2); int tailMidResult = calcute(num2, tailResult, operator2); for (int k = 0; k < 4; k++){ //第3次计算,也是最后1次计算,计算两个数的结果,如果是24则输出表达式 char operator3 = operator[k]; //在以上的计算中num1,num2,num3,num4都是整型数值,但若要输出为带有A,J,Q,K的表达式,则要将这四个数都变为String类型,下同 if(calcute(firstMidResult, num4, operator3) == 24){ m[0]=num1; m[1]=num2; m[2]=num3; m[3]=num4; for(int p=0;p<4;p++){ if(m[p]==1){ n[p]="A";} if(m[p]==2){ n[p]="2";} if(m[p]==3){ n[p]="3";} if(m[p]==4){ n[p]="4";} if(m[p]==5){ n[p]="5";} if(m[p]==6){ n[p]="6";} if(m[p]==7){ n[p]="7";} if(m[p]==8){ n[p]="8";} if(m[p]==9){ n[p]="9";} if(m[p]==10){ n[p]="10";} if(m[p]==11){ n[p]="J";} if(m[p]==12){ n[p]="Q";} if(m[p]==13){ n[p]="k";} } System.out.println("((" + n[0] + operator1 + n[1] + ")" + operator2 + n[2] + ")" + operator3 + n[3]); flag = true;//若有表达式输出,则将说明有解,下同 } if(calcute(firstResult, firstTailResult, operator3) == 24){ System.out.println("(" + n[0] + operator1 + n[1] + ")" + operator3 + "(" + n[2] + operator2 + n[3] + ")"); flag = true; } if(calcute(midFirstResult, num4, operator3) == 24){ m[0]=num1; m[1]=num2; m[2]=num3; m[3]=num4; for(int p=0;p<4;p++){ if(m[p]==1){ n[p]="A";} if(m[p]==2){ n[p]="2";} if(m[p]==3){ n[p]="3";} if(m[p]==4){ n[p]="4";} if(m[p]==5){ n[p]="5";} if(m[p]==6){ n[p]="6";} if(m[p]==7){ n[p]="7";} if(m[p]==8){ n[p]="8";} if(m[p]==9){ n[p]="9";} if(m[p]==10){ n[p]="10";} if(m[p]==11){ n[p]="J";} if(m[p]==12){ n[p]="Q";} if(m[p]==13){ n[p]="k";} } System.out.println("(" + n[0] + operator2 + "(" + n[1] + operator1 + n[2] + "))" + operator3 + n[3]); flag = true; } if(calcute(num1,midTailResult, operator3) == 24){ m[0]=num1; m[1]=num2; m[2]=num3; m[3]=num4; for(int p=0;p<4;p++){ if(m[p]==1){ n[p]="A";} if(m[p]==2){ n[p]="2";} if(m[p]==3){ n[p]="3";} if(m[p]==4){ n[p]="4";} if(m[p]==5){ n[p]="5";} if(m[p]==6){ n[p]="6";} if(m[p]==7){ n[p]="7";} if(m[p]==8){ n[p]="8";} if(m[p]==9){ n[p]="9";} if(m[p]==10){ n[p]="10";} if(m[p]==11){ n[p]="J";} if(m[p]==12){ n[p]="Q";} if(m[p]==13){ n[p]="k";} } System.out.println(" " + n[0] + operator3 + "((" + n[1] + operator1 + n[2] + ")" + operator2 + n[3] + ")"); flag = true; } if(calcute(num1,tailMidResult,operator3) == 24){ m[0]=num1; m[1]=num2; m[2]=num3; m[3]=num4; for(int p=0;p<4;p++){ if(m[p]==1){ n[p]="A";} if(m[p]==2){ n[p]="2";} if(m[p]==3){ n[p]="3";} if(m[p]==4){ n[p]="4";} if(m[p]==5){ n[p]="5";} if(m[p]==6){ n[p]="6";} if(m[p]==7){ n[p]="7";} if(m[p]==8){ n[p]="8";} if(m[p]==9){ n[p]="9";} if(m[p]==10){ n[p]="10";} if(m[p]==11){ n[p]="J";} if(m[p]==12){ n[p]="Q";} if(m[p]==13){ n[p]="k";} } System.out.println(" " + n[0] + operator3 + "(" + n[1] + operator2 + "(" + n[2] + operator1 + n[3] + "))"); flag = true; } } } } } }运行及测试截图:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例为大家分享了C语言纸牌24点小游戏的具体实现代码,供大家参考,具体内容如下此程序参考C语言实现经典24点纸牌益智游戏,并做出一些改进。一、题目要求:24
本文题目为大家分享了java实现24点纸牌游戏的具体代码,供大家参考,具体内容如下题目24点游戏是经典的纸牌益智游戏。常见游戏规则:从扑克中每次取出4张牌。使用
本文实例讲述了Java实现的打地鼠小游戏。分享给大家供大家参考,具体如下:这里涉及到java线程和GUI的相关知识,一个简单的java小游戏打地鼠,有兴趣的朋友
本文实例为大家分享了java实现猜拳小游戏的具体代码,供大家参考,具体内容如下项目名称猜拳小游戏项目描述玩家与电脑进行猜拳游戏,玩家行为采用输入方式,电脑行为采
本文实例为大家分享了java实现2048小游戏的具体代码,供大家参考,具体内容如下效果图:游戏介绍:1.2048是一款益智类小游戏,刚开始随机出现两个数字,可以