主题:[原创]刚写的扑克牌24点游戏,请高手指点!!
newzp
[专家分:200] 发布于 2005-09-16 00:42:00
请高手指点指点,以待改进!!!
本程序在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个回复)
沙发
newzp [专家分:200] 发布于 2005-09-15 15:44:00
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;
} }
}
}
板凳
onasp [专家分:5600] 发布于 2005-09-15 15:51:00
我运行了一下,不报错
但给的答案好象有问题
例如:12 12 10 4
//我在VC6.0上测试的
3 楼
newzp [专家分:200] 发布于 2005-09-15 16:48:00
谢谢2楼提出的问题
自己忽视了些东西
已经改进了,你再试试!!
这个程序是在dev C++上调试运行的!!
欢迎提出问题![em2]
4 楼
onasp [专家分:5600] 发布于 2005-09-15 16:59:00
呵呵刚才的问题解决了
但是 无解的情况 你还是显示有解,当然是个错解
例如:
1 1 1 1
还有 我用VC6.0测试的
VC6.0 的 conio.h中没有getchar()函数
有的是getch();
编译时报错
再有你的main函数 没有 return 0;
最后提一下,程序写的不错.算法我没看懂, 有时间一定仔细研究研究
加油啊
5 楼
newzp [专家分:200] 发布于 2005-09-15 17:32:00
程序是可以报错的,如1 1 1 1时,会报出不能成24!
我还是把它做了下修改,调试了的,肯定可以报错
我用的是Dev C++,这个软件好象所有的main()都得用int,即使没有return,
我也不知道为什么,反正如果写成void main(),编译时会错误提示,得将void改成int
还有,即使没有conio.h,在这个软件下用getchar()也不会出错,只是我习惯加上
呵,说声谢谢!!
6 楼
eastcowboy [专家分:25370] 发布于 2005-09-15 18:59:00
这是以前写的,采用了最暴力的穷举法。缺点是多余的括号不会去掉,不过不太影响。
经典的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 楼
newzp [专家分:200] 发布于 2005-09-16 00:22:00
楼上的程序不错,比我的短多了!!
我的差不多也是穷举法
原程序又做了修改,因为不能判断5 5 5 1和3 3 8 8
经过对输出等式函数的修改,能达到目的!
这个程序可以输入所有的等式,但当四个数字里有相同时,就可能会产生重复等式。
如果这四个数字都不相同,则应该不会有重复的等式。
欢迎各位继续调试,以待继续改进!!
8 楼
xuwenq [专家分:30] 发布于 2005-10-08 16:18:00
我把第一位的算法修改了几处.现在能报错了!
#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 楼
探路者二号 [专家分:1170] 发布于 2005-10-08 21:54:00
楼上的程序在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 楼
newzp [专家分:200] 发布于 2005-10-15 15:03:00
好长时间没来,加精了!
8楼的,程序本身可以报错啊,你改了之后在DevC++上编译通不过,错误信息就是9楼列出来的
呵呵,共同进步!!
我来回复