zoukankan      html  css  js  c++  java
  • C语言-纸牌计算24点小游戏

    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分。(暂未实现)
     
    代码如下:
     
      1  /*
      2  *
      3  * Project : 计算24 
      4  * 
      5  * Author  : 鬼狐_Ambrose
      6  *
      7  * Date    : 2015年3月25日10:55:47 
      8  *
      9  * Remark  :纸牌中的10以0代替,减法得数均为正数 
     10  */
     11  #include <stdio.h>
     12  #include <math.h>
     13  #include <time.h>
     14  
     15  char getPokerCard(int value)
     16  {
     17      if(value==1)
     18      {
     19          return 'A';
     20      }
     21     else if(value<10)
     22     {
     23         return value+'0';
     24     }
     25     else if(value==10)
     26     {
     27         return '0';
     28     }
     29     else if(value==11)
     30     {
     31         return 'J';
     32     }
     33     else if(value==12)
     34     {
     35         return 'Q';
     36     }
     37     else if(value==13)
     38     {
     39         return 'K';
     40     }
     41  }
     42  
     43  void printAnswer(int flag,int *poker,char *oper,char *answer)
     44  {
     45      char a=getPokerCard(poker[0]);
     46      char b=getPokerCard(poker[1]);
     47      char c=getPokerCard(poker[2]);
     48      char d=getPokerCard(poker[3]);
     49      
     50      switch(flag)
     51      {
     52          //1.((A*B)*C)*D
     53          case 1:
     54              printf("((%c%c%c)%c%c)%c%c
    ",a,oper[0],b,oper[1],c,oper[2],d);
     55              break;
     56          //2.(A*(B*C))*D
     57          case 2:
     58              printf("(%c%c(%c%c%c))%c%c
    ",a,oper[0],b,oper[1],c,oper[2],d);
     59              break;
     60          //3.(A*B)*(C*D)
     61          case 3:
     62              printf("(%c%c%c)%c(%c%c%c)
    ",a,oper[0],b,oper[1],c,oper[2],d);
     63              break;
     64          //4.A*(B*(C*D))
     65          case 4:
     66              printf("%c%c(%c%c(%c%c%c))
    ",a,oper[0],b,oper[1],c,oper[2],d);
     67              break;
     68          //5.A*((B*C)*D) 
     69          case 5:
     70              printf("%c%c((%c%c%c)%c%c)
    ",a,oper[0],b,oper[1],c,oper[2],d);
     71              break;
     72          default:
     73              break;
     74      }
     75      
     76      //存储answer
     77      
     78      
     79      return ; 
     80  }
     81  
     82   double getValue(double num1,double num2,char oper)
     83  {
     84      double result;
     85      
     86      switch(oper)
     87      {
     88          case '+':
     89          result=num1+num2;
     90          break;
     91         case '-':
     92          result=fabs(num1-num2);
     93          break;
     94         case '*':
     95          result=num1*num2;
     96          break;
     97         case '/':
     98          result=num1/num2;
     99          break;
    100         default :
    101             break;
    102      }
    103      
    104      return result;
    105  }
    106  
    107  int getResult(int *poker,char *oper,char *answer)
    108  {
    109      double t;
    110      //将计算值取到 
    111      int a=poker[0]>10?1:poker[0];
    112      int b=poker[1]>10?1:poker[1];
    113      int c=poker[2]>10?1:poker[2];
    114      int d=poker[3]>10?1:poker[3];
    115      
    116      //穷举运算次序
    117     //1.((A*B)*C)*D
    118     t=0;
    119     t=getValue(a,b,oper[0]);
    120     t=getValue(t,c,oper[1]);
    121     t=getValue(t,d,oper[2]);
    122     
    123     if(fabs(t-24)<0.0001)
    124     {
    125         printAnswer(1,poker,oper,answer);
    126         return 1;
    127     }
    128     
    129     //2.(A*(B*C))*D
    130     t=0;
    131     t=getValue(b,c,oper[1]);
    132     t=getValue(a,t,oper[0]);
    133     t=getValue(t,d,oper[2]);
    134     
    135     if(fabs(t-24)<0.0001)
    136     {
    137         printAnswer(2,poker,oper,answer);
    138         return 1;
    139     }
    140     
    141     //3.(A*B)*(C*D)
    142     t=0;
    143     t=getValue(getValue(a,b,oper[0]),getValue(c,d,oper[2]),oper[1]);
    144     
    145     if(fabs(t-24)<0.0001)
    146     {
    147         printAnswer(3,poker,oper,answer);
    148         return 1;
    149     }
    150     
    151     //4.A*(B*(C*D))
    152     t=0;
    153     t=getValue(c,d,oper[2]);
    154     t=getValue(b,t,oper[1]);
    155     t=getValue(a,t,oper[0]);
    156     
    157     if(fabs(t-24)<0.0001)
    158     {
    159         printAnswer(4,poker,oper,answer);
    160         return 1;
    161     }
    162     
    163     //5.A*((B*C)*D) 
    164     t=0;
    165      t=getValue(b,c,oper[1]);
    166     t=getValue(t,d,oper[2]);
    167     t=getValue(a,t,oper[0]);
    168     
    169     if(fabs(t-24)<0.0001)
    170     {
    171         printAnswer(5,poker,oper,answer);
    172         return 1;
    173     }
    174     
    175      return 0;
    176  }
    177  
    178  void printResult(int *poker,char *answer)
    179  {
    180      char OperKey[4]={'+','-','*','/'};
    181      char oper[3];
    182      int i,j,k;
    183      int count=0;
    184      
    185      for(i=0;i<4;i++)
    186      for(j=0;j<4;j++)
    187      for(k=0;k<4;k++)
    188      {
    189          oper[0]=OperKey[i];
    190          oper[1]=OperKey[j];
    191          oper[2]=OperKey[k];
    192          
    193          if(getResult(poker,oper,answer))
    194          count++;
    195      }
    196      if(count)
    197      {
    198          printf("共%d种解法
    ",count);
    199      }
    200      else
    201      {
    202          printf("该情况无解
    ");
    203      }
    204      
    205      return ;
    206  }
    207  
    208    void printPoker(int *poker)
    209  {    
    210      int i;
    211      for(i=0;i<4;i++)
    212      {
    213          printf("%c ",getPokerCard(poker[i]));
    214      }
    215      printf("
    ");
    216      
    217      return ;
    218  }
    219  
    220  void getRandomPokers(int *poker)
    221  {
    222      int i;
    223      
    224      //利用系统时间设定种子
    225      srand((unsigned)time(NULL));
    226     for(i=0;i<4;i++)
    227     {
    228         poker[i]=rand()%12+1;
    229     }
    230     
    231     return ;    
    232  }
    233  
    234  main()
    235  { 
    236      int poker[4];
    237     char answer[20];
    238      char c;
    239      
    240      printf("纸牌计算24点
    --------------------------------------------
    ");
    241      do
    242      {
    243          //生成随机纸牌 
    244          getRandomPokers(poker);
    245          
    246          printf("随机生成的纸牌为:
    ");
    247 
    248          //输出生成的纸牌 
    249          printPoker(poker);
    250          
    251          printf("
    任意键获得结果...
    ");
    252          getchar(); 
    253          
    254          //输出计算结果
    255          printResult(poker,answer);
    256          
    257          printf("
    回车键继续,其他键并回车退出...
    ");
    258          c=getchar();
    259          
    260          printf("--------------------------------------------
    ");
    261      }
    262      while(c=='
    ');
    263      
    264      return 0;
    265  } 
  • 相关阅读:
    Matlab矩阵操作函数的使用(reshape,imresize,remat,permute)
    归一化数据的好处
    博客园中用markdown编辑器编辑带下标的符号
    反向传播
    稀疏表示和字典学习
    先验概率和后验概率
    Local Generic Representation for Face Recognition with Single Sample per Person (ACCV, 2014)
    删除数组
    数组扩容(指定位置)+插入最后
    创建数组的几种方式,遍历+泛型合并
  • 原文地址:https://www.cnblogs.com/Ambrose/p/4365441.html
Copyright © 2011-2022 走看看