24game.c
上传用户:janny_wxd
上传日期:2010-02-03
资源大小:261k
文件大小:25k
源码类别:

控制台编程

开发平台:

C/C++

  1. #include"24.h"
  2. int oper[7]={43,45,42,47,40,41,35};//七种字符的ASCII码
  3. unsigned char Prior[7][7] = {     // 表3.1  算符间的优先关系
  4.      '>','>','<','<','<','>','>',
  5.   '>','>','<','<','<','>','>',
  6.   '>','>','>','>','<','>','>',
  7.   '>','>','>','>','<','>','>',
  8.   '<','<','<','<','<','=',' ',
  9.   '>','>','>','>',' ','>','>',
  10.   '<','<','<','<','<',' ','='
  11. };
  12. char OPSET[OPSETSIZE]={'+' , '-' , '*' , '/' ,'(' , ')' , '#'};
  13. status init_sq(sqlist *l){//初始化链表
  14. l=(sqlist*)malloc(sizeof(sqlist));
  15. if(l==NULL){
  16. exit(OVERFLOW);
  17. }
  18. l->next=NULL;
  19. return OK;
  20. }
  21. status insert_sq(sqlist **p,int e,int bl){
  22. //链表插入操作,*p一直指向链表的最后一个结点
  23. //由于这里要求修改外部指针,因此要用指向指针的指针
  24. //将插入到链表的末尾
  25. sqlist *q;
  26. q=(sqlist*)malloc(sizeof(sqlist));
  27. q->num_ch=e;
  28. q->bol=bl;
  29. q->next=NULL;
  30. (*p)->next=q;
  31. (*p)=(*p)->next;
  32.  //  PR("insert %d ,%dis succssed!n",e,bl);
  33. return OK;
  34. }
  35. int check(sqlist l)//保证输入的数字是给出的四个数字
  36. {
  37. int right=1,find=0,i;
  38. sqlist *q=&l;
  39. q=q->next ;
  40. for (;q->next!=NULL;q=q->next){
  41. if(q->bol==1){
  42. if(q->num_ch <=39||q->num_ch>57||q->num_ch==44||q->num_ch==46){
  43. //有效运算符的判断
  44. right=0;
  45. PR("%c不是有效的运算符!n");
  46. }
  47. }
  48. else {
  49. find=0;
  50. for(i=0;i<4;i++){
  51. if(number[1][i]==0&&number[0][i]==q->num_ch ){
  52. //控制使给出的四个数字出现且仅出现一次
  53. number[1][i]=1;
  54. find=1;
  55. break;
  56. }
  57. }
  58. if(find==0){
  59. PR("%d 不在给出的四个数字中!n",q->num_ch );
  60. right=0;
  61. }
  62. }
  63. }//end for
  64. for (i=0;i<4;i++){
  65. if(number[1][i]==0){
  66. PR("%d没有用上!n",number[0][i]);
  67. right=0;
  68. }
  69. }
  70. return right;
  71. }
  72. int chang(char *s,sqlist *l){
  73. //将用户的输入转化为单链表
  74. int t=0;
  75. unsigned int i=0;
  76.      int bl,ch;
  77. int a1,a2,a;
  78. sqlist *p=l;
  79. for (;i<strlen(s);i++){
  80. if(s[i]>47&&s[i]<58&&t==0){
  81. a1=(int)s[i]-48;
  82. t++;
  83. }
  84. else if(s[i]>47&&s[i]<58&&t==1){
  85. a2=(int)s[i]-48;
  86. a=a1*10+a2;
  87. t++;
  88.             }
  89. else if(s[i]<48&&s[i]>39&&s[i]!=44&&s[i]!=46){
  90. if(t==1){
  91.                         bl=0;
  92. insert_sq(&p,a1,bl);
  93.                 t=0;
  94. }
  95. else if(t==2){
  96. bl=0;
  97. insert_sq(&p,a,bl);
  98.                 t=0;
  99. }
  100. bl=1;
  101. ch=(int)s[i];
  102. insert_sq(&p,ch,bl);
  103.             t=0;
  104. }
  105. else {
  106. PR("%c不是有效的运算符!n",s[i]);
  107. }
  108. }   //end for
  109. i=strlen(s)-1;
  110. if(s[i]>47&&s[i]<58){
  111. if(s[i-1]>47&&s[i-1]<58){
  112.            bl=0;
  113.    insert_sq(&p,a,bl);
  114.    }
  115. else {
  116. bl=0;
  117. insert_sq(&p,a1,bl);
  118. }
  119. }
  120. bl=1;
  121. a=35;
  122. insert_sq(&p,a,bl);
  123. //   PR("chang is OKn");
  124. return (check(*l));//转化完成了之后判断是否合法
  125. }
  126. int Operate(int a,int theta, int b) {//计算a theta b
  127. // PR("a=%d,theta=%c,b=%dn",a,theta,b);
  128.    switch(theta) {
  129.       case 43: return a+b;
  130.       case 45: return a-b;
  131.       case 42: return a*b;
  132.       case 47:
  133.   {
  134.   if(b==0){
  135. return -2000;
  136. }
  137.   if (a%b==0){
  138.   return a/b;
  139.   }
  140.   else {//PR("不能为小数n");   
  141. return -10000;
  142.   }
  143.   }
  144.       default : return 0;
  145.    } 
  146. }
  147. int ReturnOpOrd(char op,char* TestOp) {
  148. //被char precede(char Aop, char Bop)所调用来求优先级
  149.    int i;
  150.    for(i=0; i< OPSETSIZE; i++) {
  151.       if (op == TestOp[i]) return i;
  152.    }
  153.    return 0;
  154. }
  155. char precede(char Aop, char Bop) {//返回优先级
  156. return Prior[ReturnOpOrd(Aop,OPSET)][ReturnOpOrd(Bop,OPSET)];   
  157. }
  158. status initstack(sqstack *s){
  159. (s)->base = (int*)malloc(STACK_INIF_SIZE*sizeof(int));
  160. if((s)->base==NULL) exit(OVERFLOW);
  161. (s)->top=(s)->base;
  162. (s)->stacksize = STACK_INIF_SIZE;
  163. // PR("栈初始化完成!n");
  164. return OK;
  165. }
  166. int gettop(sqstack *s){//取栈顶元素
  167. int e;
  168. if(s->top==s->base){
  169. PR("栈空,无法取得栈顶元素!n");
  170.  return 0;
  171.  }
  172. e=*(s->top-1);
  173. // PR("取得栈顶元素: %d n",e);
  174. return e;
  175. }
  176. status push(sqstack *s,int e){//把 e 压栈
  177. if(s->top-s->base>=s->stacksize){
  178. s->base=(int*)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(int));
  179. if(!s->base) exit(OVERFLOW);
  180. s->stacksize+= STACKINCREMENT;
  181. }
  182. *(s->top++)=e;
  183.  //  PR("把 %d 压栈 is OKn",e);
  184. return OK;
  185. }
  186. status pop(sqstack *s,int *e){//出栈,用e 保存
  187. if(s->top==s->base){
  188. PR("栈空,出栈错误!n");
  189. return ERROR;
  190. }
  191. *e=*(--s->top);
  192. //   PR(" %d出栈成功 !n",*e);
  193. return OK;
  194. }
  195. int EvaluateExpression(char* MyExpression) {  // 算法3.4
  196.    // 算术表达式求值的算符优先算法。
  197.    // 设OPTR和&&OPND分别为运算符栈和运算数栈,OP为运算符集合。
  198. int result;
  199. sqstack  OPTR;    // 运算符栈,字符元素
  200.    sqstack  OPND;    // 运算数栈,实数元素
  201.    int c,bl,a,b,theta,top;
  202.    sqlist *q,l;  
  203.    char *s=MyExpression;
  204.    init_sq(&l);
  205.    if(chang(s,&l)!=0){
  206.    q=&l;
  207.    initstack(&OPTR);
  208.    push(&OPTR, 35);
  209.    initstack (&OPND);
  210.    q=q->next;
  211.    c=q->num_ch;
  212.    bl=q->bol;
  213.    while ((c!= 35 || gettop(&OPTR)!=35)){
  214.       if (bl!=1) {
  215.          push(&OPND, c);
  216.  q=q->next;
  217.  c=q->num_ch;
  218.  bl=q->bol;
  219.          } // 不是运算符则进栈
  220.      else {  
  221.  top=gettop(&OPTR);
  222. // PR("top  %c",top);
  223.  switch (precede(top, c)) { 
  224.             case '<': // 栈顶元素优先权低   
  225.                  push(&OPTR, c);    
  226.  q=q->next;
  227.  c=q->num_ch;  
  228.  bl=q->bol; 
  229.                  break;
  230.             case '=':   // 脱括号并接收下一字符
  231.                  pop(&OPTR, &c);     
  232.  q=q->next;
  233.  c=q->num_ch;  
  234.  bl=q->bol; 
  235.                  break;
  236.             case '>':   // 退栈并将运算结果入栈
  237.                  pop(&OPTR, &theta);
  238.                  pop(&OPND, &b);  
  239.                  pop(&OPND, &a);
  240. // PR("q->num_ch is %dn",q->num_ch);
  241.                  push(&OPND, Operate(a, theta, b)); 
  242.                  break;
  243. default :
  244. PR("没有这个运算符!n");
  245. return 0;
  246.          } // switch
  247.       }//else
  248.    } // while
  249.    result=gettop(&OPND);
  250.    return result;
  251.    }
  252.    else {
  253.   PR("你的输入有错误!n");
  254.    return 0;
  255.    }
  256. } // EvaluateExpression
  257. int randomm()//产生四个随机数
  258. {
  259. int i=0;
  260. srand((unsigned)time(NULL));
  261. for (;i<4;i++){
  262. number[0][i]=0;
  263. number[0][i]=rand();
  264. number[0][i]%=13;
  265. number[0][i]++;
  266. number[1][i]=0;
  267. }
  268. return number[2][4];
  269. }
  270.  int CalcOneExpress(int expression[][2])
  271.  {
  272.     // 算术表达式求值的算符优先算法。
  273.    // 设OPTR和&&OPND分别为运算符栈和运算数栈,OP为运算符集合。
  274. int index=0,result,c,theta,a,b;
  275. sqstack  OPTR;    // 运算符栈,字符元素
  276.    sqstack  OPND;    // 运算数栈,实数元素
  277.    initstack(&OPTR);
  278.    push(&OPTR, 35);
  279.    initstack (&OPND);
  280.    c=expression[index][0];
  281.    while (c!= 35 || gettop(&OPTR)!=35){
  282.       if (expression[index][1]!=1) {
  283.          push(&OPND, c);
  284.  index++;
  285.  c=expression[index][0];
  286.          } // 不是运算符则进栈
  287.      else {    
  288.  switch (precede(gettop(&OPTR), c)) { 
  289.             case '<': 
  290.   // 栈顶元素优先权低
  291.                  push(&OPTR, c);    
  292.  index++;
  293.  c=expression[index][0];     
  294.                  break;
  295.             case '=':   // 脱括号并接收下一字符
  296.                  pop(&OPTR, &c);     
  297.  index++;
  298.  c=expression[index][0];     
  299.                  break;
  300.             case '>':   // 退栈并将运算结果入栈
  301.                  pop(&OPTR, &theta);
  302.                  pop(&OPND, &b);  
  303.                  pop(&OPND, &a);
  304.                  push(&OPND, Operate(a, theta, b)); 
  305.                  break;
  306. default :
  307. PR("没有这个运算符n");
  308. return 0;
  309.          } // switch
  310.       }//else
  311.    } // while
  312.    result=gettop(&OPND);
  313.    return result;
  314. } // EvaluateExpression
  315.  /****************计算机计算模块*******************************/
  316.  int Equal24(int n)
  317.  {
  318.  if(n==24){
  319. // PR("the result is %dn",n);
  320.  return TRUE;
  321.  }
  322.  else    return FALSE;
  323.  }
  324.   //括号的几种情况
  325. //1 无括号
  326. //2 (a b) c d 同a b (c d), 下省略
  327. //3 (a b c) d
  328. //4 a (b c) d
  329. //5 (a b) (c d)
  330. //6 ((a b) c) d
  331. //7 (a (b c)) d
  332. int CalcArray1(int iNumInput[2][4])
  333. {
  334. // a * b * c * d //7 number
  335. int expression[8][2],ii,jj,kk;
  336. int i,j,k,l,dRes;
  337.     for(i=0;i<4;i++)
  338.     {
  339.         for(j=0;j<4;j++)    
  340.         {
  341.             if(j==i)
  342.             {
  343.                 continue;
  344.             }
  345.             for(k=0;k<4;k++)
  346.             {
  347.                 if(k==i||k==j)
  348.                 {
  349.                     continue;
  350.                 }
  351.                 for(l=0;l<4;l++)
  352.                 {
  353.                     if(l==i||l==j||l==k)
  354.                     {
  355.                         continue;
  356.                     }
  357.                     expression[0][0]=iNumInput[0][i];
  358.                     expression[2][0]=iNumInput[0][j];
  359.                     expression[4][0]=iNumInput[0][k];
  360.                     expression[6][0]=iNumInput[0][l];
  361. expression[0][1]=eNumber;
  362. expression[2][1]=eNumber;
  363. expression[4][1]=eNumber;
  364. expression[6][1]=eNumber;
  365. for (ii=0;ii<4;ii++)
  366. {
  367. for (jj=0;jj<4;jj++)
  368. {
  369. for (kk=0;kk<4;kk++)
  370. {
  371. expression[1][0] = oper[ii];
  372. expression[1][1] = eOperator;
  373. expression[3][0] = oper[jj];
  374. expression[3][1] = eOperator;
  375. expression[5][0] = oper[kk];
  376. expression[5][1] = eOperator;
  377. expression[7][0] = oper[6];
  378. expression[7][1] = eOperator;
  379. dRes = CalcOneExpress(expression);
  380. if(Equal24(dRes))
  381. {
  382. PR("可以这样运算:%d%c%d%c%d%c%dn",expression[0][0],oper[ii],expression[2][0],oper[jj],expression[4][0],oper[kk],expression[6][0]);
  383. return TRUE;
  384. }
  385. }
  386. }
  387. }//end of for oper
  388. }
  389. }
  390. }
  391. }
  392. return FALSE;
  393. }
  394. int CalcArray2(int iNumInput[2][4])
  395. {
  396. // (a * b) * c * d //9 number
  397. int expression[10][2];
  398. int ii,jj,i,j,k,l,kk;
  399. int dRes;
  400. // PR("CalcArray2n");
  401.     for(i=0;i<4;i++)
  402.     {
  403.         for(j=0;j<4;j++)    
  404.         {
  405.             if(j==i)
  406.             {
  407.                 continue;
  408.             }
  409.             for(k=0;k<4;k++)
  410.             {
  411.                 if(k==i||k==j)
  412.                 {
  413.                     continue;
  414.                 }
  415.                 for(l=0;l<4;l++)
  416.                 {
  417.                     if(l==i||l==j||l==k)
  418.                     {
  419.                         continue;
  420.                     }
  421.                     expression[1][0]=iNumInput[0][i];
  422.                     expression[3][0]=iNumInput[0][j];
  423.                     expression[6][0]=iNumInput[0][k];
  424.                     expression[8][0]=iNumInput[0][l];
  425. expression[1][1]=eNumber;
  426. expression[3][1]=eNumber;
  427. expression[6][1]=eNumber;
  428. expression[8][1]=eNumber;
  429. for (ii=0;ii<4;ii++)
  430. {
  431. for (jj=0;jj<4;jj++)
  432. {
  433. for (kk=0;kk<4;kk++)
  434. {
  435. expression[2][0] = oper[ii];
  436. expression[2][1] = eOperator;
  437. expression[5][0] = oper[jj];
  438. expression[5][1] = eOperator;
  439. expression[7][0] = oper[kk];
  440. expression[7][1] = eOperator;
  441. expression[9][0] = oper[6];
  442. expression[9][1] = eOperator;
  443. expression[0][0] = oper[4];
  444. expression[0][1] = eOperator;
  445. expression[4][0] = oper[5];
  446. expression[4][1] = eOperator;
  447. dRes = CalcOneExpress(expression);
  448. if(Equal24(dRes))
  449. {
  450. PR("可以这样运算:%c%d%c%d%c%c%d%c%dn",oper[4],expression[1][0],oper[ii],expression[3][0],oper[5],oper[jj],expression[6][0],oper[kk],expression[8][0]);
  451. return TRUE;
  452. }
  453. }
  454. }
  455. }//end of for oper
  456. }
  457. }
  458. }
  459. }
  460. return FALSE;
  461. }
  462. int CalcArray3(int iNumInput[2][4])
  463. {
  464. // (a * b * c) * d //9 number
  465. int expression[10][2];
  466. int ii,jj,i,j,k,l,kk;
  467. int dRes;
  468. // PR("CalcArray3n");
  469.     for(i=0;i<4;i++)
  470.     {
  471.         for(j=0;j<4;j++)    
  472.         {
  473.             if(j==i)
  474.             {
  475.                 continue;
  476.             }
  477.             for(k=0;k<4;k++)
  478.             {
  479.                 if(k==i||k==j)
  480.                 {
  481.                     continue;
  482.                 }
  483.                 for(l=0;l<4;l++)
  484.                 {
  485.                     if(l==i||l==j||l==k)
  486.                     {
  487.                         continue;
  488.                     }
  489.                     expression[1][0]=iNumInput[0][i];
  490.                     expression[3][0]=iNumInput[0][j];
  491.                     expression[5][0]=iNumInput[0][k];
  492.                     expression[8][0]=iNumInput[0][l];
  493. expression[1][1]=eNumber;
  494. expression[3][1]=eNumber;
  495. expression[5][1]=eNumber;
  496. expression[8][1]=eNumber;
  497. for (ii=0;ii<4;ii++)
  498. {
  499. for (jj=0;jj<4;jj++)
  500. {
  501. for (kk=0;kk<4;kk++)
  502. {
  503. expression[2][0] = oper[ii];
  504. expression[2][1] = eOperator;
  505. expression[4][0] = oper[jj];
  506. expression[4][1] = eOperator;
  507. expression[7][0] = oper[kk];
  508. expression[7][1] = eOperator;
  509. expression[9][0] = oper[6];
  510. expression[9][1] = eOperator;
  511. expression[0][0] = oper[4];
  512. expression[0][1] = eOperator;
  513. expression[6][0] = oper[5];
  514. expression[6][1] = eOperator;
  515. dRes = CalcOneExpress(expression);
  516. if(Equal24(dRes))
  517. {
  518. PR("可以这样运算:%c%d%c%d%c%d%c%c%dn",oper[4],expression[1][0],oper[ii],expression[3][0],oper[jj],expression[5][0],oper[5],oper[kk],expression[8][0]);
  519. return TRUE;
  520. }
  521. }
  522. }
  523. }//end of for oper
  524. }
  525. }
  526. }
  527. }
  528. return FALSE;
  529. }
  530. int CalcArray4(int iNumInput[2][4])
  531. {
  532. // (a * b * c) * d //9 number
  533. int expression[10][2];
  534. int ii,jj,i,j,k,l,kk;
  535. int dRes;
  536. // PR("CalcArray4n");
  537.     for(i=0;i<4;i++)
  538.     {
  539.         for(j=0;j<4;j++)    
  540.         {
  541.             if(j==i)
  542.             {
  543.                 continue;
  544.             }
  545.             for(k=0;k<4;k++)
  546.             {
  547.                 if(k==i||k==j)
  548.                 {
  549.                     continue;
  550.                 }
  551.                 for(l=0;l<4;l++)
  552.                 {
  553.                     if(l==i||l==j||l==k)
  554.                     {
  555.                         continue;
  556.                     }
  557.                     expression[0][0]=iNumInput[0][i];
  558.                     expression[3][0]=iNumInput[0][j];
  559.                     expression[5][0]=iNumInput[0][k];
  560.                     expression[8][0]=iNumInput[0][l];
  561. expression[0][1]=eNumber;
  562. expression[3][1]=eNumber;
  563. expression[5][1]=eNumber;
  564. expression[8][1]=eNumber;
  565. for (ii=0;ii<4;ii++)
  566. {
  567. for (jj=0;jj<4;jj++)
  568. {
  569. for (kk=0;kk<4;kk++)
  570. {
  571. expression[1][0] = oper[ii];
  572. expression[1][1] = eOperator;
  573. expression[4][0] = oper[jj];
  574. expression[4][1] = eOperator;
  575. expression[7][0] = oper[kk];
  576. expression[7][1] = eOperator;
  577. expression[9][0] = oper[6];
  578. expression[9][1] = eOperator;
  579. expression[2][0] = oper[4];
  580. expression[2][1] = eOperator;
  581. expression[6][0] = oper[5];
  582. expression[6][1] = eOperator;
  583. dRes = CalcOneExpress(expression);
  584. if(Equal24(dRes))
  585. {
  586. PR("可以这样运算:%d%c%c%d%c%d%c%c%dn",expression[0][0],oper[ii],oper[4],expression[3][0],oper[jj],expression[5][0],oper[5],oper[kk],expression[8][0]);
  587. return TRUE;
  588. }
  589. }
  590. }
  591. }//end of for oper
  592. }
  593. }
  594. }
  595. }
  596. return FALSE;
  597. }
  598. int CalcArray5(int iNumInput[2][4])
  599. {
  600. // (a * b) * (c * d) //11 number
  601. int expression[12][2];
  602. int ii,jj,i,j,k,l,kk;
  603. int dRes;
  604. // PR("CalcArray5n");
  605.     for(i=0;i<4;i++)
  606.     {
  607.         for(j=0;j<4;j++)    
  608.         {
  609.             if(j==i)
  610.             {
  611.                 continue;
  612.             }
  613.             for(k=0;k<4;k++)
  614.             {
  615.                 if(k==i||k==j)
  616.                 {
  617.                     continue;
  618.                 }
  619.                 for(l=0;l<4;l++)
  620.                 {
  621.                     if(l==i||l==j||l==k)
  622.                     {
  623.                         continue;
  624.                     }
  625.                     expression[1][0]=iNumInput[0][i];
  626.                     expression[3][0]=iNumInput[0][j];
  627.                     expression[7][0]=iNumInput[0][k];
  628.                     expression[9][0]=iNumInput[0][l];
  629. expression[1][1]=eNumber;
  630. expression[3][1]=eNumber;
  631. expression[7][1]=eNumber;
  632. expression[9][1]=eNumber;
  633. for (ii=0;ii<4;ii++)
  634. {
  635. for (jj=0;jj<4;jj++)
  636. {
  637. for (kk=0;kk<4;kk++)
  638. {
  639. expression[2][0] = oper[ii];
  640. expression[2][1] = eOperator;
  641. expression[5][0] = oper[jj];
  642. expression[5][1] = eOperator;
  643. expression[8][0] = oper[kk];
  644. expression[8][1] = eOperator;
  645. expression[11][0] = oper[6];
  646. expression[11][1] = eOperator;
  647. expression[0][0] = oper[4];
  648. expression[0][1] = eOperator;
  649. expression[6][0] = oper[4];
  650. expression[6][1] = eOperator;
  651. expression[4][0] = oper[5];
  652. expression[4][1] = eOperator;
  653. expression[10][0] = oper[5];
  654. expression[10][1] = eOperator;
  655. dRes = CalcOneExpress(expression);
  656. if(Equal24(dRes))
  657. {
  658. PR("可以这样运算:%c%d%c%d%c%c%c%d%c%d%cn",oper[4],expression[1][0],oper[ii],expression[3][0],oper[5],oper[jj],oper[4],expression[7][0],oper[kk],expression[9][0],oper[5]);
  659. return TRUE;
  660. }
  661. }
  662. }
  663. }//end of for oper
  664. }
  665. }
  666. }
  667. }
  668. return FALSE;
  669. }
  670. int CalcArray6(int iNumInput[2][4])
  671. {
  672. // ((a * b) * c) * d //11 number
  673. int expression[12][2];
  674. int ii,jj,i,j,k,l,kk;
  675. int dRes;
  676. // PR("CalcArray6n");
  677.     for(i=0;i<4;i++)
  678.     {
  679.         for(j=0;j<4;j++)    
  680.         {
  681.             if(j==i)
  682.             {
  683.                 continue;
  684.             }
  685.             for(k=0;k<4;k++)
  686.             {
  687.                 if(k==i||k==j)
  688.                 {
  689.                     continue;
  690.                 }
  691.                 for(l=0;l<4;l++)
  692.                 {
  693.                     if(l==i||l==j||l==k)
  694.                     {
  695.                         continue;
  696.                     }
  697.                     expression[2][0]=iNumInput[0][i];
  698.                     expression[4][0]=iNumInput[0][j];
  699.                     expression[7][0]=iNumInput[0][k];
  700.                     expression[10][0]=iNumInput[0][l];
  701. expression[2][1]=eNumber;
  702. expression[4][1]=eNumber;
  703. expression[7][1]=eNumber;
  704. expression[10][1]=eNumber;
  705. for (ii=0;ii<4;ii++)
  706. {
  707. for (jj=0;jj<4;jj++)
  708. {
  709. for (kk=0;kk<4;kk++)
  710. {
  711. expression[3][0] = oper[ii];
  712. expression[3][1] = eOperator;
  713. expression[6][0] = oper[jj];
  714. expression[6][1] = eOperator;
  715. expression[9][0] = oper[kk];
  716. expression[9][1] = eOperator;
  717. expression[11][0] = oper[6];
  718. expression[11][1] = eOperator;
  719. expression[0][0] = oper[4];
  720. expression[0][1] = eOperator;
  721. expression[1][0] = oper[4];
  722. expression[1][1] = eOperator;
  723. expression[5][0] = oper[5];
  724. expression[5][1] = eOperator;
  725. expression[8][0] = oper[5];
  726. expression[8][1] = eOperator;
  727. dRes = CalcOneExpress(expression);
  728. if(Equal24(dRes))
  729. {
  730. PR("可以这样运算:%c%c%d%c%d%c%c%d%c%c%dn",oper[4],oper[4],expression[2][0],oper[ii],expression[4][0],oper[5],oper[jj],expression[7][0],oper[5],oper[kk],expression[10][0]);
  731. return TRUE;
  732. }
  733. }
  734. }
  735. }//end of for oper
  736. }
  737. }
  738. }
  739. }
  740. return FALSE;
  741. }
  742. int CalcArray7(int iNumInput[2][4])
  743. {
  744. // (a * b * c) * d //9 number
  745. int expression[12][2];
  746. int ii,jj,i,j,k,l,kk;
  747. int dRes;
  748. // PR("CalcArray7n");
  749.     for(i=0;i<4;i++)
  750.     {
  751.         for(j=0;j<4;j++)    
  752.         {
  753.             if(j==i)
  754.             {
  755.                 continue;
  756.             }
  757.             for(k=0;k<4;k++)
  758.             {
  759.                 if(k==i||k==j)
  760.                 {
  761.                     continue;
  762.                 }
  763.                 for(l=0;l<4;l++)
  764.                 {
  765.                     if(l==i||l==j||l==k)
  766.                     {
  767.                         continue;
  768.                     }
  769.                     expression[1][0]=iNumInput[0][i];
  770.                     expression[4][0]=iNumInput[0][j];
  771.                     expression[6][0]=iNumInput[0][k];
  772.                     expression[10][0]=iNumInput[0][l];
  773. expression[1][1]=eNumber;
  774. expression[4][1]=eNumber;
  775. expression[6][1]=eNumber;
  776. expression[10][1]=eNumber;
  777. for (ii=0;ii<4;ii++)
  778. {
  779. for (jj=0;jj<4;jj++)
  780. {
  781. for (kk=0;kk<4;kk++)
  782. {
  783. expression[2][0] = oper[ii];
  784. expression[2][1] = eOperator;
  785. expression[5][0] = oper[jj];
  786. expression[5][1] = eOperator;
  787. expression[9][0] = oper[kk];
  788. expression[9][1] = eOperator;
  789. expression[11][0] = oper[6];
  790. expression[11][1] = eOperator;
  791. expression[0][0] = oper[4];
  792. expression[0][1] = eOperator;
  793. expression[3][0] = oper[4];
  794. expression[3][1] = eOperator;
  795. expression[7][0] = oper[5];
  796. expression[7][1] = eOperator;
  797. expression[8][0] = oper[5];
  798. expression[8][1] = eOperator;
  799. dRes = CalcOneExpress(expression);
  800. if(Equal24(dRes))
  801. {
  802. PR("可以这样运算:%c%d%c%c%d%c%d%c%c%c%dn",oper[4],expression[1][0],oper[ii],oper[4],expression[4][0],oper[jj],expression[6][0],oper[5],oper[5],oper[kk],expression[10][0]);
  803. return TRUE;
  804. }
  805. }
  806. }
  807. }//end of for oper
  808. }
  809. }
  810. }
  811. }
  812. return FALSE;
  813. }
  814. int Calc24(int number[2][4])
  815. {
  816. //括号的几种情况
  817. //1 无括号
  818. //2 (a b) c d 同a b (c d), 下省略
  819. //3 (a b c) d
  820. //4 a (b c) d
  821. //5 (a b) (c d)
  822. //6 ((a b) c) d
  823. //7 (a (b c)) d
  824. if (CalcArray1(number))//计算不含括号的情况
  825. return TRUE;
  826. if (CalcArray2(number))
  827. {  
  828. return TRUE;
  829. }
  830. if (CalcArray3(number))
  831. {  
  832. return TRUE;
  833. }
  834. if (CalcArray4(number))
  835. {  
  836. return TRUE;
  837. }
  838. if (CalcArray5(number))
  839. {  
  840. return TRUE;
  841. }
  842. if (CalcArray6(number))
  843. {  
  844. return TRUE;
  845. }
  846. if (CalcArray7(number))
  847. {  
  848. return TRUE;
  849. }
  850. PR("这四个数字不能算出24点.n");
  851. return FALSE;
  852. }
  853. /****************计算机计算模块*******************************/
  854. void game_24_main(){
  855. char s[40],ch,mood;
  856. int result,t=1,t0=1,nall=0,nright=0,t1=1;
  857. double right;
  858. while(t==1){
  859. PR("你想采用什么模式?n");
  860. PR("    ****************************************************n");
  861. PR("    *-------24点游戏菜单-------------------------------*n");
  862. PR("    *   计算机给出四个数字,你来算直到你想退出:-----0   *n");  
  863. PR("    *自己给出四个数字,要计算机来算,直到想退出:-----1   *n");
  864. PR("    *                            退出24点游戏:-----2   *n");
  865. PR("    ****************************************************n");
  866. PR("请选择模式:");
  867. mood=getch();
  868. PR("%cn",ch);
  869. // scanf( "  %c",&mood);
  870. if (mood=='0'){
  871. nall=0;
  872. nright=0;
  873. t0=1;
  874. while(t0==1){
  875. number[2][4]=randomm();
  876. PR("这四个数字是: %d   %d    %d   %dn",number[0][0],number[0][1],number[0][2],number[0][3]);
  877. PR("请输入算式n做上5道看看会有什么结果……n");
  878. PR("如果你认为这四个数算不出24点,请输入 ?n");
  879. PR("计算机将会给出答案,算不出也是一种答案!n");
  880. PR("你的算式是:");
  881. scanf ("%s",s);
  882. if(s[0]=='?'){
  883. if (Calc24(number)==1){
  884. nall++;
  885. }
  886. }
  887. else {
  888. result=EvaluateExpression(s);
  889. PR("你输入的算式的结果是: %d n",result);
  890. if(result==24){
  891. PR("恭喜您,你算对了!n");
  892. nright++;
  893. nall++;
  894.                     }
  895. else {
  896. PR("对不起,你算错了,谢谢!n");
  897. Calc24(number);
  898. nall++;
  899. }
  900. }//else
  901. PR("你共做了%d道,做对了%d道n",nall,nright);
  902. if (nall%5==0&&nall!=0){
  903. right=(double)nright/nall;
  904. PR("你的正确率为: %fn",right);
  905. if (right<0.5){
  906. PR("训练尚未成功,同志仍须努力!n");
  907. }
  908. else if(right>=0.5&&right<0.7){
  909. PR("不错不错,假以时日,必成良材!n");
  910. }
  911. else if(right>=0.7&&right<0.8){
  912. PR("将遇良材,非大战三百回合不可!n");
  913. }
  914. else if(right>=0.8&&right<0.96){
  915. PR("对你的敬佩之情,如滔滔江水,绵绵不绝---^^n");
  916. }
  917. else {
  918. PR("如此才智,老夫自愧不如n");
  919. }
  920. }
  921. PR("继续这个模式吗?请选择: 'y':继续 'n':退出?n");
  922. ch=getch();
  923.     // scanf(" %c",&ch);
  924. if(ch=='n'||ch=='N'){
  925. t0=0;
  926. }
  927. else  if (ch=='Y'||ch=='y')   t0=1;
  928. else{
  929. PR("你的选择(输入)有误!n"); 
  930. // t0=0;
  931.         }
  932. }//while mood 0
  933. }//end if mood 0
  934. else if (mood=='1'){
  935. t1=1;
  936. while (t1==1){
  937. PR("请输入四个正整数1-13:(用逗号隔开) ");
  938. scanf("%d,%d,%d,%d",&number[0][0],&number[0][1],&number[0][2],&number[0][3]);
  939. Calc24(number);
  940. PR("继续这个模式吗?请选择: 'y':继续 'n':退出?n");
  941. ch=getch();
  942. // scanf(" %c",&ch);
  943. if(ch=='n'||ch=='N'){
  944. t1=0;
  945. }
  946. else  if (ch=='Y'||ch=='y')   t1=1;
  947. else{
  948. PR("你的选择(输入)有误!n"); 
  949. t1=0;
  950.   }
  951. }
  952. }//end mood 1
  953. else if (mood=='2'){
  954. // PR(" 再见!n");
  955. t=0;
  956. }
  957. else {
  958. PR("mood =%cn",mood);
  959. PR("你的选择(输入)有误!n");
  960. // t=0;
  961. }
  962. }//end big while 
  963. }