我正在創建一個連接四個遊戲,我正在使用遞歸來檢查所做的移動是否是一個勝利的舉動。 x和y是在7x6網格上移動的座標。遞歸函數返回早期只檢查一個路徑
我還沒有實施檢查點的方向是否正確匹配(所以現在如果4件以任何方式接觸,它應該仍然檢測到勝利)。但在我這樣做之前,我遇到了一個問題。即使做出的舉動應該會贏得勝利,如果有另外一條路線沒有連續四條,該函數將返回false。
的功能不正確檢測不到勝利示例(綠線是什麼應該被檢測到,紅線是我認爲的功能把返回虛假提前路徑):https://prnt.sc/fjhia1
這是我的代碼:
function isVisited(x,y,visited){
var pointStr = x + "," + y;
var result = visited.some(function(e){
return e.join() == pointStr;
});
return result;
}
function checkWin(x, y, color, visited, count) {
if(count==3) return true;
for(i=-1; i<2; i++) {
for (j=-1; j<2; j++) {
if(!(i==0 && j==0) && (x+i)<7 && (y+j)<6 && (x+i)>-1 && (y+j)>-1 && grid[x+i][y+j] != null) {
if (grid[x+i][y+j] == color && !isVisited(x+i,y+j,visited)) {
visited.push([x, y]);
if(checkWin(x+i, y+j, color, visited, count+1)) return true;
}
}
}
}
return false;
}
爲了澄清,我和j是用來檢查起點周圍所有點的偏移量。
顏色參數是「黑色」或「紅色」。網格是一個7x6的二維數組,用於存儲哪些球員在哪裏,並在球員進行移動時更新。整個checkWin()函數在每次移動後都會調用,其中x和y參數是剛剛播放的移動的座標。鏈接的圖片中顯示了陣列中的顏色示例。
從圖像電網樣品,這應該通過成爲checkWin()返回true爲x = 5,y = 3,顏色= 「黑」,但事實並非如此:
[[null,null,null,null,null,null],[null,null,null,null,null,null],[null,null,null,null,null,null],[null,null,null,null,null,"black"],[null,null,null,null,"black","red"],[null,null,null,"black","black","black"],[null,null,null,"red","red","red"]]
是什麼'isVisited'嗎?你不想使用本地'visited'嗎? (這不是傳遞給'isVisited'。) – smarx
糟糕!我忘了將它傳入數組到isVisited函數中。感謝捕捉,但它仍然沒有解決遞歸的主要問題。 – Penian4
然後,請用您的最新代碼更新您的問題,並共享一個展示此問題的示例輸入(「grid」和「color」值)。 – smarx