1

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

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

请帮忙!


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


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

4

1 回答 1

1

它不起作用,因为您已将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 循环,则循环条件将测试为 false(因为您从迷宫中的单元格开始,并且没有被单元格包围),因此不会进入循环,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;
}
于 2015-01-16T04:20:43.030 回答