24点游戏

来源:互联网 发布:京东抢单软件 编辑:程序博客网 时间:2024/06/16 22:34
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int treat(float a,float b,float c,float d);
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);//a,b,c,d是数字,i,j,k为操作符


int time,temp=0;


void main()
{
int i,j,k,t,again,res,flag;
int x,y,z,w; //设置变量以输出产生的随机数
float num[4]; //定义数组存放产生的四个数
again=1;
while(again==1)
{
i=0;
flag=0;
while (flag==0)
{
i++;
for(i=0;i<4;i++)
{
num[i]=rand()%13+1;//用伪随机函数rand()产生1~13的随机数
}
printf("随机产生的4个数为(1~13):\n");
x=num[0];
y=num[1];
z=num[2];
w=num[3];
printf("%d\n",x);
printf("%d\n",y);
printf("%d\n",z);
printf("%d\n",w);
if(flag!=0)
{
printf ("Error input again\n",i);
flag=0;
}
else
flag=1;
}
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]);
}
if (res==0)
printf ("\nNo answer\n");
else ;
printf("------------------------------------\n");
printf ("1:继续游戏\n2: 退出游戏\n");
printf("------------------------------------\n");
printf("请选择1或2:\n");
scanf ("%d",&again);
system("CLS");//清屏函数
}
}


int treat(float a,float b,float c,float d)
{
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++;
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++;
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)//判断能否运算出24,出现小数时,能够包含在内
{
temp++;
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) //flag用于判断运算符号,返回相对应的运算结果
{
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; //除数为0,则不能运算出24,返回3000
else
return (n/m); //除数不为0,则可以运算
return 0;
}


void myPrint(int type,int i,int j,int k,float a,float b,float c,float d)//定义参数type选择输出形式
{
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);//输出符合条件的表达式
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);
}
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);
}
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);
}
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);
}
}
0 0
原创粉丝点击