您的位置:首页 > 其它

24点游戏

2017-04-12 22:05 281 查看
#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)
{

p
9606
rintf("(%2.0f %c %2.0f) %c (%2.0f %c %2.0f) =24\n",a,sigle[i],b,sigle[k],c,sigle[j],d);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: