2014-03-30 217 views
4

我不知道如何確保隨機迷宮可以從右側的入口到左側的出口沒有任何阻塞路徑。這是我迄今爲止的代碼。大家可以給我一個提示或算法來實現簡單的迷宮(進入/退出)嗎?謝謝! P/S我的問題是迷宮發生器不保證路徑退出......(被卡住)C中的隨機迷宮發生器

#include <stdio.h> 
#include <time.h> 
#include <stdlib.h> 

#define SIZE 12 
void mazeGenerator(char [][SIZE]); 

int main(void) 
{ 
    char maze[SIZE][SIZE]; 
    srand((unsigned int)time(NULL)); 
    mazeGenerator(maze); 
    return 0; 
} 
void mazeGenerator(char a[SIZE][SIZE]) 
{ 
    size_t row,column = 0, r; 

    // initialize '#' to all positions of left-hand wall 
    for (row = 0; row < SIZE; ++row) 
    { 
     a[row][column] = '#'; 
    } 
    // initialize '#' to all positions of left-hand wall 
    for (row = 0; row < SIZE; ++row) 
    { 
     a[row][SIZE - 1] = '#'; 
    } 

    // initialize '.' to left-hand wall random positions from 1 -> 10 
    row = rand() % 11 + 1; 
    a[row][0] = '.'; 

    // initialize '.' to right-hand wall random positions from 1 -> 10 
    row = rand() % 11 + 1; 
    a[row][SIZE - 1] = '.'; 

    // intialize '#' to all positions of top maze 
    for (column = 1; column < SIZE - 1; ++column) 
    { 
     a[0][column] = '#'; 
    } 

    // intialize '#' to all positions of bottom maze 
    for (column = 1; column < SIZE - 1; ++column) 
    { 
     a[SIZE - 1][column] = '#'; 
    } 

    // print maze 
    puts(""); 
    puts("** Maze Generator by Huy Le **\n"); 
    for (row = 0; row < SIZE; ++row) 
    { 
     for (column = 0; column < SIZE; ++column) 
     { 
      printf_s("%2c",a[row][column]); 
     } 
     puts(""); 
    } 
    puts(""); 
} 
+0

只是一個想法,你爲什麼不先產生入口和出口之間的路徑,然後你建立的牆壁,限制你所建的小路上沒有牆嗎? – Inox

+0

我的確有同樣的想法,但可以創建一條直線,看起來不自然。 –

回答

2

你的問題是,你所選擇的算法並不能保證有一條小路從入口點到出口點。本質上,你隨機填充你的迷宮,這不會產生一個保證的路徑(實際上它可能會導致多條路徑)。

你想使用迷宮生成算法。這些是衆所周知的一類算法,它們將用解決方案生成迷宮(在某些情況下,只有一種解決方案)。在這裏有一篇文章和一些這樣的算法的參考:http://en.wikipedia.org/wiki/Maze_generation_algorithm

+0

實際上,一個通用的算法可以確保任何兩個選定點之間總有*一條路徑。查看http://www.astrolog.org/labyrnth/maze.htm上「鏈接 - 迷宮創作」中的長列表,瞭解不同的方法。 – usr2564301