//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)); }*/ }
最近下载更多
xingxing1234 LV10
2023年3月22日
floweyws LV6
2022年6月3日
leslie123456 LV4
2018年7月9日
lw19900921 LV25
2018年7月5日
wyx065747 LV67
2017年12月10日
半路出家 LV2
2014年11月13日
hello LV7
2014年6月17日
骑着猪猪去逛街 LV32
2014年1月7日
最代码官方 LV168
2012年10月31日
yihui1229 LV13
2012年10月31日
最近浏览更多
Dominick LV14
4月28日
xingxing1234 LV10
2023年3月22日
微信网友_6191697646571520 LV6
2022年11月24日
SZEPEZS LV8
2022年6月10日
floweyws LV6
2022年6月3日
liuqiang1314520
2020年10月16日
暂无贡献等级
675104182 LV14
2020年9月22日
hxb2000 LV1
2020年6月5日
a1677596408 LV23
2020年5月16日
lllpppwww LV5
2020年4月1日