2016-06-17 79 views
-1

我正在嘗試構建一個針對tic tac腳趾的AI,這是我第一次做任何類型的AI,並且我無法弄清楚如何讓AI嘗試每個針對特定情況(董事會)可能採取不同的舉措。 「E」是空單元格,我將它們的索引存儲在一個名爲available的數組中。 AI移動將在每個時間使用可用數組提供的索引在nextBoard變量中插入「O」。 這個函數正在修改nextBoard變量,我想用它來評估下一個AI移動,通過給它一個分數,但也是真實的棋盤變量,我正在使用它來評估遊戲的狀態。for循環修改錯誤的數組

function AiPossibleActions() { 
    available=[0,1,2,3,5,6,7,8]; 
    board=["E","E","E","E","X","E","E","E","E"]; 
    var nextBoard=board 
    for (var i=0; i<available.length; i++) { 
    nextBoard = board; 
    nextBoard[available[i]]="O"; 
    } 
    oMovesCount++ 
} 

當運行兩個變量(nextBoard和板)被修改函數,其中沒有與預期的輸出。

//wrong output 
["O", "O", "O", "O", "X", "O", "O", "O", "O"] 

理想的輸出將是對每次迭代變量nextBoard等於:

//1st iteration 
["O", "E", "E", "E", "X", "E", "E", "E", "E"] 
//2nd iteration 
["E", "O", "E", "E", "X", "E", "E", "E", "E"] 
//3rd iteration 
["E", "E", "O", "E", "X", "E", "E", "E", "E"] 
//4th iteration 
["E", "E", "E", "O", "X", "E", "E", "E", "E"] 
//5th iteration 
["E", "E", "E", "E", "X", "O", "E", "E", "E"] 
//6th iteration 
["E", "E", "E", "E", "X", "E", "O", "E", "E"] 
//7th iteration 
["E", "E", "E", "E", "X", "E", "E", "O", "E"] 
//8th iteration 
["E", "E", "E", "E", "X", "E", "E", "E", "O"] 
+2

那麼,應該告訴你,你實際上是在修改相同的數組,並且你需要找到一種不同的方法來創建副本,因爲顯然一個單純的任務並不能做到這一點。 –

+0

當你做'nextBoard = board'時,JavaScript通過引用存儲對象,而不是值,那麼nextBard不是板的副本,它**是**板。 –

回答

1

您可能有該對象的問題是在JavaScript淺副本,所以

var nextBoard=board 

不製作電路板的副本,但僅製作參考陣列的副本。

在你的情況下,如果你需要一個副本,那麼你可能可以使用slice,比如;

var nextBoard=board.slice() 

(然後在循環內部也是如此),但是如果你的數組元素本身就是對象,它將會更加精細。

+0

或者數組是2d數組。 –

+0

這工作。謝謝索倫。 – vanpeta