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

利用系统时间设定随机种子生成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%cn",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%cn",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;   }

效果展示

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持<计算机技术网>。

—-想了解C语言实现纸牌计算24点小游戏分享!全部内容且更多的C语言教程关注<计算机技术网>

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请点击右边联系管理员删除。

如若转载,请注明出处:https://www.ctvol.com/c-cdevelopment/483264.html

(0)
上一篇 2020年11月9日
下一篇 2020年11月9日

精彩推荐