24点游戏

来源:互联网 发布:java destroy 编辑:程序博客网 时间:2024/05/18 01:30

24点游戏

常见游戏规则:

   从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11Q代表12K代表13A代表1),按照要求编程解决24点游戏。程序所满足的要求: 随机生成4个代表扑克牌牌面的数字字母程序自动列出所有可能算出24的表达式。

程序代码:

#include<iostream>  

#include<stdlib.h>  

#include<math.h>  
#include<time.h> 
using namespace std; 
int q=0;    //用来标记能否算出24  
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[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))形式  
                cout<<d<<sign[k]<<"("<<c<<sign[j]<<"("<<a<<sign[i]<<b<<"))=24 "<<endl;  
            else                  //(a*(b+c))*d形式  
                cout<<"("<<c<<sign[j]<<"("<<a<<sign[i]<<b<<"))"<<sign[k]<<d<<"=24"<<endl;  
        }  
        else 
if(k==4||k==5)       //a*((b+c)*d)形式  
cout<<d<<sign[k]<<"(("<<a<<sign[i]<<b<<")"<<sign[j]<<c<<")=24"<<endl;  
            else                 //((a+b)*c)*d形式  
cout<<"(("<<a<<sign[i]<<b<<")"<<sign[j]<<c<<")"<<sign[k]<<d<<"=24"<<endl;  
    }  
    if(type==2||type==3)         //(a+b)*(c+d)形式    
        cout<<"("<<a<<sign[i]<<b<<")"<<sign[k]<<"("<<c<<sign[j]<<d<<")=24"<<endl;   
}  


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(fabs(sum3-24)<0.001)     //判断能否运算出24,出现小数时,能够包含在内  
                    {  
                        q++;                    //标志能运算出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(fabs(sum3-24)<0.001)//出现小数时,能够包含在内  
                    {  
                        q++;               //标志能运算出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(fabs(sum3-24)<0.001)  //出现小数时,能够包含在内  
                        {  
                            q++;                  //标志能运算出24  
                            show(3,i,j,k,a,b,c,d);   //输出运算出24的表达式  
                        }  
                    }  
                }  
            }  
}  
  
void print()   //打印菜单
{
    cout<<"*******************************************************************"<<endl;
cout<<"*                        24点游戏                                 *"<<endl;
    cout<<"*  1.开始游戏                                                     *"<<endl;
cout<<"*  2.退出系统                                                     *"<<endl;
    cout<<"*                                                                 *"<<endl;
cout<<"*******************************************************************"<<endl;
}


int main()   //主函数  
{  
    int p,g,i,j,k,l;  
int flag2=1,flag3=0;      //用于标记是否退出循环
    srand((unsigned)time(0)); //随机数发生器的初始化函数
    int a[4];                 //存储4个整数 
do
{
        print();//打印菜单
        do
{
         cout<<"请输入你要进行的操作前的序号:"<<endl;
cin>>p;   //输入选项
         switch(p)
{
case 1:
{  
                for(i=0;i<4;i++)   
                    a[i]=rand()%13+1;        //产生4个随机数  
cout<<"4个数字分别为:";
                for(i=0;i<4;i++)  
                    cout<<a[i]<<" "<<" ";  
                cout<<endl;
if(q!=0)
cout<<"所有可能的表达式为:"<<endl;
                break;  
            }  
            case 2: 
                flag2=0;  //退出外层循环
                return 0; 
break;
            default: 
                {
cout<<"输入错误,请重新输入!"<<endl; 
flag3=1;
}
}
}while(flag3);
        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个数不能重复
                                    calculate(a[i],a[j],a[k],a[l]);//调用calculate函数,进行加,减,乘,除运算
        if(q==0)    //即不能经过运算得出24  
            cout<<"所给的数字无法算出24"<<endl; 
}while(flag2);
 return 0;  
}  

0 0
原创粉丝点击