24点游戏
24点游戏是经典的纸牌益智游戏。
常见游戏规则:
从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏。
# include<stdio.h>
# include <stdlib.h>
# include <time.h> //需引用的头文件
FILE * fp;
void main()
{
int fun;
void play(); //声明函数
srand((unsigned)time(NULL)); //随机数
fp=fopen("TopList.txt","wb");
printf("24点游戏欢迎您!\n\n");
while(1) //主界面
{
printf("请输入相应选项:1开始游戏,0结束游戏\n");
scanf("%d",&fun);
if(fun==1)
play();
else
break;
}
printf("谢谢使用");
}
//定义play()函数
void play()
{
int k,i,j,x=0,y=0,s[3],m,n,c,q,f=0,e,p[4];//p[4]数组存放输出时的四个运算数,
//s[3]分别存放运算结果
int a[4],newp[4],b[4]={1,2,3,4};//a[4]数组存放随机生成的四个数
char p1[3],sign; //定义存储运算符的字符数组
printf("四个数是:");
for(i=0;i<4;i++)
{
a[i]=rand()%13+1; //获得随机数
printf("%d ",a[i]);
}
printf("\n");
for(i=0;i<3;i++)
{
k=i+1;
for(n=1;n<=(3-i)*4;n++)
{
if(((n-1)%4)==0&&n!=1)
k++;
switch(b[x]) //两个数进行运算
{
case 1:s[0]=a[i]+a[k];sign='+';break;
case 2:s[0]=a[i]-a[k];sign='-';break;
case 3:s[0]=a[i]*a[k];sign='*';break;
case 4:s[0]=a[i]/a[k];sign='/';break;
}
if((x=n%4)==0&&a[i]%a[k]!=0&&a[k]%a[i]!=0||a[k]==0||a[i]==0) //当除数是0时退出
continue;
if(n%4==0&&a[k]%a[i]==0)
{
p[0]=a[k];p1[0]=sign;p[1]=a[i];
} //满足条件就交换顺序
else
{
p[0]=a[i];p1[0]=sign;p[1]=a[k];}
for(e=0;e<4;e++) //找出其余两个数
{
if(e!=i&&e!=k)
{
f++;
newp[f]=a[e];
}
}
newp[0]=s[0];
newp[3]=newp[1]; //存放第一次两个数的运算和与剩下两个数
for(j=0;j<2;j++)
{
q=j+1;
for(m=1;m<=(2-j)*4;m++)
{
if(((m-1)%4)==0&&m!=1)
q++;
switch(b[y])
{
case 1:s[1]=newp[j]+newp[q];sign='+';break;
case 2:s[1]=newp[j]-newp[q];sign='-';break;
case 3:s[1]=newp[j]*newp[q];sign='*';break;
case 4:s[1]=newp[j]/newp[q];sign='/';break;
}
if((y=m%4)==0&&newp[j]%newp[q]!=0&&newp[q]%newp[j]!=0||newp[j]==0||newp[q]==0)
continue;
else
if(m%4==0&&newp[q]%newp[j]==0)
s[1]=newp[q]/newp[j];
if(j==0)
{
p1[1]=sign;
p[2]=newp[q];
for(c=0;c<4;c++)
{
switch(b[c])
{
case 1:s[2]=s[1]+newp[q+1];sign='+';break;
case 2:s[2]=s[1]-newp[q+1];sign='-';break;
case 3:s[2]=s[1]*newp[q+1];sign='*';break;
case 4:s[2]=s[1]/newp[q+1];sign='/';break;
}
if(c==3&&s[1]%newp[q+1]!=0&&newp[q+1]%s[1]!=0||newp[q+1]==0||s[1]==0)
continue;
else
if(c==3&&newp[q+1]%s[1]==0)
s[2]=newp[q+1]/s[1];
if(s[2]==24)
{
p1[2]=sign;
p[3]=newp[q+1];
if((m%4)==0&&newp[q]%newp[j]==0&&c==3&&newp[q+1]%s[1]==0) //控制输出顺序和运算优先级
printf("(%d%c(%d%c(%d%c%d)))=%d\n",p[3],p1[2],p[2],p1[1],p[0],p1[0],p[1],s[2]);
else
if((m%4)==0&&newp[q]%newp[j]==0&&c==3&&s[1]%newp[q+1]==0)
printf("(%d%c(%d%c%d))%c%d=%d\n",p[2],p1[1],p[0],p1[0],p[1],p1[2],p[3],s[2]);
else
if((m%4)==0&&newp[j]%newp[q]==0&&c==3&&newp[q+1]%s[1]==0)
printf("%d%c((%d%c%d)%c%d)=%d\n",p[3],p1[2],p[0],p1[0],p[1],p1[1],p[2],s[2]);
else
printf("(((%d%c%d)%c%d)%c%d)=%d\n",p[0],p1[0],p[1],p1[1],p[2],p1[2],p[3],s[2]);
}
}
}
if(j==1)
{
if((m%4)==0&&(newp[q]%newp[j]!=0)&&(newp[j]%newp[q]!=0)||((newp[j]==0||newp[q]==0)&&s[0]!=24))
continue;
else
{
if(m%4==0&&newp[q]%newp[j]==0) //满足条件就交换顺序
{
p[2]=newp[q];
p1[1]=sign;
p[3]=newp[j];
}
else
{
p[2]=newp[j];
p1[1]=sign;
p[3]=newp[q];
}
}
for(c=0;c<4;c++)
{
switch(b[c])
{
case 1:s[2]=s[1]+s[0];sign='+';break;
case 2:s[2]=s[1]-s[0];sign='-';break;
case 3:s[2]=s[1]*s[0];sign='*';break;
case 4:s[2]=s[1]/s[0];sign='/';break;
}
if(c==3&&s[1]%s[0]!=0&&s[0]%s[1]!=0||s[0]==0||s[1]==0)
break;
else
if(c==3&&s[0]%s[1]==0)
s[2]=s[0]/s[1];
if(s[2]==24)
{
p1[2]=sign;
if(c==3&&s[0]%s[1]==0) //控制输出顺序和运算优先级
{
printf("(%d%c%d)%c(%d%c%d)=%d\n",p[2],p1[2],p[3],p1[1],p[0],p1[0],p[1],s[2]);
fprintf(fp,"(%d%c%d)%c(%d%c%d)=%d",p[2],p1[2],p[3],p1[1],p[0],p1[0],p[1],s[2]);
}
else
{
printf("(%d%c%d)%c(%d%c%d)=%d\n",p[0],p1[0],p[1],p1[1],p[2],p1[2],p[3],s[2]);
fprintf(fp,"(%d%c%d)%c(%d%c%d)=%d",p[2],p1[2],p[3],p1[1],p[0],p1[0],p[1],s[2]);
}
fclose(fp);
}
}
}
}
}
}
}
}
调试截图:
流程图: