C语言:24点游戏

16 篇文章 1 订阅
#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(i==0)	*a=q%13+1;//a,b,c,d代表了发的四个牌
	if(i==1)	*b=q%13+1;
	if(i==2)	*c=q%13+1;
	if(i==3)	*d=q%13+1;
	}
return 0;
}
void main()//主函数,整个24点游戏的循环。
{
	while(1)
	{
		FILE *fp;
		if((fp=fopen("data.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;
		while(again==1)
		{
			i=0;
			flag=0;
			while (flag==0)
			{
				i++;
				for(i=0;i<4;i++)
				{
					int a,b,c,d;
					Deal(&a,&b,&c,&d);//随机发牌,产生四个数
					if(i==0)	
					{
						num[i]=(float)a;	
						printf ("第%d张牌%d\n",i+1,(int)num[i]);
						//将随机发牌,产生的第一个数保存并输出
					}
					if(i==1)
					{
						num[i]=(float)b;	
						printf ("第%d张牌%d\n",i+1,(int)num[i]);
						//将随机发牌,产生的第二个数保存并输出
					}
					if(i==2)
					{
						num[i]=(float)c;	
						printf ("第%d张牌%d\n",i+1,(int)num[i]);
						//将随机发牌,产生的第三个数保存并输出
					}
					if(i==3)
					{
						num[i]=(float)d;
						printf ("第%d张牌%d\n",i+1,(int)num[i]);
						//将随机发牌,产生的第四个数保存并输出
					}
					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=treat(num[i],num[j],num[k],num[t],s,&sss);
				}
				if (res==0)
					{
						printf ("\nNo answer\n");
						break;
					}
				if(a==0)
				{
					system("cls");
					if(sss==1)
					{
						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");//每玩一次清空屏幕
		}
	}
}
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 ((!(i==3 && b==0)) && (!(j==3 && c==0)) && (!(k==3 && 
		d==0)))
		{
			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 (k==3)
		{
			sum1=myF(i,a,b);
			sum2=myF(j,c,d);
			if (sum2!=0)
			{
				sum3=sum1/sum2;
				if (fabs(sum3-24)<0.1)
				{
					temp++;
					my(3,i,j,k,a,b,c,d,s,sss);//判断玩家答案正确
					myPrint(3,i,j,k,a,b,c,d);//输出正确答案
				}
			}
		}
	}
	if (temp==0)
	return 0;
	else
	return 1;
}
float myF(int flag,float m,float n)
{
	//time++;
	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 (type==1)
	{
		if(j==4 || j==5)
		{
			if (k==4 || 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)
	{
		//if (k==4 || k==5)
		//printf("(%2.0f %c %2.0f) %c (%2.0f %c %2.0f)=24\n",c,sigle[j],d,sigle[k],a,sigle[i],b);
		//else
		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 (type==1)
	{
		if(j==4 || j==5)
		{
			if (k==4 || 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)
	{
		//if (k==4 || k==5)
		//printf("(%2.0f %c %2.0f) %c (%2.0f %c %2.0f)=24\n",c,sigle[j],d,sigle[k],a,sigle[i],b);
		//else
		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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值