每次我移动 Towers of Hanoi js 时同时更新两个塔
getting two towers updated at the same time every time I make a move Towers of Hanoi js
我正在尝试编写一个非常简单的河内塔拼图实现来练习我刚刚学到的关于 js 构造函数和原型的知识。到目前为止,我目前所写的内容存在问题,因为每次我将 'disc' 从 tower[0] 移动到 tower[1] ,我的 tower[2] 也更新了同一张光盘。此外,当我尝试进行无效移动时,我仍然会得到我试图移动的圆盘,从它的塔上拿走。我检查了我的逻辑,我看不出有什么问题(在这一点上我也可能有偏见)。我想知道这是否是我的构造函数或我的任何方法的问题?
这是我的代码:
function TowersOfHanoi(numberOfTowers){
let towersQuant = numberOfTowers || 3 , towers;
towers = Array(towersQuant).fill([]);
towers[0] = Array(towersQuant).fill(towersQuant).map((discNumber, idx) => discNumber - idx);
this.towers = towers;
}
TowersOfHanoi.prototype.displayTowers = function(){
return this.towers;
}
TowersOfHanoi.prototype.moveDisc = function(fromTower,toTower){
let disc = this.towers[fromTower].pop();
if(this.isValidMove(disc,toTower)){
this.towers[toTower].push(disc);
return 'disc moved!'
} else {
return 'disc couldn\'t be moved.'
}
}
TowersOfHanoi.prototype.isValidMove = function(disc,toTower){
if(this.towers[toTower][toTower.length-1] > disc || this.towers[toTower].length === 0){
return true;
}else {
return false;
}
}
这就是我正在测试的内容:
let game2 = new TowersOfHanoi();
console.log(game2.displayTowers());
console.log(game2.moveDisc(0,1));
console.log(game2.displayTowers());
console.log(game2.moveDisc(0, 2));
console.log(game2.displayTowers());
我的输出:
[ [ 3, 2, 1 ], [], [] ]
disc moved!
[ [ 3, 2 ], [ 1 ], [ 1 ] ]
disc couldn't be moved.
[ [ 3 ], [ 1 ],[ 1 ] ]
感谢任何指导。我不一定要寻找代码。只是为了理解。谢谢
引用数组 fill()
documentation 告诉你问题所在:
When the fill method gets passed an object, it will copy the reference and fill the array with references to that object.
towers = Array(towersQuant).fill([]);
数组是对象。因此,您所做的是将第一个数组的引用复制到其他每个数组。当您迭代这些引用以修改它们时,整个事情就变得复杂了。
更新
这样的事情会起作用:
function TowersOfHanoi(numberOfTowers){
let towersQuant = numberOfTowers || 3 , towers = [];
for(let i=1; i < towersQuant; i++){
towers.push([]);
towers[0].push(i);
}
towers[0].reverse();
this.towers = towers;
}
我正在尝试编写一个非常简单的河内塔拼图实现来练习我刚刚学到的关于 js 构造函数和原型的知识。到目前为止,我目前所写的内容存在问题,因为每次我将 'disc' 从 tower[0] 移动到 tower[1] ,我的 tower[2] 也更新了同一张光盘。此外,当我尝试进行无效移动时,我仍然会得到我试图移动的圆盘,从它的塔上拿走。我检查了我的逻辑,我看不出有什么问题(在这一点上我也可能有偏见)。我想知道这是否是我的构造函数或我的任何方法的问题?
这是我的代码:
function TowersOfHanoi(numberOfTowers){
let towersQuant = numberOfTowers || 3 , towers;
towers = Array(towersQuant).fill([]);
towers[0] = Array(towersQuant).fill(towersQuant).map((discNumber, idx) => discNumber - idx);
this.towers = towers;
}
TowersOfHanoi.prototype.displayTowers = function(){
return this.towers;
}
TowersOfHanoi.prototype.moveDisc = function(fromTower,toTower){
let disc = this.towers[fromTower].pop();
if(this.isValidMove(disc,toTower)){
this.towers[toTower].push(disc);
return 'disc moved!'
} else {
return 'disc couldn\'t be moved.'
}
}
TowersOfHanoi.prototype.isValidMove = function(disc,toTower){
if(this.towers[toTower][toTower.length-1] > disc || this.towers[toTower].length === 0){
return true;
}else {
return false;
}
}
这就是我正在测试的内容:
let game2 = new TowersOfHanoi();
console.log(game2.displayTowers());
console.log(game2.moveDisc(0,1));
console.log(game2.displayTowers());
console.log(game2.moveDisc(0, 2));
console.log(game2.displayTowers());
我的输出:
[ [ 3, 2, 1 ], [], [] ]
disc moved!
[ [ 3, 2 ], [ 1 ], [ 1 ] ]
disc couldn't be moved.
[ [ 3 ], [ 1 ],[ 1 ] ]
感谢任何指导。我不一定要寻找代码。只是为了理解。谢谢
引用数组 fill()
documentation 告诉你问题所在:
When the fill method gets passed an object, it will copy the reference and fill the array with references to that object.
towers = Array(towersQuant).fill([]);
数组是对象。因此,您所做的是将第一个数组的引用复制到其他每个数组。当您迭代这些引用以修改它们时,整个事情就变得复杂了。
更新 这样的事情会起作用:
function TowersOfHanoi(numberOfTowers){
let towersQuant = numberOfTowers || 3 , towers = [];
for(let i=1; i < towersQuant; i++){
towers.push([]);
towers[0].push(i);
}
towers[0].reverse();
this.towers = towers;
}