对于一个tic tac toe游戏,我正在编写一个应该找到最佳下一步的功能。到目前为止,我传递了游戏的当前状态,然后将通过所有可能的移动进行递归。
var fieldModel = [
["x", "", ""],
["", "", ""],
["", "", "x"]
];
function aiMove() {
for (var i = 0; i < fieldModel.length; i++) {
for (var j = 0; j < fieldModel[i].length; j++) {
if (fieldModel[i][j] === "") {
function findBestMove(i, j) {
var simModel = fieldModel.slice();
simModel[i][j] = "o";
console.log("simulation", simModel);
}
findBestMove(i, j);
}
}
}
}
aiMove();
问题在于,如输出所示,每个日志都会显示所有迭代运行后的数组状态。很明显simModel
并不像我想要的那样本地化。
我怎样才能做到这一点?
答案 0 :(得分:3)
在多维数组上执行.slice
时,只克隆根数组,但内部数组仍指向其原始引用。
例如:
[ // < This is cloned
[1, 2, 3, 4], // <=These are not
[1, 2, 3, 4] // </
]
此外,作为Jan pointed out,因为浏览器控制台将在控制台日志中突变时显示更新后的数组。如果你想避免这样做,你可以简单地console.log(JSON.stringify(simModel))
,这样你就可以输出一个字符串。
如果您真的想拥有多维数组的新克隆,则需要map
和slice
每个元素:
var fieldModel = [
["x", "", ""],
["", "", ""],
["", "", "x"]
];
function aiMove() {
for (var i = 0; i < fieldModel.length; i++) {
for (var j = 0; j < fieldModel[i].length; j++) {
if (fieldModel[i][j] === "") {
function findBestMove(i, j) {
var simModel = fieldModel.slice().map(function (c) {
return c.slice();
})
simModel[i][j] = "o";
console.log("simulation", simModel);
}
findBestMove(i, j);
}
}
}
}
aiMove();
&#13;