//*********24点纸牌游戏***********
//版本:v1.0
//创建时间:2017年4月1日
//主要功能:系统随机生成1~13的4张牌(1用A代替,11用J代替,12用Q代替,13用K代替),要求将四张牌用加减乘除混合运算求得出24
//主要原理:系统通过对随机生成的四张扑克牌进行运算,如果结果为24,则输出结果及结果个数
//************************************
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
int main()
{
int p[4],c;
void Random(int p[4]);//函数声明
void printResult(int p[4]);//函数声明
printf("--------------------------------------------\n*******24点纸牌游戏******\n");
printf("0代表扑克牌中的10\n");
printf("--------------------------------------------\n");
do
{
printf("随机生成的纸牌为:\n");
Random(p);//函数调用
printf("\n");
printResult(p);//函数调用
printf("1.继续游戏 2.结束\n");
scanf("%d",&c);
}while(c==1);
return 0;
}
利用系统时间作为种子生成四个随机数并输出
void Random(int p[4])
{
int i;
char Card(int x);
srand((unsigned)time(NULL));
for(i=0;i<4;i++)
{
p[i]=rand()%13+1;
printf("%c ",Card(p[i]));
}
}
//如果随机出现的数字为1,则输出A;同样,输出为J,Q,K;
char Card(int x)
{
if(x==1)
{
return 'A';
}
else if(x<10)
{
return x+'0';
}
else if(x==10)
{
return '0';
}
else if(x==11)
{
return 'J';
}
else if(x==12)
{
return 'Q';
}
else if(x==13)
{
return 'K';
}
}
//加减乘除四种运算符的运算
double ys(double num1,double num2,char o)
{
double result;
switch(o)
{
case '+':
result=num1+num2;
break;
case '-':
result=fabs(num1-num2);
break;
case '*':
result=num1*num2;
break;
case '/':
result=num1/num2;
break;
default :
break;
}
return result;
}
//穷举运算次序
int Result(int p[4],char o[3])
{
double t;
int a=p[0];
int b=p[1];
int c=p[2];
int d=p[3];
//1.((A*B)*C)*D
t=0;
t=ys(ys(ys(a,b,o[0]),c,o[1]),d,o[2]);
if(fabs(t-24)==0) //如果计算结果的绝对值与24相等,输出结果
{
printf("((%c%c%c)%c%c)%c%c\n",Card(p[0]),o[0],Card(p[1]),o[1],Card(p[2]),o[2],Card(p[3]));
return 1;
}
//2.(A*(B*C))*D
t=0;
t=ys(ys(a,ys(b,c,o[1]),o[0]),d,o[2]);
if(fabs(t-24)==0) //如果计算结果的绝对值与24相等,输出结果
{
printf("(%c%c(%c%c%c))%c%c\n",Card(p[0]),o[0],Card(p[1]),o[1],Card(p[2]),o[2],Card(p[3]));
return 1;
}
//3.(A*B)*(C*D)
t=0;
t=ys(ys(a,b,o[0]),ys(c,d,o[2]),o[1]);
if(fabs(t-24)==0) //如果计算结果的绝对值与24相等,输出结果
{
printf("(%c%c%c)%c(%c%c%c)\n",Card(p[0]),o[0],Card(p[1]),o[1],Card(p[2]),o[2],Card(p[3]));
return 1;
}
//4.A*(B*(C*D))
t=0;
t=ys(a,ys(b,ys(c,d,o[2]),o[1]),o[0]);
if(fabs(t-24)==0) //如果计算结果的绝对值与24相等,输出结果
{
printf("%c%c(%c%c(%c%c%c))\n",Card(p[0]),o[0],Card(p[1]),o[1],Card(p[2]),o[2],Card(p[3]));
return 1;
}
//5.A*((B*C)*D)
t=0;
t=ys(a,ys(ys(b,c,o[1]),d,o[2]),o[0]);
if(fabs(t-24)==0) //如果计算结果的绝对值与24相等,输出结果
{
printf("%c%c((%c%c%c)%c%c)\n",Card(p[0]),o[0],Card(p[1]),o[1],Card(p[2]),o[2],Card(p[3]));
return 1;
}
return 0;
}
//输出可以用几种方法解出答案
void printResult(int p[4])
{
char O[4]={'+','-','*','/'};
char o[3];
int i,j,k;
int count=0;
for(i=0;i<4;i++)//三层for循环列出了所有运算符可能出现的情况
{
for(j=0;j<4;j++)
{
for(k=0;k<4;k++)
{
o[0]=O[i];
o[1]=O[j];
o[2]=O[k];
if(Result(p,o)==1)
count++;
}
}
}
printf("共%d种方法\n",count);
}
程序运行结果截屏
总结及心得体会:
通过一次一次上机自己动手写程序,使我更加扎实的掌握了知识,在写程序过程中虽然遇到了一些问题,但经过一次又一次的思考、查阅、讨论,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我知识欠缺和经验不足。实践 出真知,通过亲自动手上机,使我掌握的知识不再是纸上谈兵。我相信在这学期的一次次编写程序的过程中,不仅会培养我独立思考、动手操作的能力,在各种其它能力上也都会有提高。更重要的是,在编写代码时,我学会了很多学习的方法,而这是日后最实用的。