我正在尝试为井字游戏构建一个人工智能,这是我第一次做任何类型的人工智能,而我无法弄清楚如何让AI尝试各种不同的行动特定情况(董事会)。 " E"是空单元格,我将它们的索引存储在一个名为available的数组中。 人工智能的举动将是插入" O"在nextBoard变量中,每次可用数组提供一次索引。 这个函数正在修改nextBoard变量,我想用它来评估下一次AI动作,给它一个分数,还有我用来评估游戏状态的实际变量。
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和board)正在修改,并且没有一个具有预期的输出。
//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"]
答案 0 :(得分:1)
您可能遇到该对象在javascript中是浅层副本的问题,所以
var nextBoard=board
不会制作电路板的副本,但只会复制参考数组。
在您的情况下,如果您需要副本,那么您可以使用slice
,例如;
var nextBoard=board.slice()
(然后在循环内部相同),但如果你的数组元素本身就是对象,那就必须更加精细。