回 帖 发 新 帖 刷新版面

主题:[原创]刚写的扑克牌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个回复)

沙发

void out(double a, double b,double c,double d,double e, int i, int j,int k)
{
    if(e==24.0)
    {  
        if(k==0||k==1||k==3||k==4)  {
        cout<<"(";
        if(i==0) cout<<a<<"+"<<b;
        if(i==1) cout<<a<<"-"<<b;
        if(i==2) cout<<b<<"-"<<a;
        if(i==3) cout<<a<<"*"<<b;
        if(i==4) cout<<a<<"/"<<b;
        if(i==5) cout<<b<<"/"<<a;
        cout<<")";
        if(k==0) cout<<"+";
        if(k==1) cout<<"-";
        if(k==3) cout<<"*";
        if(k==4) cout<<"/";
        cout<<"(";
        if(j==0) cout<<c<<"+"<<d;
        if(j==1) cout<<c<<"-"<<d;
        if(j==2) cout<<d<<"-"<<c;
        if(j==3) cout<<c<<"*"<<d;
        if(j==4) cout<<c<<"/"<<d;
        if(j==5) cout<<d<<"/"<<c;  
        cout<<")"<<"="<<e<<endl;    }
        if(k==2||k==5)    {
        cout<<"(";  
        if(j==0) cout<<c<<"+"<<d;
        if(j==1) cout<<c<<"-"<<d;
        if(j==2) cout<<d<<"-"<<c;
        if(j==3) cout<<c<<"*"<<d;
        if(j==4) cout<<c<<"/"<<d;
        if(j==5) cout<<d<<"/"<<c;  
        cout<<")";        
        if(k==2) cout<<"-";
        if(k==5) cout<<"/";
        cout<<"(";
        if(i==0) cout<<a<<"+"<<b;
        if(i==1) cout<<a<<"-"<<b;
        if(i==2) cout<<b<<"-"<<a;
        if(i==3) cout<<a<<"*"<<b;
        if(i==4) cout<<a<<"/"<<b;
        if(i==5) cout<<b<<"/"<<a;
        cout<<")"<<"="<<e<<endl;     }
     }
     if(e!=24.0)
     {
        if(i==0||i==1||i==3||i==4)  {
        if(k==0||k==1||k==3||k==4)  {  
        if(k==0) cout<<"("<<e<<"-"<<"(";
        if(k==1) cout<<"("<<e<<"+"<<"(";
        if(k==3) cout<<"("<<e<<"/"<<"(";
        if(k==4) cout<<"("<<e<<"*"<<"(";
        if(j==0) cout<<c<<"+"<<d<<"))";
        if(j==1) cout<<c<<"-"<<d<<"))";
        if(j==2) cout<<d<<"-"<<c<<"))";
        if(j==3) cout<<c<<"*"<<d<<"))";
        if(j==4) cout<<c<<"/"<<d<<"))";
        if(j==5) cout<<d<<"/"<<c<<"))";
        if(i==0) cout<<"-"<<b<<"="<<24<<endl;
        if(i==1) cout<<"+"<<b<<"="<<24<<endl;
        if(i==3) cout<<"/"<<b<<"="<<24<<endl;
        if(i==4) cout<<"*"<<b<<"="<<24<<endl;
        }
        if(k==2||k==5)  {
        if(j==0) cout<<"(("<<c<<"+"<<d<<")";
        if(j==1) cout<<"(("<<c<<"-"<<d<<")";
        if(j==2) cout<<"(("<<d<<"-"<<c<<")";
        if(j==3) cout<<"(("<<c<<"*"<<d<<")";
        if(j==4) cout<<"(("<<c<<"/"<<d<<")";
        if(j==5) cout<<"(("<<d<<"/"<<c<<")";
        if(k==2) cout<<"-"<<e<<")";
        if(k==5) cout<<"/"<<e<<")";
        if(i==0) cout<<"-"<<b<<"="<<24<<endl;
        if(i==1) cout<<"+"<<b<<"="<<24<<endl;
        if(i==3) cout<<"/"<<b<<"="<<24<<endl;
        if(i==4) cout<<"*"<<b<<"="<<24<<endl;
        }  }
        if(i==2||i==5)  {
        if(k==0||k==1||k==3||k==4)  {  
        if(i==2) cout<<b<<"-"<<"("<<e;
        if(i==5) cout<<b<<"/"<<"("<<e;
        if(k==0) cout<<"-"<<"(";
        if(k==1) cout<<"+"<<"(";
        if(k==3) cout<<"/"<<"(";
        if(k==4) cout<<"*"<<"(";
        if(j==0) cout<<c<<"+"<<d<<"))"<<"="<<24<<endl;
        if(j==1) cout<<c<<"-"<<d<<"))"<<"="<<24<<endl;
        if(j==2) cout<<d<<"-"<<c<<"))"<<"="<<24<<endl;
        if(j==3) cout<<c<<"*"<<d<<"))"<<"="<<24<<endl;
        if(j==4) cout<<c<<"/"<<d<<"))"<<"="<<24<<endl;
        if(j==5) cout<<d<<"/"<<c<<"))"<<"="<<24<<endl;
        }
        if(k==2||k==5)   {
        if(i==2) cout<<b<<"-"<<"((";
        if(i==5) cout<<b<<"/"<<"((";
        if(j==0) cout<<c<<"+"<<d<<")";
        if(j==1) cout<<c<<"-"<<d<<")";
        if(j==2) cout<<d<<"-"<<c<<")";
        if(j==3) cout<<c<<"*"<<d<<")";
        if(j==4) cout<<c<<"/"<<d<<")";
        if(j==5) cout<<d<<"/"<<c<<")";  
        if(k==2) cout<<"-"<<e<<")"<<"="<<24<<endl;
        if(k==5) cout<<"/"<<e<<")"<<"="<<24<<endl;
     }  }           
  }   
}       

板凳

我运行了一下,不报错
但给的答案好象有问题

例如:12 12 10 4

//我在VC6.0上测试的

3 楼

谢谢2楼提出的问题
自己忽视了些东西
已经改进了,你再试试!!

这个程序是在dev C++上调试运行的!!

欢迎提出问题![em2]

4 楼

呵呵刚才的问题解决了
但是 无解的情况 你还是显示有解,当然是个错解
例如:
1 1 1 1

还有 我用VC6.0测试的
VC6.0 的 conio.h中没有getchar()函数
有的是getch();
编译时报错

再有你的main函数 没有 return 0;

最后提一下,程序写的不错.算法我没看懂, 有时间一定仔细研究研究
加油啊

5 楼

程序是可以报错的,如1 1 1 1时,会报出不能成24!
我还是把它做了下修改,调试了的,肯定可以报错
 
我用的是Dev C++,这个软件好象所有的main()都得用int,即使没有return,
我也不知道为什么,反正如果写成void main(),编译时会错误提示,得将void改成int

还有,即使没有conio.h,在这个软件下用getchar()也不会出错,只是我习惯加上

呵,说声谢谢!!


6 楼

这是以前写的,采用了最暴力的穷举法。缺点是多余的括号不会去掉,不过不太影响。
经典的5,5,5,1和3,3,8,8都可以顺利的求出结果。(因为是穷举嘛。)
输入:5,5,5,1
输出:24=5*[5-(1/5)]
输入:3,3,8,8
输出:24=8/[3-(8/3)]

#include<stdio.h>
#include<conio.h>
void main()
{    int number[4];
    int a,b,c,d,i,j,k,n;
    float temp;
    float cptall(int number[],int a,int b,int c,int d,int i,int j,int k,int n);
    void printall(int number[],int a,int b,int c,int d,int i,int j,int k,int n);
    for(n=0;n<4;n++)
    {    scanf("%d",number+n);
        //printf("number[%d]=%d\n",n,number[n]);
    }
    for(a=0;a<4;a++)
        for(b=0;b<4;b++)
        {    if(b==a)continue;
            for(c=0;c<4;c++)
            {    if(c==a || c==b)continue;
                for(d=0;d<4;d++)
                {    if(d==a || d==b || d==c)continue;
                    for(i=0;i<4;i++)
                        for(j=0;j<4;j++)
                            for(k=0;k<4;k++)
                                for(n=0;n<6;n++)
                                {    if((temp=cptall(number,a,b,c,d,i,j,k,n))<24.1 && temp>23.9)
                                    {    printall(number,a,b,c,d,i,j,k,n);
                                        getch();
                                        return;
                                    }
                                }
                }
            }
        }
    printf("No Answer Found.\n");
    getch();
    return;
}
float cptall(int number[],int a,int b,int c,int d,int i,int j,int k,int n)
{   float cpt(float x,float y,int m);
    switch(n)
    {   case 0:return cpt(cpt(cpt(number[a],number[b],i),number[c],j),number[d],k);//1 2 3
        case 1:return cpt(cpt(number[a],number[b],i),cpt(number[c],number[d],k),j);//1 3 2
        case 2:return cpt(cpt(number[a],cpt(number[b],number[c],j),i),number[d],k);//2 1 3
        case 3:return cpt(number[a],cpt(cpt(number[b],number[c],j),number[d],k),i);//2 3 1
        case 4:return cpt(cpt(number[a],number[b],i),cpt(number[c],number[d],k),j);//3 1 2
        case 5:return cpt(number[a],cpt(number[b],cpt(number[c],number[d],k),j),i);//3 2 1
        default:return 0;
    }
}
float cpt(float x,float y,int m)
{   switch(m)
    {    case 0:return x+y;
        case 1:return x-y;
        case 2:return x*y;
        case 3:    if(y<0.1 && y>-0.1)return 0;    else return float(x)/float(y);
        default:return 0;
    }
}
void printall(int number[],int a,int b,int c,int d,int i,int j,int k,int n)
{   char op1,op2,op3;
    op1=(i==0?'+':(i==1?'-':(i==2?'*':'/')));
    op2=(j==0?'+':(j==1?'-':(j==2?'*':'/')));
    op3=(k==0?'+':(k==1?'-':(k==2?'*':'/')));
    switch(n)
    {    case 0:printf("24=[(%d%c%d)%c%d]%c%d\n",number[a],op1,number[b],op2,number[c],op3,number[d]);break;
        case 1:printf("24=(%d%c%d)%c(%d%c%d)\n",number[a],op1,number[b],op2,number[c],op3,number[d]);break;
        case 2:printf("24=[%d%c(%d%c%d)]%c%d\n",number[a],op1,number[b],op2,number[c],op3,number[d]);break;
        case 3:printf("24=%d%c[(%d%c%d)%c%d]\n",number[a],op1,number[b],op2,number[c],op3,number[d]);break;
        case 4:printf("24=(%d%c%d)%c(%d%c%d)\n",number[a],op1,number[b],op2,number[c],op3,number[d]);break;
        case 5:printf("24=%d%c[%d%c(%d%c%d)]\n",number[a],op1,number[b],op2,number[c],op3,number[d]);break;
        default:printf("error(%d).\n",n);break;
    }
}

7 楼

楼上的程序不错,比我的短多了!!
我的差不多也是穷举法

原程序又做了修改,因为不能判断5 5 5 1和3 3 8 8
经过对输出等式函数的修改,能达到目的!

这个程序可以输入所有的等式,但当四个数字里有相同时,就可能会产生重复等式。
如果这四个数字都不相同,则应该不会有重复的等式。

欢迎各位继续调试,以待继续改进!!


8 楼

我把第一位的算法修改了几处.现在能报错了!



#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];

void  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;
    } }     
    //getche();
    //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)  
          {
              
              if(t[j]!=0)
                  x=s[i]/t[j];
              else return 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==5)
          {
              if(s[i]!=0)
                  x=t[j]/s[i];
              else return 0;
              //x=t[j]/s[i];
            if(x==e)
            {
                cout<<"这四个数能成24,具体运算如下:"<<endl;
                out(a,b,c,d,e,i,j,k); return 1;
            }
          }
        }}}          
        return 0;    
}

//第二个输出函数没有错误,没有修改;

上面有两位,我感觉第一位的程序细腻,很符号像我们这个档次的看,而且能够实现一题多解,敢情瞒好的.

第二位的程序太浓缩了,语言的疑聚度太高了,C语言的运用程度达到一定水准,但感觉它对小数也来求解,跟我们日常玩的24点出处好大,都是INT型的,但程序短小精悍,值得顶膜!

9 楼

楼上的程序在Dev_C++下编译的报错:

3 C:\Dev-Cpp\include\c++\3.3.1\backward\iostream.h:31,               from E:\Dev_C++\24pointpoke2.cpp In file included from C:/Dev-Cpp/include/c++/3.3.1/backward/iostream.h:31,               from E:/Dev_C++/24pointpoke2.cpp

2 C:\Dev-Cpp\include\c++\3.3.1\backward\backward_warning.h:32 #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <sstream> instead of the deprecated header <strstream.h>. To disable this warning use -Wno-deprecated.

  [Linker error] undefined reference to `out(double, double, double, double, double, int, int, int)'
  [Linker error] undefined reference to `out(double, double, double, double, double, int, int, int)'
  [Linker error] undefined reference to `out(double, double, double, double, double, int, int, int)'
  [Linker error] undefined reference to `out(double, double, double, double, double, int, int, int)'
  [Linker error] undefined reference to `out(double, double, double, double, double, int, int, int)'
24pointpoke2.cpp C:\DOCUME~1\mypc\LOCALS~1\Temp\ccmoaaaa.o(.text+0xab3) more undefined references to `out(double, double, double, double, double, int, int, int)' follow

10 楼

好长时间没来,加精了!

8楼的,程序本身可以报错啊,你改了之后在DevC++上编译通不过,错误信息就是9楼列出来的

呵呵,共同进步!!

我来回复

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