迷宫生成 - 从 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;
}
好了,很多人可能不知道什么是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;
}