迷宫生成 - 从 C++ 转换

Maze Generation - Converting From C++

好了,很多人可能不知道什么是Pawn。我正在将此处 http://en.wikipedia.org/wiki/User:Dllu/Maze 的源代码转换为在我的 SA:MP 服务器中工作。 Pawn 是一种非常容易理解的代码,所以不要 运行 因为你不懂这种语言。

出于某种原因,只有外部填充和第一个单元格(它们应该是)被设置在迷宫中。所以,所有的墙都在那里,这很好。问题是迷宫里只有一个格子,也就是起点

请帮忙!


我把它粘贴到 Pastebin 上是因为 pastebin 实际上有一个 pawn 语法。 http://pastebin.com/wN6KFyFz


此外,它应该同时支持 backtrack 和 prim。两者都有相同的结果。根据我的测试,我知道它永远不会到达看起来像这样的调试打印(“%i, %i | %x, %x, %x”)。好吧,它确实达到了 while(!successful) 循环中的那个,1 次或 2-3 每隔一段时间。

它不起作用,因为您已将 C++ 代码中的某些 do...while 循环更改为 Pawn 中的 while 循环, 这在逻辑上不等价。 do...while 循环总是至少执行一次,而 while 循环执行零次或多次。

例如,此代码假定它至少会 运行 一次:

do{
    //randomly find a cell that's in the maze
    xcur=rand()%(xsize-2)+1;
    ycur=rand()%(ysize-2)+1;
}while(!MAZE[xcur][ycur].in ||
    MAZE[xcur][ycur-1].in&&MAZE[xcur][ycur+1].in&&
    MAZE[xcur-1][ycur].in&&MAZE[xcur+1][ycur].in);

如果您将其更改为 while 循环,则循环条件将测试为假(因为您从迷宫中的一个单元格开始,并且没有被迷宫中的单元格包围),因此不会进入循环, xcur 和 ycur 永远不会改变,你将永远停留在起始位置!

如果您使用的 Pawn 版本不支持 do...while 循环,那么您可以像这样伪造它们:

new bool:doOnce;
doOnce=true;
while(doOnce||(condition))
{
    doOnce=false;
    // do stuff...
}

相同
do
{
    // do stuff...
} while(condition)

假设评估条件没有任何副作用,例如递增或分配变量,或者当 doOnce 为真时 Pawn 能够短路评估。

否则你可以这样做:

while(true)
{
    // do stuff....

    if(!condition)
        break;
}