2015-11-27 111 views
-3

我已經被分配給一個'迷宮'程序,它將允許用戶通過從頭到尾的導航來玩和解決隨機迷宮。到目前爲止,我已經開發出了一個可以在預定義的迷宮中運行的工作原型,但是該機構要求我儘可能地使它變得隨機。爲此,我添加了一個函數'findpath'來檢查和驗證隨機迷宮是否可以解決,或者叫做'mazebuilder'來創建另一個隨機迷宮。整個代碼在這裏:http://codepad.org/wb1OGGrZ。 現在執行時,此功能會顯示非法的控制流。奇怪的控制順序

int findpath(int x, int y) 
{ 
    if(fpmap[x][y]==END) //1 
    { 
     return TRUE; 
    } 
    if(fpmap[x][y]!=PATH||fpmap[x][y]!=START)  //2 
    { 
     return FALSE;  //2a 
    } 
    min_moves++;     //3 
    fpmoves++; 
    fpmap[x][y]=SOLUTION; 
    if(findpath(x,y-1))  //4 
    { 
     return TRUE; 
    } 
    if(findpath(x+1,y)) 
    { 
     return TRUE; 
    } 
    if(findpath(x,y+1)) 
    { 
     return TRUE; 
    } 
    if(findpath(x-1,y)) 
    { 
     return TRUE; 
    } 
    min_moves--;  //5 
    fpmap[x][y]=PATH; 
    return FALSE;  //6 
} 

我試圖跟蹤程序,這是該函數在它叫什麼: 1.檢查是否#1。 2.檢查#2。 3.跳到#6。 那麼,如果在#4或#5之後,爲什麼程序沒有進入#2a或#3? 它似乎跳過整個代碼並衝向#6。這是否存在邏輯錯誤還是這種語法? 請幫我解決這個問題。 PS:此代碼是爲TurboC編譯器編寫的,因爲我的系統要求我這樣做。請多多包涵:(

在findpath所使用的算法更多信息:http://www.cs.bu.edu/teaching/alg/maze

+3

尋求調試幫助的問題(「爲什麼不是這個代碼工作?」)必須包括所需的行爲,**特定的**問題或錯誤以及在問題本身中重現它**所需的最短代碼** 。沒有明確問題陳述的問題對其他讀者無益。請參閱:如何創建[mcve]示例。 – Olaf

+0

「...該機構需要我......」,抱歉,但我笑得這麼多,聽起來像是一個陰謀,這個祕密機構試圖把我們都陷入一個巨大的迷宮中,不必要的if語句 – user463035818

+0

這段代碼if (fpmap [x] [y]!= PATH || fpmap [x] [y]!= START)''應該用'&&'代替'||'。 –

回答

0

編譯器是奇獸有時我能提供最好的解釋(因爲我知道沒有直接編碼erors,可能會導致您的問題)編譯器已經確定你引入了未定義的行爲,並且簡單地拒絕編譯有問題的代碼(你可以通過檢查在調試器中生成的彙編代碼來檢查這個)

有問題的代碼是你不檢查遞歸調用findpath之前的xy的邊界。 d至x和/或y變得小於零或大於scr+1

N.B .:在mazeloader中,你有不必要的遞歸,最終會導致堆棧溢出:if(findpath(start.x,start.y))...else goto top;而不是else mazeloader();,或者甚至更好,單獨的mazeloader形成用戶播放。

+0

我沒有檢查邊界,因爲我初始化迷宮的方式是它被「WALLS」包圍。所以如果'x'和'y'試圖超出界限,他們將遇到牆壁並返回'FALSE'。按照您的建議,我用'else goto top'替換了'else mazeloader'。謝謝您的幫助。 – MePsyDuck

0

說明指出您應該用x(BAD_PATH)標記回溯位置以避免再次嘗試該子路徑。您的代碼使用.(PATH)標記。

此外,您沒有超出界限檢查。

+0

謝謝你指出。我錯過了那一個。而且,如果超出界限檢查範圍,迷宮被圍牆('不通道')包圍,所以不需要檢查超出界限,這樣我也限制了我的玩家不要移出迷宮。 – MePsyDuck