- 注册时间
- 2005-4-19
- 最后登录
- 1970-1-1
|
- /************************************************
- 24D Game
- Write By Sxy
- 05.4.21~
- Version 1.1
- 用逆波兰式实现,但在WQX上速度太慢,谁能不能想出更好的算法
- ************************************************/
- #define MAXTREE 10
- #define MAIN 1
- #define PLAY 2
- #define CHECK 3
- #define ABOUT 4
- #define QUIT 0
- #define UP 20
- #define DOWN 21
- #define LEFT 23
- #define RIGHT 22
- #define OK 0x0d
- #define ESC 0x1b
- #define SHIFT 26
- long Message; //message
- int oindex[5][3]={2,4,6,3,4,6,2,5,6,3,5,6,4,5,6};
- int dindex[5][4]={0,1,3,5,0,1,2,5,0,1,3,4,0,1,2,4,0,1,2,3};
- char opera[]="+-*/";
- char _oper[]="+++++-++*++/+-++--+-*+-/+*++*-+**+*/+/++/-+/*+//-++-+--+*-+/--+-----*--/-*+-*--**-*/-/+-/--/*-//*++*+-*+**+/*-+*--*-**-/**+**-*****/*/+*/-*/**///++/+-/+*/+//-+/--/-*/-//*+/*-/**/*///+//-//*///";
- 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,
- 2,1,3,4, 2,1,4,3, 2,3,4,1, 2,3,1,4, 2,4,1,3, 2,4,3,1,
- 3,1,2,4, 3,1,4,2, 3,2,1,4, 3,2,4,1, 3,4,1,2, 3,4,2,1,
- 4,1,2,3, 4,1,3,2, 4,2,3,1, 4,2,1,3, 4,3,2,1, 4,3,1,2};
- char _TreeNode[MAXTREE][9]; //0~1:data,2,bit,3-4:left,5-6:right,6-7:parent
- char _TreeStau[MAXTREE]; //1:user,2:unuser
- int _TreeData[2]; //temp data for Tree structure
- //****************************************************
- int bit=0; //if / 1,else 0
- //****************************************************
- char match[]=">><<<>>>><<<>>>>>><>>>>>><>><<<<<= >>>> >><<<<< =";
- char operat[]="+-*/()@";
- char Match(char ch1,char ch2)
- {
- int i,j;
- i=0;
- j=0;
- while(operat[i]!=ch1) i++;
- while(operat[j]!=ch2) j++;
- return match[i*7+j];
- }
- ////////////////////实现树结构//////////////////////////
- void InitTree() //init treeNode data
- {
- int k;
- for(k=0;k<MAXTREE;k++) _TreeStau[k]=0;
- }
- long CreateTree() //建立一个树节点,返回节点位置
- {
- int k;
- k=0;
- while(_TreeStau[k])k++;
- _TreeStau[k]=1;
- return k;
- }
- void DestroyTree(int index) //销毁树节点
- {
- _TreeStau[index]=0;
- }
- void SetLeft(int index,int left) //将left赋给节点位置为index的树节点的左节点
- {
- _TreeData[0]=left;
- memcpy(_TreeNode[index]+3,_TreeData,2);
- }
- void SetRight(int index,int right) //................
- {
- _TreeData[0]=right;
- memcpy(_TreeNode[index]+5,_TreeData,2);
- }
- void SetParent(int index,int parent)
- {
- _TreeData[0]=parent;
- memcpy(_TreeNode[index]+7,_TreeData,2);
- }
- void SetData(int index,int data)
- {
- _TreeData[0]=data;
- memcpy(_TreeNode[index],_TreeData,2);
- }
- long GetLeft(int index) //返回index的右孩子
- {
- memcpy(_TreeData,_TreeNode[index]+3,2);
- return _TreeData[0];
- }
- long GetRight(int index)
- {
- memcpy(_TreeData,_TreeNode[index]+5,2);
- return _TreeData[0];
- }
- long GetParent(int index)
- {
- memcpy(_TreeData,_TreeNode[index]+7,2);
- return _TreeData[0];
- }
- long GetData(int index)
- {
- memcpy(_TreeData,_TreeNode[index],2);
- return _TreeData[0];
- }
- ///////////////////////////////////////////////////////
- long CreateBN(long str,int length) // 用一个int str[]逆波兰式建立一棵树
- {
- int data[10];
- int node[10];
- int k,i;
- int p,r,l;
- memcpy(data,str,length*2);
- InitTree();
- i=0; //index for node
- for(k=0;k<length;k++){
- if(data[k]=='+'||data[k]=='-'||data[k]=='*'||data[k]=='/'){
- r=node[--i];
- l=node[--i];
- p=CreateTree();
- SetLeft(p,l);
- SetRight(p,r);
- SetParent(p,-1); //(>20)=NULL here
- SetData(p,data[k]);
- SetParent(r,p);
- SetParent(l,p);
- node[i++]=p;
- }
- else{
- p=CreateTree();
- SetLeft(p,-1);
- SetRight(p,-1);
- SetParent(p,-1);
- SetData(p,data[k]);
- node[i++]=p;
- }
- }
- return node[0];
- }
- //////////////////////////////////////////////////////
- void printBN(int root) //打印逆波兰式
- {
- if(GetLeft(root)<0) printf("%d",GetData(root));
- else{
- printBN(GetLeft(root));
- printBN(GetRight(root));
- printf("%c",GetData(root));
- }
- }
- void PrintExpr(int root) //打印中缀表达式
- {
- if(GetLeft(root)<0) printf("%d",GetData(root));
- else if(GetParent(root)<0){
- PrintExpr(GetLeft(root));
- printf("%c",GetData(root));
- PrintExpr(GetRight(root));
- }
- else if(GetLeft(GetParent(root))==root&&Match(GetData(root),GetData(GetParent(root)))=='>'){
- PrintExpr(GetLeft(root));
- printf("%c",GetData(root));
- PrintExpr(GetRight(root));
- }
- else if(GetRight(GetParent(root))==root&&(GetData(GetParent(root))=='+'||Match(GetData(GetParent(root)),GetData(root))=='<'||(GetData(GetParent(root))=='*'&&GetData(root)=='*'))){
- PrintExpr(GetLeft(root));
- printf("%c",GetData(root));
- PrintExpr(GetRight(root));
- }
- else{
- printf("(");
- PrintExpr(GetLeft(root));
- printf("%c",GetData(root));
- PrintExpr(GetRight(root));
- printf(")");
- }
- }
-
- ///////////////////////////////////////////////////////
- long GetValue(long str,long vaddr) //求用int str[]表示的逆波兰式的值,用地址vaddr返回
- {
- int istk[5];
- int data[7];
- int index;
- int t,t1,t2;
- int i;
- memcpy(data,str,14);
- index=0;
- for(i=0;i<7;i++){
- if(data<=13&&data>0) istk[index++]=data;
- else{
- t2=istk[--index];
- t1=istk[--index];
- if(data=='+') t=t1+t2;
- else if(data=='-') t=t1-t2;
- else if(data=='*') t=t1*t2;
- else if(data=='/'&&t2){
- if(t1%t2==0||bit) t=t1/t2;
- else return 0;
- }
- else return 0;
- istk[index++]=t;
- }
- }
- memcpy(vaddr,istk,2);
- return 1;
- }
- //////////////////////////////////////////////////////
- long Check24u(long address) //用int addr[4]...
- {
- int data[5];
- int hz[7];
- char vaddr[2];
- int value;
- int k,i,k1,p;
- memcpy(data+2,address,8);
- for(i=0;i<5;i++){
- for(k1=0;k1<24;k1++){
- hz[dindex[0]]=data[_dindex[k1][0]];
- hz[dindex[1]]=data[_dindex[k1][1]];
- hz[dindex[2]]=data[_dindex[k1][2]];
- hz[dindex[3]]=data[_dindex[k1][3]];
- for(p=0;p<64;p++){
- hz[oindex[0]]=_oper[p*3];
- hz[oindex[1]]=_oper[p*3+1];
- hz[oindex[2]]=_oper[p*3+2];
- if(GetValue(hz,vaddr+2)&&value==24){
- PrintExpr(CreateBN(hz,7));
- return 1;
- }
- }
- }
- }
- return 0;
- }
- ////////////////////////////////////////////////////////////////////
- void InitGame()
- {
- int i;
- char tch;
- int xy[4][2];
- xy[0][0]=7;xy[0][1]=18;
- xy[1][0]=87;xy[1][1]=18;
- xy[2][0]=7;xy[2][1]=42;
- xy[3][0]=87;xy[3][1]=42;
- ClearScreen();
- Refresh();
- i=0;
- while(1){
- ClearScreen();
- TextOut(0,0,"********24点********",0x81);
- TextOut(10,20,"训练模式",0x81);
- TextOut(90,20,"比赛模式",0x81);
- TextOut(10,44,"游戏说明",0x81);
- TextOut(90,44,"退出游戏",0x81);
- TextOut(0,64,"********************",0x81);
- Refresh();
- Box(xy[0],xy[1],xy[0]+68,xy[1]+17,1,2);
- tch=getchar();
- if(tch==OK){
- if(i==0) Message=CHECK;
- else if(i==1) Message=PLAY;
- else if(i==2) Message=ABOUT;
- else Message=QUIT;
- break;
- }
- else if(tch==LEFT) i=(i+3)%4;
- else if(tch==RIGHT) i=(i+1)%4;
- else if(tch==UP||tch==DOWN) i=(i+2)%4;
- }
- }
- void Play()
- {
- Message=MAIN;
- }
- void Check()
- {
- char data[4][4];
- int digi[4];
- int k;
- int i;
- char tch;
- ClearScreen();
- Refresh();
- memset(data,0,16);
- for(i=0;i<4;i++){
- digi=7;
- sprintf(data,"%d",digi);
- }
- k=0;
- while(1){
- ClearScreen();
- TextOut(40,20,data[0],0x81);
- TextOut(70,20,data[1],0x81);
- TextOut(100,20,data[2],0x81);
- TextOut(130,20,data[3],0x81);
- Refresh();
- Box(38+k*30,19,58+k*30,37,1,2);
- tch=getchar();
- if(tch==ESC){
- Message=MAIN;
- break;
- }
- else if(tch==OK){
- ClearScreen();
- Refresh();
- SetScreen(0);
- if(!Check24u(digi)){
- Locate(2,8);
- printf("无解!");
- Delay(1000);
- }
- else getchar();
- }
- else if(tch==UP&&digi[k]<13){
- digi[k]++;
- sprintf(data[k],"%d",digi[k]);
- }
- else if(tch==DOWN&&digi[k]>1){
- digi[k]--;
- sprintf(data[k],"%d",digi[k]);
- }
- else if(tch==LEFT) k=(k+3)%4;
- else if(tch==RIGHT) k=(k+1)%4;
- }
-
- }
- void Quit()
- {
- exit(1);
- }
- void About()
- {
- Message=MAIN;
- }
- long Game()
- {
- InitGame();
- while(1){
- if(Message==MAIN ) Game();
- if(Message==PLAY ) Play();
- if(Message==CHECK) Check();
- if(Message==ABOUT) About();
- if(Message==QUIT) Quit();
- }
- }
-
- void main()
- {
- Game();
- }
-
-
-
复制代码
|
|