#include<stdio.h>
#include<math.h>
#include<conio.h>
#include<string.h>
#include <stdlib.h>
#include <time.h> //用到了time函数
void byy(int type,int i,int j,int k,float a,float b,float c,float d);
void lxk(int type,int i,int j,int k,float a,float b,float c,float d,char *s,int *sss);
int zdj(float a,float b,float c,float d,char *s,int *sss);
float bwj(int flag,float m,float n);
int temp=0;
int Deal(int *a,int *b,int *c,int *d)//发牌函数、产生四个随机数
{
int i,p;
srand(time(0)); //种下随机种子数
int q=0;
for(i=0;i<4;i++) //随机产生四张牌
{
p=rand()%12+1; //产生的随机数a作为增量,范围1-10
q=q+p;
if(i0)
*a=q%13+1; //a,b,c,d代表了发出的四个牌
if(i1)
*b=q%13+1;
if(i2)
*c=q%13+1;
if(i3)
*d=q%13+1;
}
return 0;
}
int zdj(float a,float b,float c,float d,char *s,int *sss)//计算正确答案的函数
{
int i,j,k;
float sum1,sum2,sum3;
for (i=0;i<4;i++)
for (j=0;j<6;j++)
for (k=0;k<6;k++)
{
if ((!(i==3 && b==0)) && (!(j==3 && c==0)) && (!(k==3&&d==0)))
{
sum1=bwj(i,a,b);
sum2=bwj(j,sum1,c);
sum3=bwj(k,sum2,d);
if (fabs(sum3-24)<0.1) //求绝对值的函数,求出x的绝对值
{
temp++;
lxk(3,i,j,k,a,b,c,d,s,sss); //判断玩家答案正确
byy(1,i,j,k,a,b,c,d); //输出正确答案
}
}
if (k==2)
{
sum1=bwj(i,a,b);
sum2=bwj(j,c,d);
sum3=sum1*sum2;
if (fabs(sum3-24)<0.1)
{
temp++;
lxk(3,i,j,k,a,b,c,d,s,sss); //判断玩家答案正确
byy(2,i,j,k,a,b,c,d); //输出正确答案
}
}
if (k==3)
{
sum1=bwj(i,a,b);
sum2=bwj(j,c,d);
if (sum2!=0)
{
sum3=sum1/sum2;
if (fabs(sum3-24)<0.1)
{
temp++;
lxk(3,i,j,k,a,b,c,d,s,sss); //判断玩家答案正确
byy(3,i,j,k,a,b,c,d); //输出正确答案
}
}
}
}
if (temp==0)
return 0;
else
return 1;
}
void lxk(int type,int i,int j,int k,float a,float b,float c,float d,char *s,int sss)//判断玩家答案是否正确的函数
{
char sigle[6]; //6种运算符号
char ss[20]; //保存正确答案
sigle[0]=’+’;
sigle[1]=’-’;
sigle[2]=’’;
sigle[3]=’/’;
sigle[4]=’-’;
sigle[5]=’/’;
if (type1)
{
if(j4 || j5)
{
if (k4 || k==5)
{
sprintf(ss,"(%2.0f%c(%2.0f%c%2.0f))%c%2.0f",c,sigle[j],a,sigle[i],b,sigle[k],d);
if(strcmp(ss,s)==0) *sss=1; //判断玩家答案是否正确
}
else
{
sprintf(ss,"(%2.0f%c(%2.0f%c%2.0f))%c%2.0f",c,sigle[j],a,sigle[i],b,sigle[k],d);
if(strcmp(ss,s)==0) *sss=1; //判断玩家答案是否正确
}
}
else if (k==4 || k==5)
{
sprintf(ss,"%2.0f%c((%2.0f%c%2.0f)%c%2.0f)",d,sigle[k],a,sigle[i],b,sigle[j],c);
if(strcmp(ss,s)==0) *sss=1; //判断玩家答案是否正确
}
else
{
sprintf(ss,"((%2.0f%c%2.0f)%c%2.0f)%c%2.0f",a,sigle[i],b,sigle[j],c,sigle[k],d);
if(strcmp(ss,s)==0) *sss=1; //判断玩家答案是否正确
}
}
if (type==2 || type==3)
{
sprintf(ss,"(%2.0f%c%2.0f)%c(%2.0f%c%2.0f)",a,sigle[i],b,sigle[k],c,sigle[j],d);
if(strcmp(ss,s)==0) *sss=1; //判断玩家答案是否正确
}
}
float bwj(int flag,float m,float n)
{
if (flag0)
return (m+n);
if (flag1)
return (m-n);
if (flag2)
return (m*n);
if (flag3)
if (n0)
return 30000;
else
return (m/n);
if (flag4)
return (n-m);
if (flag5)
if (m0)
return 30000;
else
return (n/m);
return 0;
}
void byy(int type,int i,int j,int k,float a,float b,float c,float d)//显示正确答案,文件保存正确答案
{
FILE fp;
if((fp=fopen(“Toplist.txt”,“a+”))==NULL)
{
printf(“Cannot open file strike any key exit!”);
getchar();
exit(1);
} //追加方式打开文件
int life=3;
int score=0;
char sigle[6];
sigle[0]=’+’;
sigle[1]=’-’;
sigle[2]=’’;
sigle[3]=’/’;
sigle[4]=’-’;
sigle[5]=’/’;
if (type1)
{
if(j4 || j5)
{
if (k4 || k5)
{
printf("%2.0f %c (%2.0f %c (%2.0f %c %2.0f)) =24\n",d,sigle[k],c,sigle[j],a,sigle[i],b);
fprintf(fp,"%2.0f %c (%2.0f %c (%2.0f %c %2.0f)) =24\n",d,sigle[k],c,sigle[j],a,sigle[i],b);
//显示正确答案,文件保存正确答案
}
else
{
printf("(%2.0f %c (%2.0f %c %2.0f)) %c %2.0f =24\n",c,sigle[j],a,sigle[i],b,sigle[k],d);
fprintf(fp,"(%2.0f %c (%2.0f %c %2.0f)) %c %2.0f =24\n",c,sigle[j],a,sigle[i],b,sigle[k],d);
//显示正确答案,文件保存正确答案
}
}
else
if (k4 || k5)
{
printf("%2.0f %c ((%2.0f %c %2.0f) %c %2.0f) =24\n",d,sigle[k],a,sigle[i],b,sigle[j],c);
fprintf(fp,"%2.0f %c ((%2.0f %c %2.0f) %c %2.0f) =24\n",d,sigle[k],a,sigle[i],b,sigle[j],c);
//显示正确答案,文件保存正确答案
}
else
{
printf("((%2.0f %c %2.0f) %c %2.0f) %c %2.0f =24\n",a,sigle[i],b,sigle[j],c,sigle[k],d);
fprintf(fp,"((%2.0f %c %2.0f) %c %2.0f) %c %2.0f =24\n",a,sigle[i],b,sigle[j],c,sigle[k],d);
//显示正确答案,文件保存正确答案
}
}
if (type2 || type==3)
{
printf("(%2.0f %c %2.0f) %c (%2.0f %c %2.0f) =24\n",a,sigle[i],b,sigle[k],c,sigle[j],d);
fprintf(fp,"(%2.0f %c %2.0f) %c (%2.0f %c %2.0f) =24\n",a,sigle[i],b,sigle[k],c,sigle[j],d);
//显示正确答案,文件保存正确答案
}
fclose(fp);
}
void main() //主函数,整个24点游戏的循环。
{
while(1)
{
FILE fp;
if((fp=fopen(“Toplist.txt”,“w”))NULL) //为文件写入
{
printf(“Cannot open file strike any key exit!”);
getchar();
exit(1);
}
fclose(fp); //打开文件,清空之前记录,并检查文件是否存在
int i,j,k,t,again,res,flag;
float num[4];
again=1;
int life=3;
int score=0;
printf("***********************************************\n");
printf("|| ||\n");
printf("|| 欢迎进入24点游戏 ||\n");
printf("|| ||\n");
printf("************************************************\n");
printf("\n");
while(again1)
{
i=0;
flag=0;
while (flag0)
{
i++;
printf(“系统随机生成的四张牌面为:\n”);
for(i=0;i<4;i++)
{
int a,b,c,d;
Deal(&a,&b,&c,&d); //随机发牌,产生四个数
if(i0)
{
num[i]=(float)a;
printf(" ┏━━┓"); //显示牌的框架//
printf("\n");
printf(" ┃ ┃");
printf("\n");
printf(" %g" , num[i] );
printf("\n");
printf(" ┗━━┛");
printf("\n"); //将随机发牌,产生的第一个数保存并输出
}
if(i1)
{
num[i]=(float)b;
printf(" ┏━━┓");/显示牌的框架/
printf("\n");
printf(" ┃ ┃");
printf("\n");
printf(" %g" , num[i] );
printf("\n");
printf(" ┗━━┛");
printf("\n"); //将随机发牌,产生的第二个数保存并输出
}
if(i2)
{
num[i]=(float)c;
printf(" ┏━━┓");/显示牌的框架/
printf("\n");
printf(" ┃ ┃");
printf("\n");
printf(" %g" , num[i] );
printf("\n");
printf(" ┗━━┛");
printf("\n"); //将随机发牌,产生的第三个数保存并输出
}
if(i3)
{
num[i]=(float)d;
printf(" ┏━━┓");/显示牌的框架/
printf("\n");
printf(" ┃ ┃");
printf("\n");
printf(" %g" , num[i] );
printf("\n");
printf(" ┗━━┛");
printf("\n"); //将随机发牌,产生的第四个数保存并输出
}
if (num[i]<1 || num[i]>13 || num[i]!=int(num[i]))
flag++;
}
if(flag!=0)
{
printf (“Error input again\n”,i);
flag=0;
}
else
flag=1;
}
char s[20]; //保存玩家输入的结果
int sss=0; //保存玩家答案是否正确
printf(“请输入一个算式开始24点游戏:”);
scanf("%s",s);
int a=0;
while(a<2)
{
printf(“正确答案如下:\n”);
for (i=0;i<4;i++)
for (j=0;j<4;j++)
if (j!=i)
for (k=0;k<4;k++)
if (k!=j && k!=i)
for (t=0;t<4;t++)
if (t!=i && t!=j && t!=k)
{
res=zdj(num[i],num[j],num[k],num[t],s,&sss);
}
if (res0)
{
printf ("\nNo answer\n");
break;
}
if(a0)
{
system(“cls”);
if(sss1)
{
score=score+10; //回答正确分数值加10分
printf(“恭喜您回答正确!\n”);
printf(“您的分数是:%d\n”,score);
printf(“您还有%d条命\n”,life);
fprintf(fp,“您还有%d条命\n”,life);
fprintf(fp,“您的分数是:%d”,score);
a++;
}
else
{
life=life-1; //运算错误则进入下一题并减少生命值
printf(“很遗憾回答错误!\n”);
printf(“您的分数是:%d\n”,score);
printf(“您的生命值减一,您还有%d条命\n”,life);
fprintf(fp,“您还有%d条命\n”,life);
fprintf(fp,“您的分数是:%d”,score);
printf(“是否显示正确答案?\n1、查看答案 2、进入下一题\n”);
int c;
c=getch();
if(c==‘1’)
{
}
else
if(c==‘2’)
{
a++;
}
else printf(“选择错误!默认显示正确答案!\n”);
}
}
a++;
}
printf(“按任意键进入下一题!\n”);
getch();
system(“cls”); //每玩一次清空屏幕
}
}
}