24点游戏

一.作业说明

24点游戏是经典的纸牌益智游戏。
常见游戏规则:
从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏。
基本要求: 随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式,用擅长的语言(C/C++/Java或其他均可)实现程序解决问题。
1.程序风格良好(使用自定义注释模板)
2.列出表达式无重复。

二.算法设计思路

package tast;
import java.util.*;

/*
* 用穷举法列出所有可能的表达式式子,一个个进行验证计算
 * 我们可以将表达式分成以下几种:首先我们将4个数设为a,b,c,d,,将其排序列出四个数的所有排序序列组合(共有A44=24种组合)。
 * 再进行符号的排列表达式,其中算术符号有+,—,*,/,
 * 其中有效的表达式有a*(b-c/b),a*b-c*d,等等。列出所有有效的表达式,共有72种
*/

public class homework2{

	public static void main(String[] args) {
		Random r = new Random();//随机数对象
		float x = r.nextInt(13)+1;//由于产生的随机数是[0,13),所以还要加1
		float y = r.nextInt(13)+1;
		float z = r.nextInt(13)+1;
		float w = r.nextInt(13)+1;
		System.out.println("随机生成四个1-13的整数作为纸牌");
		System.out.println("第一个整数是:"+x);
		System.out.println("第二个整数是:"+y);
		System.out.println("第三个整数是:"+z);
		System.out.println("第四个整数是:"+w);
		System.out.println("所有的算法可能是:");
		System.out.print(TwoFour(x,y,z,w));
	}

	
	private static int TwoFour(float x, float y, float z, float w) {
		int i=0;//用i来记录成功的式子个数
		if(x*y-z+w==24)//列出72种可能
		    {System.out.println(x+"*"+y+"-"+z+"+"+w+"=24"); i++;}	
		if ((x-y)*z*w==24) 
		    {System.out.println("("+x+"-"+y+")"+"*"+z+"*"+w+"=24");i++;}
		if ((x*y)+(z*w)==24) 
			{System.out.println("("+x+"*"+y+")+("+z+"*"+w+")"+"=24"); i++;}
		if ((x+y)*z*w==24) 
			{System.out.println("("+x+"+"+y+")"+"*"+z+"*"+w+")"+"=24");i++;}
		if (x*y*z*w==24) 
			{System.out.println(x+"*"+y+"*"+z+"*"+w+"=24"); i++;}
		if ((x+y*z)*w==24) 
			{System.out.println("("+x+"+"+y+"*"+z+")"+"*"+w+"=24"); 	i++;}
		if ((x*y-z)*w==24) 
			{System.out.println("("+x+"*"+y+"-"+z+")"+"*"+w+"=24"); 	i++;}
		if ((x*y)+z+w==24) 
			{System.out.println("("+x+"*"+y+")+"+z+"+"+w+"=24"); 	i++;}
		if ((x/y-z)*w==24) 
			{System.out.println("("+x+"/"+y+"-"+z+")"+"*"+w+"=24"); 	i++;}
		if ((x-(y-z))*w==24) 
			{System.out.println("("+x+"-"+"("+y+"-"+z+")"+")*"+w+"=24");	i++;}
		if (x-(y-z-w)==24) 
			{System.out.println(x+"-"+"("+y+"-"+z+"-"+w+")"+"=24");	i++;}
		if (x+y-(z-w)==24) 
			{System.out.println(x+"+"+y+"-"+"("+z+"-"+w+")"+"=24"+"\n");	i++;}
		if (x*(y/z-w)==24) 
			{System.out.println(x+"*"+"("+y+"/"+z+"-"+w+")"+"=24");	i++;}
		if ((x-y*z)*w==24) 
			{System.out.println("("+x+"-"+y+"*"+z+")"+"*"+w+"=24");	i++;}
		if (x*(y-z)+w==24) 
		{	System.out.println(x+"*"+"("+y+"-"+z+")"+"+"+w+"=24");	i++;}
		if (x+y+z/w==24) 
			{System.out.println(x+"+"+y+"+"+z+"/"+w+"=24"); i++;}
		if ((x-y)*(z-w)==24) 
		{	System.out.println( "("+x+"-"+y+")*("+z+"-"+w+")=24"); i++;}
		if ((x+y)*z/w==24) 
			{System.out.println("("+x+"+"+y+")*"+z+"/"+w+"=24");    i++;} 
		if (x*y/(z-w)==24) 
			{System.out.println(x+"*"+y+"/"+"("+z+"-"+w+")"+"=24"); 	i++;}	
		if ((x+y)*(z+w)==24) 
			{System.out.println("("+x+"+"+y+")*("+z+"+"+w+")=24");i++;}
		if ((x-y)*z/w==24) 
		{	System.out.println("("+x+"-"+y+")*"+z+"/"+w+"=24"); 	i++;}
		if (x+(y+z)/w==24) 
			{System.out.println(x+"+"+"("+y+"+"+z+")"+"/"+w+"=24");	i++;}
		if (x*y/(z+w)==24) 
			{System.out.println(x+"*"+y+"/"+"("+z+"+"+w+")"+"=24"); i++;}
		if ((x+y)*z/w==24) 
			{System.out.println("("+x+"+"+y+")*"+z+"/"+w+"=24"); i++;}
		if ((x*y+z)*w==24) 
			{System.out.println("("+x+"*"+y+"+"+z+")"+"*"+w+"=24"); i++;}
		if ((x*y-z)/w==24) 
			{System.out.println("("+x+"*"+y+"-"+z+")"+"/"+w+"=24"); i++;}
		if ((x/y+z)*w==24) 
		{	System.out.println("("+x+"/"+y+"+"+z+")"+"*"+w+"=24"); i++;}
		if ((x*y)/z/w==24) 
			{System.out.println("("+x+"*"+y+")/"+z+"/"+w+"=24");i++;}
		if (x+y+z-w==24) 
			{System.out.println(x+"+"+y+"+"+z+"-"+w+"=24");	i++;}
		if (x-(y-z)+w==24) 
			{System.out.println(x+"-"+"("+y+"-"+z+")"+"+"+w+"=24");	i++;}
		if (x/(y-z/w)==24) 
			{System.out.println(x+"/"+"("+y+"-"+z+"/"+w+")"+"=24");	i++;}
		if (x+(y-z)*w==24) 
		{	System.out.println(x+"+"+"("+y+"-"+z+")*"+w+"=24");	i++;}
		if ((x+y+z)*w==24) 
		{	System.out.println("("+x+"+"+y+"+"+z+")*"+w+"=24"); 	i++;}
		if (x+y*z-w==24) 
		{	System.out.println(x+"+"+y+"*"+z+"-"+w+"=24"); 	i++;}
		if (x*y-z/w==24) 
			{System.out.println(x+"*"+y+"-"+z+"/"+w+"=24"); 	i++;}
		if ((x+y)*z-w==24) 
		{	System.out.println("("+x+"+"+y+")"+"*"+z+"-"+w+"=24"); i++;}
		if ((x-y/z)*w==24) 
		{	System.out.println("("+x+"-"+y+"/"+z+")*"+w+"=24"); i++;}
		if (x*(y+z)+w==24) 
		{	System.out.println(x+"*"+"("+y+"+"+z+")"+"+"+w+"=24");i++;}
		if ((x*y)+(z/w)==24) 
		{	System.out.println("("+x+"*"+y+")+("+z+"/"+w+")"+"=24");i++;}
		if ((x*y)/z-w==24) 
			{System.out.println("("+x+"*"+y+")/"+z+"-"+w+"=24"); i++;}
		if ((x+y/z)*w==24) 
			{System.out.println("("+x+"+"+y+"/"+z+")*"+w+"=24"); i++;}
		if ((x*y*z)/w==24) 
			{System.out.println("("+x+"*"+y+"*"+z+")/"+w+"=24");i++;}
		if ((x+y*z)/w==24) 
			{System.out.println("("+x+"+"+y+"*"+z+")/"+w+"=24");i++;}
		if (x+(y*z)+w==24) 
			{System.out.println(x+"+"+"("+y+"*"+z+")+"+w+"=24");i++;}
		if (x-(y+z)*w==24) 
			{System.out.println(x+"-("+y+"+"+z+")*"+w+"=24");i++;}
		if (x-(y-z)*w==24) 
		{	System.out.println(x+"-("+y+"-"+z+")*"+w+"=24");i++;}
		if (x+y/z+w==24) 
		{	System.out.println( x+"+"+y+"/"+z+"+"+w+"=24");i++;}
		if ((x-y)*z-w==24) 
		{	System.out.println( "("+x+"-"+y+"*"+z+"-"+w+"=24");i++;}
		if ((x+y)/z+w==24) 
		{	System.out.println( "("+x+"+"+y+"/"+z+"+"+w+"=24");i++;}
		if ((x*y)+z-w==24) 
		{	System.out.println("("+x+"*"+y+")+"+z+"-"+w+"=24");i++;}
		if ((x/y)+z+w==24) 
		{	System.out.println("("+x+"/"+y+")"+"+"+z+"+"+w+"=24");i++;}
		if ((x*y)*z-w==24) 
		{	System.out.println("("+x+"*"+y+")*("+z+")-"+w+"=24");i++;}
		if ((x*y+z)/w==24) 
		{	System.out.println("("+x+"*"+y+"+"+z+")/"+w+"=24");i++;}
		if (x+y+z*w==24) 
		{	System.out.println(x+"+"+y+"+"+z+"*"+w+"=24");i++;}
		if (x*(y-z)/w==24) 
		{	System.out.println(x+"*"+"("+y+"-"+z+")/"+w+"=24");i++;}
		if (x/y*z+w==24) 
			{System.out.println(x+"/"+y+"*"+z+"+"+w+"=24");i++;}
		if (x+y*z*w==24) 
		{	System.out.println(x+"+"+y+"*"+z+"*"+w+"=24");i++;}
		if (x+y+z+w==24) 
			{System.out.println(x+"+"+y+"+"+z+"+"+w+"=24");i++;}
		if ((x*y)/(z*w)==24) 
			{System.out.println("("+x+"*"+y+")/("+z+"*"+w+")"+"=24"); i++;}
		if (x+(y+z)*w==24) 
			{System.out.println(x+"+("+y+"+"+z+")*"+w+"=24"); i++;}
		if ((x-y)*z+w==24) 
			{System.out.println("("+x+"-"+y+")"+"*"+z+"+"+w+"=24"); i++;}
		if ((x+y+z)/w==24) 
			{System.out.println("("+x+"+"+y+"+"+z+")/"+w+"=24"); i++;}
		
		if ((x+y)*z+w==24) 
			{System.out.println( "("+x+"+"+y+")*"+z+"+"+w+"=24");i++;}
		if ((x*y)-(z+w)==24) 
			{System.out.println("("+x+"*"+y+")-("+z+"+"+w+")"+"=24");i++;}
		 if ((x-y-z)*w==24) 
		 { System.out.println("("+x+"-"+y+"-"+z+")*"+w+"=24"); i++;}
		if ((x*y)/z+w==24) 
			{System.out.println("("+x+"*"+y+")/"+z+"+"+w+"=24"); i++;}
		if ((x+y-z)*w==24) 
			{System.out.println("("+x+"+"+y+"-"+z+")*"+w+"=24"); 	i++;}
		if (x/(y/z-w)==24) 
			{System.out.println(x+"/("+y+"/"+z+"-"+w+")=24");  	i++;}
		if ((x*y)-(z*w)==24) 
			{System.out.println("("+x+"*"+y+")-("+z+"*"+w+")"+"=24");i++;}
		if(((x+y)*z)/w==24)
			{System.out.println("(("+x+y+")*"+z+")/"+w+"=24");i++;}
		System.out.println("共有以上"+i+"种方法");
		
	    return 0;
	}
	
}

三.调试及测试截屏

调试:
24点游戏
发现第一条式子和第三个式子是等效的。是因为代码中多了两条等效的if语句
xy-z+w和xy-(z-w)
24点游戏
24点游戏
xy-(z+w)和xy-z-w
24点游戏
24点游戏
分别去掉其中一条后
24点游戏
结果:
24点游戏

四.总结

  • 注意随机函数.nextInt()的取值范围。括号里若是x,则取值范围是[0,x)。

  • 对于一个四位数字和四个符号的式子总共有256种,其中要一些是等效的,去掉这些等效的后总共有72种。

  • 最后还要注意java中两个整数相除的结果与数学的除法法则不同,应该给四个数字取float型 。

程序运行出来后一定要多测试几次,才能找到逻辑错误的地方,然后一一改过来。