24点游戏

1.题目:从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11Q代表12K代表13A代表1),按照要求编程解决24点游戏。

基本要求: 随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式,用擅长的语言(C/C++/Java或其他均可)实现程序解决问题。

          a.程序风格良好(使用自定义注释模板)

          b.列出表达式无重复。

2.程序分析:

这个对上个版本进行了优化,可以自己判断什么时候=24并且不会出现除数为0时报错的情况,能自由组合成为一组算式。

3.算法构造:

4.源代码:

import java.util.Random;

import java.util.Scanner;

public class Dian {

                     //用来标志能否运算出24

        int ck;

                 float arithmetic(int flag,float m,float n) //进行四则运算

                 {

                     switch(flag)  //判断运算符号,返回相对应的运算结果

                     {

                     case 0:

                         return (m+n);

                     case 1:

                         return (m-n);

                     case 2:

                         return (m*n);

                     case 3:

                         if (n==0)

                             return 10000;  //除数为0,则返回10000,使之不能运算出24

                         else

                             return (m/n);

                     case 4:

                         return (n-m);

                     case 5:

                         if (m==0)

                             return 10000;  //除数为0,则返回10000,使之不能运算出24

                         else

                             return (n/m);

                     default:

                         return 0;

                     }

                 }

                 void show(int type,int i,int j,int k,float a,float b,float c,float d)//利用参数type选择输出形式,利用参数i,j,k确定输出的运算符号

                 {

                     char sign[]=new char[6];  //定义运算符号数组

                     sign[0]='+';

                     sign[1]='-';

                     sign[2]='*';

                     sign[3]='/';

                     sign[4]='-'; //减法不符合交换律

                     sign[5]='/';  //除法不符合交换律

                     if (type==1)   //根据括号的类型做不同的输出

                     {

                         if(j==4 || j==5)  //减法和除法

                         {

                             if (k==4 || k==5)// a*(b*(c+d)) 形式

                                     System.out.println(d+sign[k]+"("+c+sign[j]+"("+a+sign[i]+b+"))=24");

                             else                 // (a*(b+c))*d 形式

                                     System.out.println("("+c+sign[j]+"("+a+sign[i]+b+"))"+sign[k]+d+"=24");

                         }

                         else if (k==4 || k==5)// a*((b+c)*d) 形式

                         {

                                 System.out.println(d+sign[k]+"(("+a+sign[i]+b+")"+sign[j]+c+")=24");

                         }

                         else   // ((a+b)*c)*d 形式

                                 System.out.println("(("+a+sign[i]+b+")"+sign[j]+c+")"+sign[k]+d+"=24");

                     }

                     if (type==2 || type==3)// (a+b)*(c+d) 形式

                     {

                             System.out.println("("+a+sign[i]+b+")"+sign[k]+"("+c+sign[j]+d+")=24");

                     }

                 }

                  void calculate(float a,float b,float c,float d) //进行加、减、乘、除运算

                         {

                             int i,j,k;

                             float sum1,sum2,sum3;   //储存 3 次两两运算的结果

                             for (i=0; i<4; i++)    // "+ - * /" 4个运算符号选3个,有4*4*4=64种

                                 for (j=0; j<6; j++)   // 3种运算符排列  有 3!=6 种

                                     for (k=0; k<6; k++)

                                     {

                                         if ((!(i==3 && b==0)) && (!(j==3 && c==0)) && (!(k==3 && d==0))) // 括号的类型为(())

                                         {

                                             // 3为做除法运算的标志,除数为 0 时,跳过  = =

                                             sum1=arithmetic(i,a,b);    //a,b做 以 i 为标志的运算,然后把值赋给sum1

                                             sum2=arithmetic(j,sum1,c);  //sum1,c做 以 j 为标志的运算,然后把值赋给sum2

                                             sum3=arithmetic(k,sum2,d);  //sum2,d做 以 k 为标志的运算,然后把值赋给sum3

                                             if (Math.abs(sum3-24)<0.001)//判断能否运算出24,出现小数时,能够包含在内

                                             {

                                                 ck++;            //标志能运算出24

                                                 show(1,i,j,k,a,b,c,d); // 输出运算出 24 的表达式

                                             }

                                         }

                                         if (k==2)// ()*()

                                         {

                                             sum1=arithmetic(i,a,b); //a,b做 以 i 为标志的运算,然后把值赋给sum1

                                             sum2=arithmetic(j,c,d); //sum1,c做 以 j 为标志的运算,然后把值赋给sum2

                                             sum3=sum1*sum2;

                                             if (Math.abs(sum3-24)<0.001)//出现小数时,能够包含在内

                                             {

                                                 ck++;              //标志能运算出24

                                                 show(2,i,j,k,a,b,c,d);  // 输出运算出 24 的表达式

                                             }

                                         }

                                         if (k==3)// 括号的类型为()()

                                         {

                                             sum1=arithmetic(i,a,b); //sum1,c做 以 j 为标志的运算,然后把值赋给sum2

                                             sum2=arithmetic(j,c,d); //sum1,c做 以 j 为标志的运算,然后把值赋给sum2

                                             if (sum2!=0)

                                             {

                                                 sum3=sum1/sum2;

                                                 if (Math.abs(sum3-24)<0.001)//出现小数时,能够包含在内

                                                 {

                                                     ck++;                 //标志能运算出24

                                                     show(3,i,j,k,a,b,c,d);   // 输出运算出 24 的表达式

                                                 }

                                             }

                                         }

                                     }

                         }

                

                 public static void main(String[] args) {

                 // TODO Auto-generated method stub

                         Dian d=new Dian();

                         {

                             int i,j,k,l;

                             int ck;

                           

                             int a[]=new int[4]; //储存所输入的 4个 整数

                             {

                         System.out.println("--------------------------------------------------------------- ");

                         System.out.println("***************************24点游戏**************************** ");

                         System.out.println("*********    请输入选项:************************* ");

                         System.out.println("***********************1、随机生成数字************************* "); 

                         System.out.println("***********************2、退出游戏************************* ");

                         System.out.println("------------------------------------------------------------------ ");

                         Scanner scanner = new Scanner(System.in);

                         int y=scanner.nextInt();

                         Random rand=new Random();

                                 while(true)

                                 {

                                     if(y==1)

                                     {

                                         for(i=0; i<4; i++)

                                         {

                                                  a[i] = rand.nextInt(13)+1;

                                         }

                                         for(i=0; i<4; i++)

                                         {

                                             System.out.println(a[i]+" ");

                                         }

                                         break;

                                     }

                                    

                                     else if(y==3)

                                     {

                                         System.out.println( "退出游戏!");

                                         return;

                                     }

                                     else

                                              System.out.println("输入错误,请重新输入!");

                                                  break;

                                                 

                                 }

                                 for (i=0; i<4; i++)    //4的排列 4!=24,每中情况调用calculate

                                     for (j=0; j<4; j++)

                                         if (j!=i)           //第2数和第1个数不能重复

                                             for (k=0; k<4; k++)

                                                 if (k!=j && k!=i) //第3数和第1,2个数不能重复

                                                     for (l=0; l<4; l++)

                                                         if (l!=i && l!=j && l!=k) //第4数和第1,2,3个数不能重复

                                                         {

                                                             d.calculate(a[i],a[j],a[k],a[l]);//调用calculate函数,进行进行加、减、乘、除运算

                                                         }

                                 if (d.ck==0) //即不能经过运算得出24

                                 {

                                          System.out.println("无法得出结果,请重新输入");

                                 }

                             }

                             return ;

                         }

 

        }

                

}

5.测试:

1.可得出结果测试

2.无法得出结果测试

6.调试:

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值