24点纸牌益智游戏
**算法设计思路:**24点游戏的算法,其中最主要的思想就是穷举法。所谓穷举法就是对随机生成的4个数字进行加减乘除的各种运算,使其结果为24。首先我们将4个数设为a,b,c,d,将其排序列出四个数的所有排序序列组合(共有A44=24种组合)。再进行符号的排列表达式,其中算术符号有+,—,,/,(,)。其中有效的表达式有a(b-c/b),ab-cd,等等。列出所有有效的表达式。其中a,b,c,d的范围是1到13。这就需要在定义变量的时候要有限制。在此编程中的最大是13,最小是1。随机生成的4个数字,通过各种组合判断其结果是否为24。我们用a,b,c,d代替4个数字。考虑每种可能的正确性,最后将正确答案保存在文件中。
程序代码:
#include<stdio.h>
#include<math.h>
#include<conio.h>
#include<string.h>
#include <stdlib.h>
#include <time.h> //time函数
int treat(float a,float b,float c,float d,char *s,int *sss);
float myF(int flag,float m,float n);
void myPrint(int type,int i,int j,int k,float a,float b,float c,float d);
void my(int type,int i,int j,int k,float a,float b,float c,float d,char *s,int *sss);
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(i1)
*b=q%13+1;
if(i3)
*d=q%13+1;
}
return 0;
}
//计算正确答案的函数
int treat(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 ((!(i0)) && (!(j0)) && (!(k0)))
{
sum1=myF(i,a,b);
sum2=myF(j,sum1,c);
sum3=myF(k,sum2,d);
if (fabs(sum3-24)<0.1)
{
temp++;
my(3,i,j,k,a,b,c,d,s,sss);//判断玩家答案正确
myPrint(1,i,j,k,a,b,c,d);//输出正确答案
}
}
if (k==2)
{
sum1=myF(i,a,b);
sum2=myF(j,c,d);
sum3=sum1
sum2;
if (fabs(sum3-24)<0.1)
{
temp++;
my(3,i,j,k,a,b,c,d,s,sss);//判断玩家答案正确
myPrint(2,i,j,k,a,b,c,d);//输出正确答案
}
}
if (k0)
return 0;
else
return 1;
}
//表达式计算
float myF(int flag,float m,float n)
{

if (flag==0)
    return (m+n);
if (flag==1)
    return (m-n);
if (flag==2)
    return (m*n);
if (flag==3)
    if (n==0)
        return 30000;
else
    return (m/n);
if (flag==4)
    return (n-m);
if (flag==5)
    if (m==0)
    return 30000;
else
    return (n/m);
return 0;

}
//判断玩家答案是否正确的函数
void my(int type,int i,int j,int k,float a,float b,float c,float d,char *s,int sss)
{
char sigle[6];
char ss[20];//保存正确答案
sigle[0]=’+’;
sigle[1]=’-’;
sigle[2]=’
’;
sigle[3]=’/’;
sigle[4]=’-’;
sigle[5]=’/’;
if (type4 || j4 || 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)4 || k5)
{
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)2 || type3)
{

    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;//判断玩家答案是否正确
}

}
//显示正确答案,文件保存正确答案
void myPrint(int type,int i,int j,int k,float a,float b,float c,float d)
{
FILE fp;
if((fp=fopen(“data.txt”,“a+”))==NULL)
{
printf(“Cannot open file strike any key exit!”);
getchar();
exit(1);
}
//追加方式打开文件
char sigle[6];
sigle[0]=’+’;
sigle[1]=’-’;
sigle[2]=’
’;
sigle[3]=’/’;
sigle[4]=’-’;
sigle[5]=’/’;
if (type4 || j4 || k==5)
{
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 (k==4 || k==5)
    {
        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 (type==2 || 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);

}

//主函数,整个24点游戏的循环
void main()
{
while(1)
{
FILE *fp;
if((fp=fopen(“data.txt”,“w”))1)
{
i=0;
flag=0;
while (flag0)
{
num[i]=(float)a;
printf (“第%d张牌是:%d\n”,i+1,(int)num[i]);
//将随机发牌,产生的第一个数保存并输出
}
if(i2)
{
num[i]=(float)c;
printf (“第%d张牌是:%d\n”,i+1,(int)num[i]);
//将随机发牌,产生的第三个数保存并输出
}
if(i0)
{
printf ("\nNo answer\n");
break;
}
if(a1)
{
printf(“恭喜您回答正确!!!\n”);
a++;
}
else
{
printf(“很遗憾,您回答错误!\n”);
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”);//每玩一次清空屏幕
}
}
}
总结:
这次的作业是完成一个24点游戏,最初,对这个游戏不是很了解,百度之后,才明白其原理,随机给出四张牌(数字对应与1-13),进行加减乘除等运算,使其就算结果为24,产生无重复的所有结果,用户在输入表达式之后,判断结果是否正确。在编写程序时,思路要清晰正确,在一开始忘记生成随机数,导致思路偏离路线,及时进行改正。在很多地方还有不足,也未完成所有的要求,希望在以后的学习中,可以更加努力认真的把作业做得更好,提高自己的编程水平,不断提升自己。

10-05 16:56