使用JavaScript写的汉诺塔小游戏
2020-12-22 02:28
阅读:816
YPE html>
标签:data oca 汉诺塔 tostring datastore eof pos get 结构
汉诺塔有些,是将A柱子上的盘子,借助B柱子,移动到C柱子,移动过程中要求,小盘子,必须放在大盘子上面。
移动过程是采用递归调用的方式。
程序运行界面:如下图:
代码如下:
汉诺塔 汉诺塔
代码说明:
1. Canvas画布,画塔,盘子和移动说明文字
2. 用Stack类,存放柱子信息,类是用堆栈来实现的, 类的名称属性,表示是哪一根柱子,左,中,还是右?
function Stack(name) {
this.dataStore = [];
this.top = 0;
this.name = name;
3. 用Block类,存放盘子信息,size表示盘子的大小,Location标明盘子在那个柱子上。
function Block(size, location){
this.size = size;
this.location = location;
this.setLocation = setLocation;
this.getSize = getSize;
}
4. 初始化时候,生成了3个盘子,3个柱子,并把3个盘子push到最左边的柱子上。
5. 调用画图函数,画出背景信息,三个柱子信息。
6. 调用递归函数,实现盘子移动
function hanoi(n, a, b, c){ if (n == 1){ moveBlock(a, c); } else{ hanoi(n - 1, a, c, b); moveBlock(a, c); hanoi(n - 1, b, a, c); } }
程序本身没有什么好说的,这里需要说明的是如何将移动的步骤保存下来。
尝试了三种方法:
1、在递归调用过程中,复制对象到一个数组中
2、在递归调用中,将程序停下来
3. 保存移动过程信息,到一个数组中
由于JavaScript对于对象的复制,对于Obj,只复制一个链接。这样导致的结果,复制下来的对象,在数组中都是一样的。
后来采用深度复制的方式,将obj中的obj,全部new来,但是这种方法,对于静态操作有效,在递归迭代过程中,第一层的还能复制,但是第二次以后的,都复制不了了。
在递归调用过程中,尝试alert, promote, sleep方法,暂停程序的执行。但是这种方法,只对异步的操作有效(你给我消息,我相应),但是对于这种代码执行迭代过程,是卡不住的。
最后只好采用一个数组,只记录移动盘子的原和目的地址信息。
7. 移动过程演示
因为递归调用过程,是不能暂停程序的。用了数组将盘子移动的过程录制下来。
在演示过程中,读取录制的移动过程数据,让操作过程再执行一遍。
这里克隆了三个对象,用于操作过程的演示。
var leftPolebk = leftPole.myCloneobj();
var middlePolebk = middlePole.myCloneobj();
var rightPolebk = rightPole.myCloneobj();
8.
使用JavaScript写的汉诺塔小游戏
标签:data oca 汉诺塔 tostring datastore eof pos get 结构
原文地址:https://www.cnblogs.com/montai/p/13217191.html
文章来自:搜素材网的编程语言模块,转载请注明文章出处。
文章标题:使用JavaScript写的汉诺塔小游戏
文章链接:http://soscw.com/index.php/essay/37475.html
文章标题:使用JavaScript写的汉诺塔小游戏
文章链接:http://soscw.com/index.php/essay/37475.html
评论
亲,登录后才可以留言!