javascript - 每次我移动汉诺塔 js 时都会同时更新两座塔

标签 javascript constructor towers-of-hanoi

我正在尝试编写一个非常简单的汉诺塔谜题实现,以练习我刚刚学到的有关 js 构造函数和原型(prototype)的知识。我目前对到目前为止所写的内容有疑问,因为每次我将“光盘”从 tower[0] 移动到 tower[1] 时,我的 < strong>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;
}

关于javascript - 每次我移动汉诺塔 js 时都会同时更新两座塔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49373664/

相关文章:

javascript - 获取已选中和未选中的复选框值

Javascript 条件运算符没有按我想象的方式运行

c++ - Qt 4.6 和 4.7 之间 QString 类的变化

c++ - 如何改进采用编译时已知条件的构造函数?

java - 汉诺塔;递归方法意味着方法永远不会完成?

javascript - WKWebview stringByEvaluatingJavaScriptFromString 等效?

javascript - 简化切换和 setState 更新项目的属性

c++ - 仅在 C++ 中声明默认构造函数

c++ - 河内线性塔

c++ - 汉诺塔算法无需在终端窗口打印任何内容