最代码广告位
//import java.util.Random;

/*
 * 检查类,【本游戏的核心算法】
 * ①用于检查随机生成的4个1~10的随机数能否通过运算得到24,
 * 如果不能则再次产生4个随机数,
 * 直到产生能够运算得到24的随机数为止
 * ②检查用户输入的表达式是否合法或运算结果是否正确
 */
public class Check { 
	 protected String outputs=new String();
	/*
	 * 返回随机数全排列的方法,
	 * 对产生的四个随机数进行全排列,
	 * 共有4*3*2*1=24种情况,
	 * 考虑到运行效率,
	 * 直接将各种情况罗列出来,
	 * 没有用递归全排列的方法,
	 * 该方法通过形参i控制选取24种排列的第几种,
	 * 返回四个数的一维浮点型数组
	 */
	private float[] number(float [] a,int i){
		 final float[] Array = new float[4];
			switch(i){
			case 0 : Array[0]=a[0];Array[1]=a[1];Array[2]=a[2];Array[3]=a[3];break;
			case 1 : Array[0]=a[0];Array[1]=a[1];Array[2]=a[3];Array[3]=a[2];break;
			case 2 : Array[0]=a[0];Array[1]=a[2];Array[2]=a[1];Array[3]=a[3];break;
			case 3 : Array[0]=a[0];Array[1]=a[2];Array[2]=a[3];Array[3]=a[1];break;
			case 4 : Array[0]=a[0];Array[1]=a[3];Array[2]=a[2];Array[3]=a[1];break;
			case 5 : Array[0]=a[0];Array[1]=a[3];Array[2]=a[1];Array[3]=a[2];break;
			case 6 : Array[0]=a[1];Array[1]=a[0];Array[2]=a[2];Array[3]=a[3];break;
			case 7 : Array[0]=a[1];Array[1]=a[0];Array[2]=a[3];Array[3]=a[2];break;
			case 8 : Array[0]=a[1];Array[1]=a[2];Array[2]=a[0];Array[3]=a[3];break;
			case 9 : Array[0]=a[1];Array[1]=a[2];Array[2]=a[3];Array[3]=a[0];break;
			case 10: Array[0]=a[1];Array[1]=a[3];Array[2]=a[2];Array[3]=a[0];break;
			case 11: Array[0]=a[1];Array[1]=a[3];Array[2]=a[0];Array[3]=a[2];break;
			case 12: Array[0]=a[2];Array[1]=a[1];Array[2]=a[0];Array[3]=a[3];break;
			case 13: Array[0]=a[2];Array[1]=a[1];Array[2]=a[3];Array[3]=a[0];break;
			case 14: Array[0]=a[2];Array[1]=a[0];Array[2]=a[1];Array[3]=a[3];break;
			case 15: Array[0]=a[2];Array[1]=a[0];Array[2]=a[3];Array[3]=a[1];break;
			case 16: Array[0]=a[2];Array[1]=a[3];Array[2]=a[0];Array[3]=a[1];break;
			case 17: Array[0]=a[2];Array[1]=a[3];Array[2]=a[1];Array[3]=a[0];break;
			case 18: Array[0]=a[3];Array[1]=a[1];Array[2]=a[2];Array[3]=a[0];break;
			case 19: Array[0]=a[3];Array[1]=a[1];Array[2]=a[0];Array[3]=a[2];break;
			case 20: Array[0]=a[3];Array[1]=a[2];Array[2]=a[1];Array[3]=a[0];break;
			case 21: Array[0]=a[3];Array[1]=a[2];Array[2]=a[0];Array[3]=a[1];break;
			case 22: Array[0]=a[3];Array[1]=a[0];Array[2]=a[2];Array[3]=a[1];break;
			case 23: Array[0]=a[3];Array[1]=a[0];Array[2]=a[1];Array[3]=a[2];break;
			}
		 return  Array ;
	 }
	

	
	
	/*
	 * 返回运算符排列的方法,
	 * 四个数进行运算时需要三个运算符,
	 * 三个运算符的所有可能的排列是4^3=64种,
	 * 该方法直接返回64种运算符,
	 * 保存在二维字符型数组 
	 */
	private char [][]Calculate(){
		 final char [][] Char=new char [64][3];//返回的运算符数组
		final int [][] ar=new int [64][3];//控制返回三个运算符
		int t=0;
		stop:for(int i=0;i<4;i++){
			   for(int j=0;j<4;j++){
				 for(int k=0;k<4;k++){	
					ar[t][0]=i;
					ar[t][1]=j;
					ar[t][2]=k;			
					for(int l=0;l<3;l++){//i,j,k的范围都是0~3,通过switch,将0~3分别映射为+,―,*,/
						switch(ar[t][l]){
						case 0:Char[t][l]='+';break;
						case 1:Char[t][l]='-';break;
						case 2:Char[t][l]='*';break;
						case 3:Char[t][l]='/';break;
						}
					}
					t++;
					if(t==64)
						break stop;	//通过t的自增控制循环的结束		
				}
			}
		}	
		return Char;
	}	

	
	
	
	
	/*
	 * 返回计算结果的方法,
	 * 对两个随机数进行运算
	 */
	private float Run(float a,float b,char c){
		float sum=0f;
		switch(c){
		case '+': sum=a+b;break; //将'+'字符转换成加法运算
		case '-': sum=a-b;break; //将'-'字符转换成减法运算
		case '*': sum=a*b;break; //将'*'字符转换成乘法运算
		case '/': sum=a/b;break; //将'/'字符转换成除法运算
		}
		return sum;		
	}

    
	
	
	
	
	/*
     * check方法
     * 如果可以运算得到24,
     * 返回true,
     * 否则返回false
     * 为了节省运行时间,
     * 运算时,
     * 只要某一次运算结果是24就直接返回true
     * 只有产生的随机数不能运算得到24时才会运行所有情况
     */
	 protected  boolean check(float[] myStatus){
		
    	float num[]=new float [4];
    	char [][] allcha=new char [64][3];
    	 allcha=Calculate();
    	for(int i=0;i<24;i++){
    	    for(int j=0;j<64;j++){
    			    float x;
    			   num=number(myStatus,i);
    			   
    			   /* 
    			    * 注释解析:
    			    * ABCD表示四个参与运算的随机数   
    			    * ①②③表示运算顺序	   
    			    */
    			   x=Run(Run(Run(num[0],num[1],allcha[j][0]),num[2],allcha[j][1]),num[3],allcha[j][2]);
    			   if(x==24.0f){
    				   //System.out.println("(("+num[0]+allcha[j][0]+num[1]+")"+allcha[j][1]+num[2]+")"+allcha[j][2]+num[3]);
    				   outputs="(("+(int)num[0]+allcha[j][0]+(int)num[1]+")"+allcha[j][1]+(int)num[2]+")"+allcha[j][2]+(int)num[3];
    				   System.out.println(outputs);
    				   return true;
    				   }
    			      // 以上运算类型为:((A①B)②C)③D
    		       x=Run(Run(num[0],num[1],allcha[j][0]),Run(num[2],num[3],allcha[j][2]),allcha[j][1]);
    		       if(x==24.0f){ 
    		    	   //System.out.println("("+num[0]+allcha[j][0]+num[1]+")"+allcha[j][1]+"("+num[2]+allcha[j][2]+num[3]+")");
    		    	   outputs="("+(int)num[0]+allcha[j][0]+(int)num[1]+")"+allcha[j][1]+"("+(int)num[2]+allcha[j][2]+(int)num[3]+")";
    		    	   System.out.println(outputs);
    		    	   return true;
    				   }
    			      //以上运算类型为:(A①B)②(C①D)
    		       x=Run(Run(num[0],Run(num[1],num[2],allcha[j][1]),allcha[j][0]),num[3],allcha[j][2]);
    		       if(x==24.0f){
    		    	   //System.out.println("("+num[0]+allcha[j][0]+"("+num[1]+allcha[j][1]+num[2]+"))"+allcha[j][2]+num[3]);
    		    	   outputs="("+(int)num[0]+allcha[j][0]+"("+(int)num[1]+allcha[j][1]+(int)num[2]+"))"+allcha[j][2]+(int)num[3];
    		    	   System.out.println(outputs);
    		    	   return true;
    				   }
    			      //以上运算类型为:(A②(B①C))③D
    		       x=Run(num[0],Run(Run(num[1],num[2],allcha[j][1]),num[3],allcha[j][2]),allcha[j][0]);
    		       if(x==24.0f){
    		    	   //System.out.println(num[0]+""+allcha[j][0]+"(("+num[1]+allcha[j][1]+num[2]+")"+allcha[j][2]+num[3]+")");
    		    	   outputs=(int)num[0]+""+allcha[j][0]+"(("+(int)num[1]+allcha[j][1]+(int)num[2]+")"+allcha[j][2]+(int)num[3]+")";
    		    	   System.out.println(outputs);
    		    	   return true;
    		       }
    			     //以上运算类型为:A③((B①C)②D)
    		       x=Run(num[0],Run(num[1],Run(num[2],num[3],allcha[j][2]),allcha[j][1]),allcha[j][0]);
    		       if(x==24.0f){ 
    		    	   //System.out.println(num[0]+""+allcha[j][0]+"("+num[1]+allcha[j][1]+"("+num[2]+allcha[j][2]+num[3]+"))");
    		    	   outputs=(int)num[0]+""+allcha[j][0]+"("+(int)num[1]+allcha[j][1]+"("+(int)num[2]+allcha[j][2]+(int)num[3]+"))";
    		    	   System.out.println(outputs);
    		    	   return true;
    				   }
    			     //以上运算类型为:A③(B②(C①D))
    	   }
    	}
    	return false;					
    }  
    
    
    
   
    
	 /*
     * 把字符串的数学表达式计算出结果
     */    
   protected float string_float(String s0){
		char s[]=new char[s0.length()];
		float sum=0;//计算结果
		float num[]={-1,-1,-1,-1};	//记录数学表达式中的数	
		int calculate_location[]={-1,-1,-1};
		char calculate[]={'a','a','a'};//记录数学表达式中的运算符
		int calculate_priority[]={3,2,1};//设置优先级		
		int abc;
		for(int i=0;i<s.length;i++)
			s[i]=s0.charAt(i);
		for(int i=0,j=0,l=0;i<s.length;i++){//分析字符串
			if(s[i]>='0'&&s[i]<='9')
			{//得到数学表达式中的数
				num[j]=s[i]-48;				
				if(i+1<s.length)
					if(s[i+1]>='0'&&s[i+1]<='9')
					{
						num[j]=num[j]*10+s[i+1]-48;
						i++;
					}
				j++;
				continue;
			}			
			if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/')//得到表达式中的运算符				
				if(calculate_location[l]==-1)
				{
					calculate_location[l]=i;
					calculate[l]=s[i];
					l++;
				}		
		}
		for(int i=0,i0=0,j=0;i<s.length;i++)
		{//分析表达式的运算优先级
			if(s[i]==')')			
			{//	先算括号里的表达式
				for(i0=i;s[i0]!='(';i0--)				
					if(s[i0]=='+'||s[i0]=='-'||s[i0]=='*'||s[i0]=='/')					
						for(j=0;j<3;j++)
							if(calculate_location[j]==i0)
								calculate_priority[j]+=8;
				s[i0]='s';
			}		
			if(s[i]=='*'||s[i]=='/')//再算乘除	
				for(j=0;j<3;j++)
					if(calculate_location[j]==i)
						calculate_priority[j]+=4;			
		}		
		
		/*
		 * 此处的if是把刚才分析的运算优先级用一个int的变量abc记录下来,如123则表示第三个运算符
		 * 运算级最高,其实是第二个,最后是第一个
		 */
		if(calculate_priority[0]>calculate_priority[1])
		{
			if(calculate_priority[0]>calculate_priority[2])
				calculate_priority[0]=-1;
			else
				calculate_priority[2]=-1;
		}
		else
		{
			if(calculate_priority[1]>calculate_priority[2])
				calculate_priority[1]=-1;
			else
				calculate_priority[2]=-1;
		}
		if(calculate_priority[0]<0)
		{
			if(calculate_priority[1]>calculate_priority[2])
			{
				calculate_priority[1]=-2;
				calculate_priority[2]=-3;
			}
			else
			{
				calculate_priority[1]=-3;
				calculate_priority[2]=-2;
			}
		}
		else
		{
			if(calculate_priority[1]<0)
			{
				if(calculate_priority[0]>calculate_priority[2])
				{
					calculate_priority[0]=-2;
					calculate_priority[2]=-3;
				}
				else
				{
					calculate_priority[0]=-3;
					calculate_priority[2]=-2;
				}
			}
			else
			{
				if(calculate_priority[0]>calculate_priority[1])
				{
					calculate_priority[0]=-2;
					calculate_priority[1]=-3;
				}
				else
				{
					calculate_priority[0]=-3;
					calculate_priority[1]=-2;
				}
			}
		}		
		abc=calculate_priority[0]*100+calculate_priority[1]*10+calculate_priority[2];
		abc=-abc;		
		
		//根据刚才分析的运算级,计算出结果,保存在sum里面
		switch(abc){
		case 123:sum=Run(Run(Run(num[0],num[1],calculate[0]),num[2],calculate[1]),num[3],calculate[2]);break;
		case 132:sum=Run(Run(num[0],num[1],calculate[0]),Run(num[2],num[3],calculate[2]),calculate[1]);break;
		case 213:sum=Run(Run(num[0],Run(num[1],num[2],calculate[1]),calculate[0]),num[3],calculate[2]);break;
		case 231:sum=Run(Run(num[0],num[1],calculate[0]),Run(num[2],num[3],calculate[2]),calculate[1]);break;
		case 312:sum=Run(num[0],Run(Run(num[1],num[2],calculate[1]),num[3],calculate[2]),calculate[0]);break;
		case 321:sum=Run(num[0],Run(num[1],Run(num[2],num[3],calculate[2]),calculate[1]),calculate[0]);break;
		}
		
		return sum;//返回结果
	}
    
    
    

  
  
  //测试区
    /* public static void main(String[]args){
    	Check c=new Check();
    	Float [] test=new Float [4];
    	Random ran=new Random();
    	for(int i=0;i<4;i++)
    		test[i]=(float) ((int)(ran.nextFloat()*10+1));
    	//c.check(test);
    	System.out.println(test[0]+"  "+test[1]+"  "+test[2]+"  "+test[3]+"  "+c.check(test));
    	test[0]=5.0f;
    	test[1]=10.0f;
    	test[2]=2.0f;
    	test[3]=10.0f;
    	//c.check(test);
    	System.out.println(test[0]+"  "+test[1]+"  "+test[2]+"  "+test[3]+"  "+c.check(test));
    	
    }*/
}
最近下载更多
leslie123456 LV42018年7月9日
月亮
lw19900921 LV242018年7月5日
太阳月亮月亮
wyx065747 LV642017年12月10日
皇冠
半路出家 LV22014年11月13日
星星星星
hello LV72014年6月17日
月亮星星星星星星
骑着猪猪去逛街 LV322014年1月7日
太阳太阳
最代码官方 LV1512012年10月31日
皇冠皇冠太阳月亮星星星星星星
yihui1229 LV132012年10月31日
月亮月亮月亮星星
最近浏览更多
hxb2000前天
暂无贡献等级
a1677596408 LV195月16日
太阳星星星星星星
lllpppwww LV54月1日
月亮星星
SIMONZSK LV32019年12月16日
星星星星星星
地尔库特 LV52019年11月10日
月亮星星
xmjying LV132019年9月16日
月亮月亮月亮星星
最代码安逸 LV132019年9月3日
月亮月亮月亮星星
baizhongcai LV242019年6月14日
太阳月亮月亮
375163374 LV12018年9月4日
星星
leslie123456 LV42018年7月9日
月亮
顶部客服微信二维码底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友