引用 | 編輯
唐老鴨
2005-11-12 09:50 |
3樓
▲ ▼ |
下面是引用湛藍威尼斯於2005-11-11 21:14發表的 : 題目再給明確一點.... 例如老師有規定陣列要多大還是有些什麼限定的... 晚點寫一個產生迷宮的參考程式給你 .... 走的部份這裡有可以參考的程式 ... x0 |
引用 | 編輯
唐老鴨
2005-11-16 11:09 |
4樓
▲ ▼ |
剛花了點時間幫你把自動產生迷宮的程式寫出來了 .....
33*33的迷宮應該夠你用了吧.... 至於走的方法請你自己參考程式區有你要的寫法.... 下面我幫你加了些註解... 但也許對你會有些複雜.... 請自己努力看懂吧.... 不然就參考一些有關遊戲設計的書吧.... 我自己也有東西要做.... 所以我沒時間解釋給你聽 .... 複製程式 #include <iostream.h> #include <stdlib.h> #include <time.h> #define row 35 #define column 35 int maze[row][column]; void generatemaze(int x,int y) { int direction; maze[x][y] |= 0x1; // 標示此格已設定 while (maze[x][y+2]==0 || maze[x+2][y]==0 || maze[x][y-2]==0 || maze[x-2][y]==0) // 如果不是外牆 { direction = rand()%4+1; // 決定下一個位置 if (direction==1 && maze[x][y+2]==0) // 向右走 { maze[x][y+1] |= 0x1; // 拆掉右牆 generatemaze(x,y+2); } else if (direction==2 && maze[x-2][y]==0) // 向上走 { maze[x-1][y] |= 0x1; // 拆掉上牆 generatemaze(x-2,y); } else if (direction==3 && maze[x][y-2]==0) // 向左走 { maze[x][y-1] |= 0x1; // 拆掉右牆 generatemaze(x,y-2); } else if (direction==4 && maze[x+2][y]==0) // 向下走 { maze[x+1][y] |= 0x1; // 拆掉上牆 generatemaze(x+2,y); } } } void main() { int Si=2,Sj=2,Ei=row-3,Ej=column-3; int x,y; srand(time(NULL)); for (x=0;x<row;x++) { for (y=0;y<column;y++) { if (x==0 || y==0 || y==1 || x==row-2 || x==row-1 || y==column-1 ) maze[x][y]=2; // 設定外牆 else maze[x][y]=0; // 初始迷宮內部 } } generatemaze(Ei,Ej); // 產生迷宮 maze[Si-1][Sj] |= 0x1; // 拆掉入口上牆 maze[Ei][Ej+1] |= 0x1; // 拆掉出口右牆 for(x=1; x<row-1; x++) { for(y=1; y<column-1; y++) { if (maze[x][y] == 0 || maze[x][y] == 2) cout<<"█"; else cout<<" "; } cout<<endl; } } x1 |
引用 | 編輯
湛藍威尼斯
2005-11-28 21:24 |
5樓
▲ ▼ |
最近忙期中~ 忙報告~ 今天才有時間上來看~
看謝大大回答~ 我們作業是隨機產生一個 1024*768 的地圖~ 老鼠走迷宮~ 從左上(入口)到右下(出口)走迷宮~ 所以根據大大給的程式碼~ 改個變數數據應該就可以 1024*768 非常感謝大大給的範例~ 走迷宮方式我再爬文~ 研究不出來~ 再題出來問~!! x0 |
引用 | 編輯
rakish
2005-11-30 15:00 |
6樓
▲ ▼ |
書上的..剛好看到...
複製程式 int maze[7][10]={ 1,1,1,1,1,1,1,1,1,1, 1,0,1,0,1,0,0,0,0,1, 1,0,1,0,1,0,1,1,0,1, 1,0,1,0,1,1,1,0,0,1, 1,0,1,0,0,0,0,0,1,1, 1,0,0,0,1,1,1,0,0,1, 1,1,1,1,1,1,1,1,1,1}; int find(int x,int y){//入口 if(x==1&&y==1){ //出口 maze[x][y]=2; return 1; }else{ if(maze[x][y]==0){ maze[x][y]=2; //表示走過 if(( find(x-1,y) +find(x+1,y) +find(x,y+1) +find(x,y-1))>0) return 1; }else{ maze[x][y]=0; return 0; } }else{ return 0; } } } void main(){ int i,j; find(2,5); //入口 } x0 |
引用 | 編輯
teexit
2005-11-30 21:22 |
7樓
▲ ▼ |
呵呵
大家都會在這邊提供OTZ 一說到迷宮 我們最近也要寫 聽說教到POINT的時候還要我們寫RPG的迷宮 聽說還要打怪物 XD x0 |
引用 | 編輯
湛藍威尼斯
2005-12-13 02:34 |
9樓
▲ ▼ |
下面是引用唐老鴨於2005-11-16 11:09發表的 : 唐老鴨大大~ 可以跟我講 0x1 <== 這是? 是隨便給的初始值嗎~? |= <== 這符號在您的程式碼中的意義 我查到這 |= 符號的意義是 執行運算子之後設定 direction = rand()%4+1; // 決定下一個位置 rand()%4+1; <= 這大概低意思~ 如果唐老鴨大大很忙低話~ 有哪位大大可以告訴我呢~ 拜託拜託~ x0 |
引用 | 編輯
唐老鴨
2005-12-14 04:14 |
10樓
▲ ▼ |
下面是引用湛藍威尼斯於2005-12-13 02:34發表的 : 0代表內牆....1代表內部通道....2代表外牆.... 上面的程式只有用到上牆及右牆來產生所有牆面.... 也就是假設你向右走.... 便拆掉前一個位置的右牆... 向上同理.... 0x1代表16進制的1.... 其實程式只是把原來的值做位元運算而已.... 像maze[x][y] |= 0x1; 用上面的程式其實就是等於 maze[x][y] = 1;... 這樣寫看起來其實沒什麼意義.... 但是如果你的程式是視窗程式的話... 用位元運算的寫法可以節省記憶體空間... 當然程式邏輯跟上面會有一點點不同.... rand()%4+1; 就是隨機取1到4的值.... 來決定要往哪邊走阿.... 這樣才能產生不同的迷宮囉.... x0 |
引用 | 編輯
唐老鴨
2005-12-14 04:25 |
11樓
▲ ▼ |
補充....
上面我寫的程式其實有點小BUG .... 用這裡的自動走迷宮的程式也許會有問題.... 雖然看程式的執行結果是看不出來.... 原想讓你自己發現自己改的.... 不過你好像看不太懂... 所以好人做到底好了 .... 複製程式 #include <iostream.h> #include <stdlib.h> #include <time.h> #define row 35 #define column 35 int maze[row][column]; void generatemaze(int x,int y) { int direction; maze[x][y] |= 0x1; // 標示此格已設定 while (maze[x][y+2]==0 || maze[x+2][y]==0 || maze[x][y-2]==0 || maze[x-2][y]==0) // 如果不是外牆 { direction = rand()%4+1; // 決定下一個位置 if (direction==1 && maze[x][y+2]==0) // 向右走 { maze[x][y+1] |= 0x1; // 拆掉右牆 generatemaze(x,y+2); } else if (direction==2 && maze[x-2][y]==0) // 向上走 { maze[x-1][y] |= 0x1; // 拆掉上牆 generatemaze(x-2,y); } else if (direction==3 && maze[x][y-2]==0) // 向左走 { maze[x][y-1] |= 0x1; // 拆掉右牆 generatemaze(x,y-2); } else if (direction==4 && maze[x+2][y]==0) // 向下走 { maze[x+1][y] |= 0x1; // 拆掉上牆 generatemaze(x+2,y); } } } void main() { int Si=2,Sj=2,Ei=row-3,Ej=column-3; int x,y; srand(time(NULL)); for (x=0;x<row;x++) { for (y=0;y<column;y++) { if (x==0 || y==0 || x==1 || y==1 || x==row-2 || x==row-1 || y==column-2 || y==column-1) //改這裡 maze[x][y]=2; // 設定外牆 else maze[x][y]=0; // 初始迷宮內部 } } generatemaze(Ei,Ej); // 產生迷宮 maze[Si-1][Sj] = 0x1; // 拆掉入口上牆 //改這裡 maze[Ei][Ej+1] = 0x1; // 拆掉出口右牆 //改這裡 for(x=1; x<row-1; x++) { for(y=1; y<column-1; y++) { if (maze[x][y] == 0 || maze[x][y] == 2) cout<<"█"; else cout<<" "; } cout<<endl; } } 我直接貼上去他就亂了.... 所以一樣自己排版吧 .... x0 |
引用 | 編輯
湛藍威尼斯
2005-12-14 19:47 |
12樓
▲ ▼ |
下面是引用唐老鴨於2005-12-14 04:25發表的 : 唐老大~ >"< 對不起~ 我資質駑鈍~ 我有改一些加走路的程式碼~ 可是跑不出來~ 可以幫我 debug 一下嗎~ >"< 可以指證一下我的錯誤~ 哪邊錯嗎?? 拜託了~!!! 天呀~~ 學不好~ 以下是我的修改過後~ 複製程式 #include <iostream> #define row 35 #define column 35 using namespace std; int maze[row][column]; struct link //鏈結串列 { int x,y; struct link *next; }; typedef struct link *list; //定義Link的指標叫做list list path=NULL; void print(); //印出來 void movemouse (int,int); //走 list push (list stack , int x ,int y ); void pop (list &stack ,int &x ,int &y ); void generatemaze(int x,int y) { int direction; maze[x][y] |= 0x1; // 標示此格已設定 while (maze[x][y+2]==0 || maze[x+2][y]==0 || maze[x][y-2]==0 || maze[x-2][y]==0) // 如果不是外牆 { direction = rand()%4+1; // 決定下一個位置 if (direction==1 && maze[x][y+2]==0) // 向右走 { maze[x][y+1] |= 0x1; // 拆掉右牆 generatemaze(x,y+2); } else if (direction==2 && maze[x-2][y]==0) // 向上走 { maze[x-1][y] |= 0x1; // 拆掉上牆 generatemaze(x-2,y); } else if (direction==3 && maze[x][y-2]==0) // 向左走 { maze[x][y-1] |= 0x1; // 拆掉右牆 generatemaze(x,y-2); } else if (direction==4 && maze[x+2][y]==0) // 向下走 { maze[x+1][y] |= 0x1; // 拆掉下牆 generatemaze(x+2,y); } } } int main() { char option; do{ int Si=2,Sj=2,Ei=row-3,Ej=column-3; int x,y; srand(time(NULL)); for (x=0;x<row;x++) { for (y=0;y<column;y++) { if (x==0 || y==0 || x==1 || y==1 || x==row-2 || x==row-1 || y==column-2 || y==column-1) //改這裡 maze[x][y]=2; // 設定外牆 else maze[x][y]=0; // 初始迷宮內部 } } generatemaze(Ei,Ej); // 產生迷宮 maze[Si-1][Sj] = 0x1; // 拆掉入口上牆 //改這裡 maze[Ei][Ej+1] = 0x1; // 拆掉出口右牆 //改這裡 for(x=1; x<row-1; x++) { for(y=1; y<column-1; y++) { if (maze[x][y] == 0 || maze[x][y] == 2) cout<<"█"; else cout<<" "; } cout<<endl; } cout<<"重新設定地圖請按 C ,任意字輸入就會開始"<<endl; cin>>option; }while(option=='c'||option=='C'); movemouse(2,2); cout<<"找到出口啦~ ^^ ~"<<endl; system("pause"); return 0; } void printmap () { system("cls"); for(int x=0;x<row;x++) { for(int y=0;y<column;y++) { switch(maze[row][column]) { case 0: cout<<" "; break; case 1: cout<<"■"; break; case 2: cout<<"@"; break; case 3: cout<<"X"; break; } } cout<<endl; } } void movemouse (int x,int y) { //Sleep(200); printmap (); if(x!=33||y!=33) { if(maze[x-1][y]==0) //up { maze[x][y]=2; path=push (path , x , y ); printmap (); x--; movemouse(x,y) ; } else if( maze[x][y+1]==0 ) //right { maze[x][y]=2; path=push (path , x , y ); printmap (); y++; movemouse(x,y) ; } else if(maze[x+1][y]==0) //down { maze[x][y]=2; path=push (path , x , y ); printmap (); x++; movemouse(x,y) ; } else if(maze[x][y-1]==0) //left { maze[x][y]=2; path=push (path , x , y ); printmap (); y--; movemouse(x,y) ; } else { maze[x][y]=3; printmap (); pop(path,x,y); maze[x][y]=2; printmap (); movemouse(x,y); } } else { maze[33][33]=2; printmap (); } } list push(list stack,int x,int y) { list node=new link; node->x=x; node->y=y; node->next=stack; stack=node; return stack; } void pop(list &stack,int &x,int &y) { list top=stack; x=top->x; y=top->y; stack=stack->next; delete top; } x1 |
引用 | 編輯
唐老鴨
2005-12-15 07:04 |
13樓
▲ ▼ |
你少打了一行#include <time.h>
這樣我VC就可以過了.... 不過....你的程式完全不會走耶= =.... 只會重畫地圖耶 ..... 先問幾個問題喔.... 老師要求的迷宮走法有規定用啥演算法.... BFS...DFS...回朔搜尋...etc.... 又或者有規定要找出最短的走法嗎.... 看你用到堆疊.... 我才會想問這些問題的= =.... x1 |
引用 | 編輯
湛藍威尼斯
2005-12-16 06:08 |
14樓
▲ ▼ |
下面是引用唐老鴨於2005-12-15 07:04發表的 : 我已經自己 DEBUG 完摟~ 哈~ 太感謝唐老鴨大大了~ 老師沒有規定啥~ 只是要我們寫出一個可以看到一個迷宮有東西在走~ 因為是資料結構處理的課~ 剛好課本是寫在堆疊的部份~!! 所以就用用看~ 可是推疊有點多~ 我就用 LINK LIST 的方法下去模擬推疊寫~ 雖然 DEBUG 完可以跑~ 可是我是直接帶數值下去跑~ 而且是用一直印地圖的方式下去跑~ 所以才會一直印地圖~~ 應該有更好的寫法~ 唐老鴨大大可以不用幫我重寫一個啦~ 太麻煩你了~ 你還有你的事要忙呢~ ^^ ~ 哈~ 地圖很漂亮~ 我正努力看地圖寫法~ 研究中~ 作業也已經交摟~ 哈~ 只有一句話~ 非常感謝~ ^^ 下面是我弄完後成功可以跑低~ 因為我用 DEV 寫的~ 我已經可以跑~ 唐老鴨大大可能要加一些標頭檔~ 複製程式 #include <iostream> #define row 35 #define column 35 using namespace std; int maze[row][column]; struct link { int x,y; struct link *next; }; typedef struct link *list; //定義Link的指標 list path=NULL; void printmap(); //印出來 void movemouse (int,int); //走 list push (list stack , int x ,int y ); //push void pop (list &stack ,int &x ,int &y ); //pop void generatemaze(int x,int y) { int direction; maze[x][y] |= 0x1; // 標示此格已設定 while (maze[x][y+2]==0 || maze[x+2][y]==0 || maze[x][y-2]==0 || maze[x-2][y]==0) // 如果不是外牆 { direction = rand()%4+1; // 決定下一個位置 if (direction==1 && maze[x][y+2]==0) // 向右走 { maze[x][y+1] |= 0x1; // 拆掉右牆 generatemaze(x,y+2); } else if (direction==2 && maze[x-2][y]==0) // 向上走 { maze[x-1][y] |= 0x1; // 拆掉上牆 generatemaze(x-2,y); } else if (direction==3 && maze[x][y-2]==0) // 向左走 { maze[x][y-1] |= 0x1; // 拆掉右牆 generatemaze(x,y-2); } else if (direction==4 && maze[x+2][y]==0) // 向下走 { maze[x+1][y] |= 0x1; // 拆掉下牆 generatemaze(x+2,y); } } } int main() { char option; do{ int Si=2,Sj=2,Ei=row-3,Ej=column-3; int x,y; srand(time(NULL)); for (x=0;x<row;x++) { for (y=0;y<column;y++) { if (x==0 || y==0 ||x==row-1|| y==column-1) maze[x][y]=2; // 設定外牆 else maze[x][y]=0; // 初始迷宮內部 } } generatemaze(Ei,Ej); // 產生迷宮 maze[Si-1][Sj] = 0x1; // 拆掉入口上牆 maze[Ei][Ej+1] = 0x1; // 拆掉出口右牆 for(x=0; x<row; x++) { for(y=0; y<column; y++) { //cout<<maze[x][y]; if (maze[x][y] == 0) { maze[x][y]=2; cout<<"█"; } else if (maze[x][y]=1) { maze[x][y]=0; cout<<" "; } } cout<<endl; } maze[0][2]=4; maze[32][34]=4; for(x=1; x<row-1; x++) { for(y=1; y<column-1; y++) { cout<<maze[x][y]; } cout<<endl; } printmap(); cout<<"重新設定地圖請按 C ,任意字輸入就會開始"<<endl; cin>>option; }while(option=='c'||option=='C'); movemouse(1,2); cout<<"你終於找到出口啦~ ^^ ~"<<endl; system("pause"); return 0; } void printmap () { system("cls"); //Sleep(1000); for(int x=0;x<row;x++) { for(int y=0;y<column;y++) { switch(maze[x][y]) { case 0: cout<<" "; break; case 1: cout<<"@"; break; case 2: cout<<"■"; break; case 3: cout<<"禁"; break; case 4: cout<<" "; break; } } cout<<endl; } } void movemouse (int x,int y) { cout<<x<<","<<y<<endl; printmap (); if(x!=32||y!=33) { if(maze[x+1][y]==0) //down { maze[x][y]=1; path=push (path , x , y ); printmap (); x++; movemouse(x,y) ; } else if( maze[x][y+1]==0 ) //right { maze[x][y]=1; path=push (path , x , y ); printmap (); y++; movemouse(x,y) ; } else if(maze[x-1][y]==0) //up { maze[x][y]=1; path=push (path , x , y ); printmap (); x--; movemouse(x,y) ; } else if(maze[x][y-1]==0) //left { maze[x][y]=1; path=push (path , x , y ); printmap (); y--; movemouse(x,y) ; } else { maze[x][y]=3; printmap (); pop(path,x,y); maze[x][y]=1; printmap (); movemouse(x,y); } } else { maze[32][33]=1; printmap (); } } list push(list stack,int x,int y) { list node=new link; node->x=x; node->y=y; node->next=stack; stack=node; return stack; } void pop(list &stack,int &x,int &y) { list top=stack; x=top->x; y=top->y; stack=stack->next; delete top; } x0 |
引用 | 編輯
kioko
2009-09-10 16:54 |
15樓
▲ ▼ |
我稍微改版了一下
這是你原先的版本 不過 太多讀取的畫面了 所以稍微修改了一點點 自動行走迷宮型態 ... #include <iostream> #define row 35 #define column 35 using namespace std; int maze[row][column]; struct link { int x,y; struct link *next; }; typedef struct link *list; //定義Link的指標 list path=NULL; void printmap(); //印出來 void movemouse (int,int); //走 list push (list stack , int x ,int y ); //push void pop (list &stack ,int &x ,int &y ); //pop void generatemaze(int x,int y) { int direction; maze[x][y] |= 0x1; // 標示此格已設定 while (maze[x][y+2]==0 || maze[x+2][y]==0 || maze[x][y-2]==0 || maze[x-2][y]==0) // 如果不是外牆 { direction = rand()%4+1; // 決定下一個位置 if (direction==1 && maze[x][y+2]==0) // 向右走 { maze[x][y+1] |= 0x1; // 拆掉右牆 generatemaze(x,y+2); } else if (direction==2 && maze[x-2][y]==0) // 向上走 { maze[x-1][y] |= 0x1; // 拆掉上牆 generatemaze(x-2,y); } else if (direction==3 && maze[x][y-2]==0) // 向左走 { maze[x][y-1] |= 0x1; // 拆掉右牆 generatemaze(x,y-2); } else if (direction==4 && maze[x+2][y]==0) // 向下走 { maze[x+1][y] |= 0x1; // 拆掉下牆 generatemaze(x+2,y); } } } int main() { char option; do{ int Si=2,Sj=2,Ei=row-3,Ej=column-3; int x,y; srand(time(NULL)); for (x=0;x<row;x++) { for (y=0;y<column;y++) { if (x==0 || y==0 ||x==row-1|| y==column-1) maze[x][y]=2; // 設定外牆 else maze[x][y]=0; // 初始迷宮內部 } } generatemaze(Ei,Ej); // 產生迷宮 maze[Si-1][Sj] = 0x1; // 拆掉入口上牆 maze[Ei][Ej+1] = 0x1; // 拆掉出口右牆 for(x=0; x<row; x++) { for(y=0; y<column; y++) { //cout<<maze[x][y]; if (maze[x][y] == 0) { maze[x][y]=2; cout<<"█"; } else if (maze[x][y]=1) { maze[x][y]=0; cout<<" "; } } cout<<endl; } maze[0][2]=4; maze[32][34]=4; cout<<"重新設定地圖請按 C ,任意字輸入就會開始"<<endl; cin>>option; }while(option=='c'||option=='C'); movemouse(1,2); cout<<"你終於找到出口啦~ ^^ ~"<<endl; system("pause"); return 0; } void printmap () { system("cls"); //Sleep(1000); for(int x=0;x<row;x++) { for(int y=0;y<column;y++) { switch(maze[x][y]) { case 0: cout<<" "; break; case 1: cout<<"@"; break; case 2: cout<<"■"; break; case 3: cout<<" "; break; case 4: cout<<" "; break; } } cout<<endl; } } void movemouse (int x,int y) { cout<<x<<","<<y<<endl; printmap (); if(x!=32||y!=33) { if(maze[x+1][y]==0) //down { maze[x][y]=1; path=push (path , x , y ); x++; movemouse(x,y) ; } else if( maze[x][y+1]==0 ) //right { maze[x][y]=1; path=push (path , x , y ); y++; movemouse(x,y) ; } else if(maze[x-1][y]==0) //up { maze[x][y]=1; path=push (path , x , y ); x--; movemouse(x,y) ; } else if(maze[x][y-1]==0) //left { maze[x][y]=1; path=push (path , x , y ); y--; movemouse(x,y) ; } else { maze[x][y]=3; printmap (); pop(path,x,y); maze[x][y]=1; movemouse(x,y); } } else { maze[32][33]=1; printmap (); } } list push(list stack,int x,int y) { list node=new link; node->x=x; node->y=y; node->next=stack; stack=node; return stack; } void pop(list &stack,int &x,int &y) { list top=stack; x=top->x; y=top->y; stack=stack->next; delete top; } x0 |
引用 | 編輯
kioko
2009-09-10 16:57 |
16樓
▲ ▼ |
另一種版本
手動行走迷宮型態 ... #include <iostream> #define row 35 #define column 35 using namespace std; int maze[row][column]; struct link { int x,y; struct link *next; }; typedef struct link *list; // 定義Link的指標 list path=NULL; void printmap(); // 印出來 void movemouse (int,int); // 走 list push (list stack, int x, int y ); // push void pop (list &stack,int &x,int &y ); // pop void generatemaze(int x,int y){ int direction; maze[x][y] |= 0x1; // 標示此格已設定 while (maze[x][y+2]==0 || maze[x+2][y]==0 || maze[x][y-2]==0 || maze[x-2][y]==0){ // 如果不是外牆 direction = rand()%4+1; // 決定下一個位置 if (direction==1 && maze[x][y+2]==0){ // 向右走 maze[x][y+1] |= 0x1; // 拆掉右牆 generatemaze(x,y+2); } else if (direction==2 && maze[x-2][y]==0){ // 向上走 maze[x-1][y] |= 0x1; // 拆掉上牆 generatemaze(x-2,y); } else if (direction==3 && maze[x][y-2]==0){ // 向左走 maze[x][y-1] |= 0x1; // 拆掉右牆 generatemaze(x,y-2); } else if (direction==4 && maze[x+2][y]==0){ // 向下走 maze[x+1][y] |= 0x1; // 拆掉下牆 generatemaze(x+2,y); } } } main(){ char option; do{ int Si=2,Sj=2,Ei=row-3,Ej=column-3; int x,y; srand(time(NULL)); for (x=0;x<row;x++){ for (y=0;y<column;y++){ if (x==0 || y==0 ||x==row-1|| y==column-1) maze[x][y]=2; // 設定外牆 else maze[x][y]=0; // 初始迷宮內部 } } generatemaze(Ei,Ej); // 產生迷宮 maze[Si-1][Sj] = 0x1; // 拆掉入口上牆 maze[Ei][Ej+1] = 0x1; // 拆掉出口右牆 system("cls"); for(x=0; x<row; x++){ for(y=0; y<column; y++){ if (maze[x][y] == 0){ maze[x][y]=2; cout<<"█"; } else if (maze[x][y]=1){ maze[x][y]=0; cout<<" "; } } cout<<endl; } maze[0][2]=4; maze[32][34]=4; cout<<"重新設定地圖請按 C ,任意字輸入就會開始"<<endl; cout<<"遊戲中時 按鍵Q重新開始 按鍵A往左 按鍵D往右 按鍵W往上 按鍵S往下 按鍵X返回"<<endl; cin>> option; }while(option=='c'||option=='C'); movemouse(1,2); return 0; } void printmap (){ system("cls"); for(int x=0;x<row;x++){ for(int y=0;y<column;y++){ switch(maze[x][y]){ case 0: cout<<" "; break; case 1: cout<<"@"; break; case 2: cout<<"■"; // break; case 3: cout<<" "; maze[x][y]=0; break; case 4: cout<<"*"; break; } } cout<<endl; } } void movemouse (int x,int y){ cout<<x<<","<<y<<endl; printmap (); while(x!=32||y!=33){ switch(getch()){ case'a':case'A': if(maze[x][y-1]==0){ // left maze[x][y]=1; path=push(path ,x ,y ); y--; movemouse(x,y) ; } break; case'w':case'W': if(maze[x-1][y]==0){ // up maze[x][y]=1; path=push(path ,x ,y ); x--; movemouse(x,y) ; } break; case'd':case'D': if( maze[x][y+1]==0 ){ // right maze[x][y]=1; path=push(path ,x ,y ); y++; movemouse(x,y) ; } break; case's':case'S': if(maze[x+1][y]==0){ // down maze[x][y]=1; path=push(path ,x ,y ); x++; movemouse(x,y) ; } break; case'x':case'X': maze[x][y]=3; pop(path,x,y); movemouse(x,y); break; case'q':case'Q': main(); break; default: movemouse(x,y); break; } } cout<<"你終於找到出口啦~ ^^ ~"<<endl; system("pause"); } list push(list stack,int x,int y){ list node=new link; node->x=x; node->y=y; node->next=stack; stack=node; return stack; } void pop(list &stack,int &x,int &y){ list top=stack; x=top->x; y=top->y; stack=stack->next; delete top; } x0 |
引用 | 編輯
Inndy
2010-02-04 21:47 |
17樓
▲ |
下面是引用 rakish 於 2005-11-30 15:00 發表的 : 有BUG!! 搞了半天可讀性好低... 花了好久的時間整理... 話說...DeBUG是好了... 可是這支程式是在做啥?? 怎都看不懂? 複製程式 #include <iostream.h> int maze[7][10]={ 1,1,1,1,1,1,1,1,1,1, 1,0,1,0,1,0,0,0,0,1, 1,0,1,0,1,0,1,1,0,1, 1,0,1,0,1,1,1,0,0,1, 1,0,1,0,0,0,0,0,1,1, 1,0,0,0,1,1,1,0,0,1, 1,1,1,1,1,1,1,1,1,1}; int find(int x,int y){//入口 A if(x==1&&y==1){ //出口 B maze[x][y]=2; return 1; }else{ // B if(maze[x][y]==0){ // C maze[x][y]=2; //表示走過 if((find(x-1,y) +find(x+1,y) +find(x,y+1) +find(x,y-1))>0){ return 1; }else{ maze[x][y]=0; return 0; } }else{ return 0; } } //B } //A int main(){ int i,j; find(2,5); //入口 system("pause"); } x0 |