2015-01-16 46 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

哦,哈哈,我認爲你的權利。這更有意義。那麼我如何正確創建路徑? –