易码技术论坛

 找回密码
 加入易码
搜索
查看: 121142|回复: 5

[原创]24点游戏源代码

[复制链接]
发表于 2005-4-21 22:43:00 | 显示全部楼层
当然,这个问题还有一种很好的算法:递归。
所谓好的算法是指能推广到25点,26点。。。也可以推广到5个数,6个数。。。
发表于 2005-5-5 16:14:00 | 显示全部楼层
好象在basic中也能开发24点,并能推广到机器的最大能力
[em06]
发表于 2005-5-19 14:15:00 | 显示全部楼层
编译 noname.txt ...
1 PASS OK!
2 PASS OK!
错误:=左边操作数必须是变量发生在287行
发表于 2005-5-19 14:18:00 | 显示全部楼层
代码一帖论坛上就走样了。比如 [ 符号有时会被吃掉(当作ubb代码了)
发表于 2005-5-19 14:32:00 | 显示全部楼层
那以后保存成文本文件,然后上 传为附件就行了吧
 楼主| 发表于 2005-4-21 21:50:50 | 显示全部楼层 |阅读模式




  1. /************************************************
  2. 24D Game
  3. Write By Sxy
  4. 05.4.21~
  5. Version 1.1

  6. 用逆波兰式实现,但在WQX上速度太慢,谁能不能想出更好的算法
  7. ************************************************/
  8. #define MAXTREE  10
  9. #define MAIN     1
  10. #define PLAY     2
  11. #define CHECK    3
  12. #define ABOUT    4
  13. #define QUIT     0
  14. #define UP       20
  15. #define DOWN     21
  16. #define LEFT     23
  17. #define RIGHT    22
  18. #define OK       0x0d
  19. #define ESC      0x1b
  20. #define SHIFT    26
  21. long Message;      //message
  22. int oindex[5][3]={2,4,6,3,4,6,2,5,6,3,5,6,4,5,6};
  23. int dindex[5][4]={0,1,3,5,0,1,2,5,0,1,3,4,0,1,2,4,0,1,2,3};
  24. char opera[]="+-*/";
  25. char _oper[]="+++++-++*++/+-++--+-*+-/+*++*-+**+*/+/++/-+/*+//-++-+--+*-+/--+-----*--/-*+-*--**-*/-/+-/--/*-//*++*+-*+**+/*-+*--*-**-/**+**-*****/*/+*/-*/**///++/+-/+*/+//-+/--/-*/-//*+/*-/**/*///+//-//*///";
  26. int _dindex[24][4]={1,2,3,4, 1,2,4,3, 1,3,2,4, 1,3,4,2, 1,4,2,3, 1,4,3,2,
  27.                      2,1,3,4, 2,1,4,3, 2,3,4,1, 2,3,1,4, 2,4,1,3, 2,4,3,1,
  28.                      3,1,2,4, 3,1,4,2, 3,2,1,4, 3,2,4,1, 3,4,1,2, 3,4,2,1,
  29.                      4,1,2,3, 4,1,3,2, 4,2,3,1, 4,2,1,3, 4,3,2,1, 4,3,1,2};
  30. char _TreeNode[MAXTREE][9];         //0~1:data,2,bit,3-4:left,5-6:right,6-7:parent
  31. char _TreeStau[MAXTREE];             //1:user,2:unuser
  32. int  _TreeData[2];                   //temp data for Tree structure
  33. //****************************************************
  34. int  bit=0;               //if  / 1,else 0  
  35. //****************************************************
  36. char match[]=">><<<>>>><<<>>>>>><>>>>>><>><<<<<= >>>> >><<<<< =";
  37. char operat[]="+-*/()@";
  38. char Match(char ch1,char ch2)
  39. {
  40. int i,j;
  41. i=0;
  42. j=0;
  43. while(operat[i]!=ch1) i++;
  44. while(operat[j]!=ch2) j++;
  45. return match[i*7+j];
  46. }
  47. ////////////////////实现树结构//////////////////////////
  48. void InitTree()           //init treeNode data
  49. {
  50.    int k;
  51.    for(k=0;k<MAXTREE;k++) _TreeStau[k]=0;
  52. }
  53. long CreateTree()         //建立一个树节点,返回节点位置
  54. {
  55.    int k;
  56.    k=0;
  57.    while(_TreeStau[k])k++;
  58.    _TreeStau[k]=1;
  59.    return k;
  60. }
  61. void DestroyTree(int index)  //销毁树节点
  62. {
  63.    _TreeStau[index]=0;
  64. }
  65. void SetLeft(int index,int left)   //将left赋给节点位置为index的树节点的左节点
  66. {
  67.    _TreeData[0]=left;
  68.    memcpy(_TreeNode[index]+3,_TreeData,2);
  69. }
  70. void SetRight(int index,int right)  //................
  71. {
  72.    _TreeData[0]=right;
  73.    memcpy(_TreeNode[index]+5,_TreeData,2);
  74. }
  75. void SetParent(int index,int parent)
  76. {
  77.    _TreeData[0]=parent;
  78.    memcpy(_TreeNode[index]+7,_TreeData,2);
  79. }
  80. void SetData(int index,int data)
  81. {
  82.    _TreeData[0]=data;
  83.    memcpy(_TreeNode[index],_TreeData,2);
  84. }
  85. long GetLeft(int index)         //返回index的右孩子
  86. {
  87.     memcpy(_TreeData,_TreeNode[index]+3,2);
  88.     return _TreeData[0];
  89. }
  90. long GetRight(int index)
  91. {
  92.     memcpy(_TreeData,_TreeNode[index]+5,2);
  93.     return _TreeData[0];
  94. }
  95. long GetParent(int index)
  96. {
  97.     memcpy(_TreeData,_TreeNode[index]+7,2);
  98.     return _TreeData[0];
  99. }
  100. long GetData(int index)
  101. {
  102.     memcpy(_TreeData,_TreeNode[index],2);
  103.     return _TreeData[0];
  104. }
  105. ///////////////////////////////////////////////////////
  106. long CreateBN(long str,int length) // 用一个int str[]逆波兰式建立一棵树
  107. {
  108.     int data[10];
  109.     int node[10];
  110.     int k,i;
  111.     int p,r,l;
  112.     memcpy(data,str,length*2);
  113.     InitTree();
  114.     i=0;                    //index for node
  115.     for(k=0;k<length;k++){
  116.        if(data[k]=='+'||data[k]=='-'||data[k]=='*'||data[k]=='/'){
  117.          r=node[--i];
  118.          l=node[--i];
  119.          p=CreateTree();
  120.          SetLeft(p,l);
  121.          SetRight(p,r);
  122.          SetParent(p,-1);        //(>20)=NULL here
  123.          SetData(p,data[k]);
  124.          SetParent(r,p);
  125.          SetParent(l,p);
  126.          node[i++]=p;
  127.        }
  128.        else{
  129.          p=CreateTree();
  130.          SetLeft(p,-1);
  131.          SetRight(p,-1);
  132.          SetParent(p,-1);
  133.          SetData(p,data[k]);
  134.          node[i++]=p;
  135.        }
  136.     }
  137.     return node[0];
  138. }
  139. //////////////////////////////////////////////////////
  140. void printBN(int root)  //打印逆波兰式
  141. {
  142.      if(GetLeft(root)<0) printf("%d",GetData(root));
  143.      else{
  144.         printBN(GetLeft(root));
  145.         printBN(GetRight(root));
  146.         printf("%c",GetData(root));
  147.      }
  148. }   
  149. void PrintExpr(int root)   //打印中缀表达式
  150. {
  151.      if(GetLeft(root)<0) printf("%d",GetData(root));
  152.      else if(GetParent(root)<0){
  153.            PrintExpr(GetLeft(root));
  154.            printf("%c",GetData(root));
  155.            PrintExpr(GetRight(root));
  156.      }
  157.      else if(GetLeft(GetParent(root))==root&&Match(GetData(root),GetData(GetParent(root)))=='>'){
  158.            PrintExpr(GetLeft(root));
  159.            printf("%c",GetData(root));
  160.            PrintExpr(GetRight(root));
  161.      }
  162.      else if(GetRight(GetParent(root))==root&&(GetData(GetParent(root))=='+'||Match(GetData(GetParent(root)),GetData(root))=='<'||(GetData(GetParent(root))=='*'&&GetData(root)=='*'))){
  163.            PrintExpr(GetLeft(root));
  164.            printf("%c",GetData(root));
  165.            PrintExpr(GetRight(root));
  166.      }
  167.      else{
  168.            printf("(");
  169.            PrintExpr(GetLeft(root));
  170.            printf("%c",GetData(root));
  171.            PrintExpr(GetRight(root));
  172.            printf(")");
  173.      }
  174. }     
  175.       
  176. ///////////////////////////////////////////////////////
  177. long GetValue(long str,long vaddr) //求用int str[]表示的逆波兰式的值,用地址vaddr返回
  178. {
  179.      int istk[5];
  180.      int data[7];
  181.      int index;
  182.      int t,t1,t2;
  183.      int i;
  184.      memcpy(data,str,14);
  185.      index=0;
  186.      for(i=0;i<7;i++){
  187.         if(data<=13&&data>0) istk[index++]=data;
  188.         else{
  189.            t2=istk[--index];
  190.            t1=istk[--index];
  191.            if(data=='+') t=t1+t2;
  192.            else if(data=='-') t=t1-t2;
  193.            else if(data=='*') t=t1*t2;
  194.            else if(data=='/'&&t2){
  195.                  if(t1%t2==0||bit) t=t1/t2;
  196.                  else return 0;
  197.            }
  198.            else return 0;
  199.            istk[index++]=t;
  200.         }
  201.       }
  202.       memcpy(vaddr,istk,2);
  203.       return 1;
  204. }
  205. //////////////////////////////////////////////////////
  206. long Check24u(long address)       //用int addr[4]...
  207. {
  208.     int data[5];
  209.     int hz[7];
  210.     char vaddr[2];
  211.     int  value;
  212.     int k,i,k1,p;
  213.     memcpy(data+2,address,8);
  214.     for(i=0;i<5;i++){
  215.        for(k1=0;k1<24;k1++){
  216.                     hz[dindex[0]]=data[_dindex[k1][0]];
  217.                     hz[dindex[1]]=data[_dindex[k1][1]];
  218.                     hz[dindex[2]]=data[_dindex[k1][2]];
  219.                     hz[dindex[3]]=data[_dindex[k1][3]];
  220.                      for(p=0;p<64;p++){
  221.                               hz[oindex[0]]=_oper[p*3];
  222.                               hz[oindex[1]]=_oper[p*3+1];
  223.                               hz[oindex[2]]=_oper[p*3+2];
  224.                               if(GetValue(hz,vaddr+2)&&value==24){
  225.                                       PrintExpr(CreateBN(hz,7));
  226.                                       return 1;
  227.                     }
  228.                   }
  229.                 }
  230.               }
  231.     return 0;
  232. }
  233. ////////////////////////////////////////////////////////////////////
  234. void InitGame()
  235. {
  236.     int i;
  237.     char tch;
  238.     int xy[4][2];
  239.     xy[0][0]=7;xy[0][1]=18;
  240.     xy[1][0]=87;xy[1][1]=18;
  241.     xy[2][0]=7;xy[2][1]=42;
  242.     xy[3][0]=87;xy[3][1]=42;
  243.     ClearScreen();
  244.     Refresh();
  245.     i=0;
  246.     while(1){
  247.       ClearScreen();
  248.       TextOut(0,0,"********24点********",0x81);
  249.       TextOut(10,20,"训练模式",0x81);
  250.       TextOut(90,20,"比赛模式",0x81);
  251.       TextOut(10,44,"游戏说明",0x81);
  252.       TextOut(90,44,"退出游戏",0x81);
  253.       TextOut(0,64,"********************",0x81);
  254.       Refresh();
  255.       Box(xy[0],xy[1],xy[0]+68,xy[1]+17,1,2);
  256.       tch=getchar();
  257.       if(tch==OK){
  258.          if(i==0) Message=CHECK;
  259.          else if(i==1) Message=PLAY;
  260.          else if(i==2) Message=ABOUT;
  261.          else          Message=QUIT;
  262.          break;
  263.       }
  264.       else if(tch==LEFT) i=(i+3)%4;
  265.       else if(tch==RIGHT) i=(i+1)%4;
  266.       else if(tch==UP||tch==DOWN)    i=(i+2)%4;
  267.    }
  268. }
  269. void Play()
  270. {
  271.      Message=MAIN;
  272. }
  273. void Check()
  274. {
  275.      char data[4][4];
  276.      int  digi[4];
  277.      int k;
  278.      int i;
  279.      char tch;
  280.      ClearScreen();
  281.      Refresh();
  282.      memset(data,0,16);
  283.      for(i=0;i<4;i++){
  284.           digi=7;
  285.           sprintf(data,"%d",digi);
  286.      }
  287.      k=0;
  288.      while(1){
  289.           ClearScreen();
  290.           TextOut(40,20,data[0],0x81);
  291.           TextOut(70,20,data[1],0x81);
  292.           TextOut(100,20,data[2],0x81);
  293.           TextOut(130,20,data[3],0x81);
  294.           Refresh();
  295.           Box(38+k*30,19,58+k*30,37,1,2);
  296.           tch=getchar();
  297.           if(tch==ESC){
  298.               Message=MAIN;
  299.               break;
  300.           }
  301.           else if(tch==OK){
  302.               ClearScreen();
  303.               Refresh();
  304.               SetScreen(0);
  305.               if(!Check24u(digi)){
  306.                        Locate(2,8);
  307.                        printf("无解!");
  308.                        Delay(1000);
  309.               }
  310.               else getchar();
  311.           }
  312.           else if(tch==UP&&digi[k]<13){
  313.                        digi[k]++;
  314.                        sprintf(data[k],"%d",digi[k]);
  315.           }
  316.           else if(tch==DOWN&&digi[k]>1){
  317.                        digi[k]--;
  318.                        sprintf(data[k],"%d",digi[k]);
  319.           }
  320.           else if(tch==LEFT)     k=(k+3)%4;
  321.           else if(tch==RIGHT)    k=(k+1)%4;
  322.      }
  323.               
  324. }
  325. void Quit()
  326. {
  327.     exit(1);
  328. }   
  329. void About()
  330. {
  331.     Message=MAIN;
  332. }   
  333. long Game()
  334. {
  335.     InitGame();
  336.     while(1){
  337.         if(Message==MAIN )  Game();
  338.         if(Message==PLAY )  Play();
  339.         if(Message==CHECK)  Check();
  340.         if(Message==ABOUT)  About();
  341.         if(Message==QUIT)   Quit();
  342.     }
  343. }
  344.      
  345. void main()
  346. {
  347.        Game();
  348. }
  349.            
  350.      
  351.      
复制代码



您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2025-6-17 05:59 , Processed in 0.012592 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表