Javascript for循环修改错误的数组
我正在尝试为tic tac toe构建一个AI,这是我第一次做任何类型的AI,我很难弄清楚如何让AI在给定的情况下尝试每一个不同的动作(板)。 “E”是空单元格,我将它们的索引存储在一个名为available的数组中。 AI移动将在nextBoard变量中插入“O”,每次插入一次可用数组提供的索引。 这个函数既修改了nextBoard变量,我想通过给它一个分数来评估下一个AI动作,也修改了真实的board变量,我用它来评估游戏的状态Javascript for循环修改错误的数组,javascript,loops,Javascript,Loops,我正在尝试为tic tac toe构建一个AI,这是我第一次做任何类型的AI,我很难弄清楚如何让AI在给定的情况下尝试每一个不同的动作(板)。 “E”是空单元格,我将它们的索引存储在一个名为available的数组中。 AI移动将在nextBoard变量中插入“O”,每次插入一次可用数组提供的索引。 这个函数既修改了nextBoard变量,我想通过给它一个分数来评估下一个AI动作,也修改了真实的board变量,我用它来评估游戏的状态 function AiPossibleActions () {
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等于:
//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"]
您可能会遇到这样的问题:对象在javascript中是浅拷贝,所以
var nextBoard=board
不复制电路板,但只复制阵列的引用
在您的情况下,如果您需要一份副本,那么您可以使用slice
,如
var nextBoard=board.slice()
(在循环中也是如此),但如果数组元素本身就是对象,则必须更加详细。这应该告诉您,您实际上正在修改同一数组,并且需要找到一种不同的方法来制作副本,因为显然单靠赋值是不行的。JavaScript通过引用存储对象,不是值,当您执行
nextBoard=board
时,nextBoard不是board的副本,而是board。或者数组是2d数组。这是有效的。谢谢你,索伦。
var nextBoard=board.slice()