請老大們幫忙~ 迷宮題

Home Home
引用 | 編輯 湛藍威尼斯
2005-11-11 08:43
樓主
推文 x0
隨機會有不同的地圖~
走迷 ..

訪客只能看到部份內容,免費 加入會員



獻花 x0
引用 | 編輯 aa
2005-11-11 11:13
1樓
  
你是要用程式產生不同的迷宮還是用程式去走迷宮..? 表情

獻花 x0
引用 | 編輯 湛藍威尼斯
2005-11-11 21:14
2樓
  
產生迷宮後~ 走迷宮~~
需有圖~!
例如
100000
010000
001110
000011

要看到有在走~
表情

獻花 x0
引用 | 編輯 唐老鴨
2005-11-12 09:50
3樓
  
下面是引用湛藍威尼斯於2005-11-11 21:14發表的 :
產生迷宮後~ 走迷宮~~
需有圖~!
例如
100000
010000
.......

題目再給明確一點....
例如老師有規定陣列要多大還是有些什麼限定的...
晚點寫一個產生迷宮的參考程式給你 ....
走的部份這裡有可以參考的程式 表情...

獻花 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-09 22:44
8樓
  
還要打怪物
好難唷~!! 表情

獻花 x0
引用 | 編輯 湛藍威尼斯
2005-12-13 02:34
9樓
  
下面是引用唐老鴨於2005-11-16 11:09發表的 :
剛花了點時間幫你把自動產生迷宮的程式寫出來了 表情 .....
33*33的迷宮應該夠你用了吧....
至於走的方法請你自己參考程式區有你要的寫法....
下面我幫你加了些註解...
但也許對你會有些複雜....
.......

唐老鴨大大~ 可以跟我講 0x1 <== 這是? 是隨便給的初始值嗎~?
|= <== 這符號在您的程式碼中的意義
我查到這 |= 符號的意義是 執行運算子之後設定
direction = rand()%4+1; // 決定下一個位置
rand()%4+1; <= 這大概低意思~
如果唐老鴨大大很忙低話~
有哪位大大可以告訴我呢~
拜託拜託~

獻花 x0
引用 | 編輯 唐老鴨
2005-12-14 04:14
10樓
  
下面是引用湛藍威尼斯於2005-12-13 02:34發表的 :


唐老鴨大大~ 可以跟我講 0x1 <== 這是? 是隨便給的初始值嗎~?
|= <== 這符號在您的程式碼中的意義
我查到這 |= 符號的意義是 執行運算子之後設定
.......

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發表的 :
補充....
上面我寫的程式其實有點小BUG 表情 ....
用這裡的自動走迷宮的程式也許會有問題....
雖然看程式的執行結果是看不出來....

.......

唐老大~ >"< 對不起~
我資質駑鈍~
我有改一些加走路的程式碼~
可是跑不出來~ 可以幫我 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發表的 :
你少打了一行#include <time.h>
這樣我VC就可以過了....
不過....你的程式完全不會走耶= =....
只會重畫地圖耶 表情 .....

.......

我已經自己 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 發表的 : 到引言文
書上的..剛好看到...
複製程式
int maze[7][10]={
 1,1,1,1,1,1,1,1,1,1,
 1,0,1,0,1,0,0,0,0,1,
.......

有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