2015-01-16 47 views
1

好吧,你们许多人可能不知道典当是什么。我将来源http://en.wikipedia.org/wiki/User:Dllu/Maze转换为我的SA:MP服务器。典当是一个很容易理解的代码,所以不要跑,因为你不知道语言。迷宫一代 - 从C++转换

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

请帮忙!


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


而且,它应该同时支持走回头路,古板。两者都有相同的结果。从我测试的东西我知道,它永远不会到达像这样的调试打印(“%i,%i |%x,%x,%x”)。那么,它确实会在while(!成功)循环中达到一次,每次一次或一次2-3次。

+0

现在事情虽然循环的每一个细胞,直到每一个细胞都“在”迷宫。一个日志在这里发布http://pastebin.com/X7GSRDnd从这个代码报告的世代:http://pastebin.com/MGQ3YKua –

回答

1

它不工作,因为你已经改变了一些做......而循环在C++代码在典当循环,这在逻辑上不是等价的。 做...而循环始终执行至少一次,而循环执行零次或更多次。

例如该代码假定它将至少运行一次:

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永远不会改变,你将永远卡在开始位置!

如果无论你使用的是不支持做......而循环再典当的版本,你可以伪造他们是这样的:

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; 
} 
+0

好吧,这似乎修复了一些更多的修改。但是现在,事物循环通过每一个细胞,直到每个细胞都进入迷宫。日志已在此处发布http://pastebin.com/X7GSRDnd从此代码报告:http://pastebin.com/MGQ3YKua –

+0

是不是它应该这样做?迷宫由每个细胞的上/下/左/右壁限定,而不是哪个细胞在/不在迷宫中。 – samgak

+0

哦,哈哈,我认为你的权利。这更有意义。那么我如何正确创建路径? –