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  } 
原文地址:https://www.cnblogs.com/Ambrose/p/4365441.html