回 帖 发 新 帖 刷新版面

主题:[原创]刚写的扑克牌24点游戏,请高手指点!!

请高手指点指点,以待改进!!!
本程序在dev c++上通过调试:

#include <iostream.h>
#include <conio.h>
int judge(double a,double b, double c, double d, double e);
void out(double a,double b, double c,double d, double e, int i, int j,int k);
double s[6],t[6];
int main()
{
    double a, b, c, d;
    int m,n=0;
    cout<<"       扑克牌24点小游戏: "<<endl;
    while(1) {
    cout<<endl<<"开始游戏请按1,退出游戏请按0:  ";
    cin>>m;
    if(m==0) {cout<<"呵,下次再来玩,bye^.^!"; break; }
    if(m==1) {
    cout<<"输入四个1~13之间的数:"<<endl;
    cin>>a>>b>>c>>d;
    if(a<1||a>13||b<1||b>13||c<1||c>13||d<1||d>13)
    {
       cout<<"输入数据错误,结束本次游戏!"<<endl;
       continue;
    }    
    if(judge(a,b,c,d,24.0)) n=1;
    if(judge(a,c,b,d,24.0)) n=1;
    if(judge(a,d,b,c,24.0)) n=1;
    if(judge(24.0,a,b,c,d)) n=1;  
    if(judge(24.0,b,c,a,d)) n=1;  
    if(judge(24.0,c,b,a,d)) n=1;
    if(judge(24.0,a,b,d,c)) n=1;
    if(judge(24.0,b,d,a,c)) n=1;
    if(judge(24.0,d,b,a,c)) n=1;
    if(judge(24.0,a,d,c,b)) n=1;
    if(judge(24.0,c,d,a,b)) n=1;
    if(judge(24.0,d,c,a,b)) n=1;
    if(judge(24.0,b,d,c,a)) n=1;
    if(judge(24.0,c,b,d,a)) n=1;
    if(judge(24.0,d,b,c,a)) n=1;
    if(n!=1)  cout<<"这四个数不能成24"<<endl;
    n=0;
    } }     
    getchar();
    getchar();
}         
int judge(double a, double b, double c, double d, double e)
{
    int i,j,k;
    double x;
    s[0]=a+b;
    s[1]=a-b;
    s[2]=b-a;
    s[3]=a*b;
    s[4]=a/b;   
    s[5]=b/a;   
    t[0]=c+d;
    t[1]=c-d;
    t[2]=d-c;
    t[3]=c*d;
    t[4]=c/d;  
    t[5]=d/c;
    for(i=0; i<6; i++){
      for(j=0; j<6; j++){
        for(k=0;k<6;k++) {
          if(k==0)  x=s[i]+t[j];
            if(x==e)
            {              
                cout<<"这四个数能成24,具体运算如下:"<<endl;
                out(a,b,c,d,e,i,j,k);  return 1;
            }
          if(k==1)  x=s[i]-t[j];
            if(x==e)
            {
                cout<<"这四个数能成24,具体运算如下:"<<endl;
                out(a,b,c,d,e,i,j,k);  return 1;
            }
          if(k==2)  x=t[j]-s[i];
            if(x==e)
            {
                cout<<"这四个数能成24,具体运算如下:"<<endl;
                out(a,b,c,d,e,i,j,k);  return 1;
            }
          if(k==3)  x=s[i]*t[j];
            if(x==e)
            {
                cout<<"这四个数能成24,具体运算如下:"<<endl;
                out(a,b,c,d,e,i,j,k);  return 1;
            }
          if(k==4)  x=s[i]/t[j];
            if(x==e)
            {
                cout<<"这四个数能成24,具体运算如下:"<<endl;
                out(a,b,c,d,e,i,j,k); return 1;
            }
          if(k==5)  x=t[j]/s[i];
            if(x==e)
            {
                cout<<"这四个数能成24,具体运算如下:"<<endl;
                out(a,b,c,d,e,i,j,k); return 1;
            }
        }}}          
        return 0;    
}                

回复列表 (共14个回复)

11 楼

我必的程序是在VISUAL C++ 6.0下编译通过.

你原来的程序如果输入相同的数据,它就会报错!

另外dev c++与visual c++好像有差别!

对于out 函数(我没有完整的将程序拷贝)没有写上去,我其实没有修改多少

只不过防止a/b 中b=0的情况!

12 楼

我必须申明我没有将作者:newzp的程序完整拷贝.

只是将a/b中b=0的情况防止了一下!

如果将上述程序完整的拷贝,在visual c++ 6.0是编译通过的!

唯一的缺憾是算法有重复的可能.

如6,6,6,6表示成24就用加法就会显示4次!感觉这问题还难避免!

13 楼

我没有将作者:nwzp的程序完整拷贝(我的程序是在visual c++下),造成out 函数没定义;

感觉程序还是有一个缺点就是如:

6,6,6,6表示成24,用加法就会显示4次.

重复问题不知如何避免.

14 楼

??
没啊,输入相同的数据可以判断啊!!如输入四个1或者四个2,不能成24,报错。但输入四个3或者四个4等等,可以成24啊!!

[em54],当初只考虑将怎么成24的表达式输出来,确实没有考虑到重复的问题,如果输入数相同时,重复的可能性很大。当把两个相同的数位置换了时,从表面上看没有变化,但从次序关系看已经变了,而我是按次序关系来考虑输出的,所以会重复。

谢谢楼上的指点,这个算法确有不妥之处,现在太忙了,以后有时间了会改的试试现在太忙了。

估计是编译器的问题,我只用过dev c++,但我也感觉到它的有些与其他的不同。好好的一个程序能在TC3.0上运行,但在上面硬是说有什么问题。最明显的一点,就是main()不管是否有返回值,它前面必须加int ,而不能是其他的。

我来回复

您尚未登录,请登录后再回复。点此登录或注册