使用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


评论


亲,登录后才可以留言!