我正在嘗試構建一個針對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"]
那麼,應該告訴你,你實際上是在修改相同的數組,並且你需要找到一種不同的方法來創建副本,因爲顯然一個單純的任務並不能做到這一點。 –
當你做'nextBoard = board'時,JavaScript通過引用存儲對象,而不是值,那麼nextBard不是板的副本,它**是**板。 –