首页 > 编程 > C > 正文

C语言实现纸牌计算24点小游戏

2020-01-26 13:23:43
字体:
来源:转载
供稿:网友

利用系统时间设定随机种子生成4个随机数,并对4个数字之间的运算次序以及运算符号进行枚举,从而计算判断是否能得出24,以达到程序目的。程序主要功能已完成,目前还有部分细节未处理,待完成ing...对于代码中的错误,恳请批评指正。

游戏描述:

  A-10:分别代表数字 1-10。
  J,Q,K:均代表数字1。
  考虑到部分地方的规则,J,Q,K 也可以当成10 ,或者直接代表本身所代表的数字,即11、12、13来运算。
  使用加减乘除,能得出24者为赢,存在无解情况。
  游戏开始得分为1000分,每一秒钟减少1分,当答对一次时,分数增加100分。(暂未实现)

代码展示:

/* * * Project : 计算24  *  * Date : 2015年3月25日10:55:47  * * Remark :纸牌中的10以0代替,减法得数均为正数  */ #include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h>  char getPokerCard(int value) {  if(value==1)  {   return 'A';  } else if(value<10) {  return value+'0'; } else if(value==10) {  return '0'; } else if(value==11) {  return 'J'; } else if(value==12) {  return 'Q'; } else if(value==13) {  return 'K'; } }  void printAnswer(int flag,int *poker,char *oper,char *answer) {  char a=getPokerCard(poker[0]);  char b=getPokerCard(poker[1]);  char c=getPokerCard(poker[2]);  char d=getPokerCard(poker[3]);    switch(flag)  {   //1.((A*B)*C)*D   case 1:    printf("((%c%c%c)%c%c)%c%c/n",a,oper[0],b,oper[1],c,oper[2],d);    break;   //2.(A*(B*C))*D   case 2:    printf("(%c%c(%c%c%c))%c%c/n",a,oper[0],b,oper[1],c,oper[2],d);    break;   //3.(A*B)*(C*D)   case 3:    printf("(%c%c%c)%c(%c%c%c)/n",a,oper[0],b,oper[1],c,oper[2],d);    break;   //4.A*(B*(C*D))   case 4:    printf("%c%c(%c%c(%c%c%c))/n",a,oper[0],b,oper[1],c,oper[2],d);    break;   //5.A*((B*C)*D)    case 5:    printf("%c%c((%c%c%c)%c%c)/n",a,oper[0],b,oper[1],c,oper[2],d);    break;   default:    break;  }    //存储answer      return ;  }  double getValue(double num1,double num2,char oper) {  double result;    switch(oper)  {   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 getResult(int *poker,char *oper,char *answer) {  double t;  //将计算值取到   int a=poker[0]>10?1:poker[0];  int b=poker[1]>10?1:poker[1];  int c=poker[2]>10?1:poker[2];  int d=poker[3]>10?1:poker[3];    //穷举运算次序 //1.((A*B)*C)*D t=0; t=getValue(a,b,oper[0]); t=getValue(t,c,oper[1]); t=getValue(t,d,oper[2]);  if(fabs(t-24)<0.0001) {  printAnswer(1,poker,oper,answer);  return 1; }  //2.(A*(B*C))*D t=0; t=getValue(b,c,oper[1]); t=getValue(a,t,oper[0]); t=getValue(t,d,oper[2]);  if(fabs(t-24)<0.0001) {  printAnswer(2,poker,oper,answer);  return 1; }  //3.(A*B)*(C*D) t=0; t=getValue(getValue(a,b,oper[0]),getValue(c,d,oper[2]),oper[1]);  if(fabs(t-24)<0.0001) {  printAnswer(3,poker,oper,answer);  return 1; }  //4.A*(B*(C*D)) t=0; t=getValue(c,d,oper[2]); t=getValue(b,t,oper[1]); t=getValue(a,t,oper[0]);  if(fabs(t-24)<0.0001) {  printAnswer(4,poker,oper,answer);  return 1; }  //5.A*((B*C)*D)  t=0;  t=getValue(b,c,oper[1]); t=getValue(t,d,oper[2]); t=getValue(a,t,oper[0]);  if(fabs(t-24)<0.0001) {  printAnswer(5,poker,oper,answer);  return 1; }   return 0; }  void printResult(int *poker,char *answer) {  char OperKey[4]={'+','-','*','/'};  char oper[3];  int i,j,k;  int count=0;    for(i=0;i<4;i++)  for(j=0;j<4;j++)  for(k=0;k<4;k++)  {   oper[0]=OperKey[i];   oper[1]=OperKey[j];   oper[2]=OperKey[k];      if(getResult(poker,oper,answer))   count++;  }  if(count)  {   printf("共%d种解法/n",count);  }  else  {   printf("该情况无解/n");  }    return ; }  void printPoker(int *poker) {   int i;  for(i=0;i<4;i++)  {   printf("%c ",getPokerCard(poker[i]));  }  printf("/n");    return ; }  void getRandomPokers(int *poker) {  int i;    //利用系统时间作为种子产生随机数 ,函数srand(),rand()=>stdlib.h ,函数time()=>time.h  srand((unsigned)time(NULL)); for(i=0;i<4;i++) {  poker[i]=rand()%12+1; }  return ;  }  main() {   int poker[4]; char answer[20];  char c;    printf("纸牌计算24点/n--------------------------------------------/n");  do  {   //生成随机纸牌    getRandomPokers(poker);      printf("随机生成的纸牌为:/n");   //输出生成的纸牌    printPoker(poker);      printf("/n任意键获得结果.../n");   getchar();       //输出计算结果   printResult(poker,answer);      printf("/n回车键继续,其他键并回车退出.../n");   c=getchar();      printf("--------------------------------------------/n");  }  while(c=='/n');    return 0; }

效果展示

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选