javascript实现汉诺塔动画效果
javascript实现汉诺塔动画效果
当初以为不用html5也很简单,踩了javascript单线程的大坑后终于做出来了,没事可以研究下,对理解javascript的执行过程还是很有帮助的,代码很烂大家凑合着看。

<html>
<head>
    <meta charset="UTF-8">
    <title>Tower of Hanoi 2.0.0</title>
    <script src="http://apps.bdimg.com/libs/jquery/1.10.2/jquery.js"></script>
    <style>
    table {
        border: 1px solid #eee;
        float: left;
    }
    td {
        width: 15px;
        height: 10px;
    }
    caption {
        text-align: center;
    }
    </style>
    <script>
    $(function() {
        var tr = $('<tr></tr>');
        for (var i = 0; i < 17; i++) {
            tr.append($('<td></td>').clone());
        }
        $('table').each(function() {
            for (var i = 0; i < 9; i++) {
                $(this).append(tr.clone());
            }
        });
        InitCanva();
    });
    var polA = [];
    var polB = [];
    var polC = [];
    var Steps = [];
    polA.pol = "A";
    polB.pol = "B";
    polC.pol = "C";
    //inti canva
    function InitCanva() {
        polA = [];
        polB = [];
        polC = [];
        polA.pol = "A";
        polB.pol = "B";
        polC.pol = "C";
        Steps = [];
        var level = $('#level').val();
        $("td").css("background", "#FFF");
        for (var i = 1; i <= level; i++) {
            polA.push(i * 2 - 1);
        }
        Draw(polA);
        $("#step").click();
    }
    function Step() {
        if (Steps.length > 0) {
            var s = Steps.shift();
            DrawUI(s);
        } else {
            clearInterval(window.t);
        }
    }
    function Draw(pol) {
        var tmp = [];
        tmp.pol = pol.pol;
        for (var i = 0; i < pol.length; i++) {
            tmp.push(pol[i]);
        }
        Steps.push(tmp);
    }
    function DrawUI(pol) {
        var tb = $('#pole' + pol.pol);
        var level = pol.length;
        tb.find("td").css("background", "#FFF");
        var trs = tb.find("tr:gt(" + (9 - level - 1) + ")");
        for (var i = 0; i < trs.length; i++) {
            var min = 8 - (pol[i] + 1) / 2;
            var max = 8 + (pol[i] + 1) / 2 - 1;
            $(trs[i]).find("td:gt(" + min + ")").css("background", "#000");
            $(trs[i]).find("td:gt(" + max + ")").css("background", "#FFF");
        }
    }
    function MoveHanoi(level, pol_A, pol_B, pol_C) {
        if (level == 1) {
            console.log(pol_A.pol + '-->' + pol_C.pol);
            var m = pol_A.shift();
            pol_C.reverse();
            pol_C.push(m);
            pol_C.reverse();
            Draw(pol_A);
            Draw(pol_C);
        } else {
            MoveHanoi(level - 1, pol_A, pol_C, pol_B);
            MoveHanoi(1, pol_A, pol_B, pol_C);
            MoveHanoi(level - 1, pol_B, pol_A, pol_C);
        }
    }
    function Play() {
        InitCanva();
        var level = $('#level').val();
        MoveHanoi(level, polA, polB, polC);
        window.t = setInterval(function() {
            $("#step").click();
        }, 300);
    }
    function Delay(minseconds) {
        var t = +new Date();
        while (+new Date() - t < minseconds) {}
    }
    </script>
</head>
<body>
    Level:
    <select name="level" id="level" onchange="InitCanva()">
        <option value="3">3</option>
        <option value="4">4</option>
        <option value="5">5</option>
        <option value="6">6</option>
        <option value="7">7</option>
        <option value="8">8</option>
        <option value="9">9</option>
    </select>
    <button onclick="Play()" class="btn-primary">Play</button>
    <button id="step" onclick="Step()" class="btn-primary" style="display:none;">Step</button>
    <hr>
    <div>
        <table id="poleA">
            <caption>
                <h3>Pole A</h3></caption>
        </table>
        <table id="poleB">
            <caption>
                <h3>Pole B</h3></caption>
        </table>
        <table id="poleC">
            <caption>
                <h3>Pole C</h3></caption>
        </table>
    </div>
</body>
</html>
转载请注明出处, 原文链接: http://www.cnblogs.com/wancy86/p/hanoi_tower.html
javascript实现汉诺塔动画效果的更多相关文章
- [javascript]模拟汉诺塔
		
看了博文自己动手写了代码. 这能值几个钱? 请写代码完成汉诺塔的算法:void Hanoi(int maxLevel); 比如2层汉诺塔,需要打印(Console.WriteLine)出如下文本: A ...
 - Python实现汉诺塔问题的可视化(以动画的形式展示移动过程)
		
学习Python已经有一段时间了,也学习了递归的方法,而能够实践该方法的当然就是汉诺塔问题了,但是这次我们不只是要完成对汉诺塔过程的计算,还要通过turtle库来体现汉诺塔中每一层移动的过程. 一.设 ...
 - 汉诺塔的python 动画演示
		
1.简介 古代有一座汉诺塔,塔内有3个座A.B.C,A座上有n个盘子,盘子大小不等,大的在下,小的在上,如图所示.有一个和尚想把这n个盘子从A座移到C座,但每次只能移动一个盘子,并且自移动过程中,3个 ...
 - 关于汉诺塔,C++代码,代码效果演算
		
 1.故事介绍 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上依照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘 ...
 - JavaScript算法实现之汉诺塔(Hanoi)
		
目前前端新手,看到的不喜勿喷,还望大神指教. 随着Node.js,Angular.js,JQuery的流行,点燃了我学习JavaScript的热情!以后打算每天早上跟晚上抽2小时左右时间将经典的算法都 ...
 - JavaScript递归函数解“汉诺塔”
		
“汉诺塔”是一个著名的益智游戏.塔上有3根柱子和一套直径各不相同的空心圆盘.开始时柱子上的所有圆盘都按照从小到大的顺序堆叠.目标是通过每次移动一个圆盘到另一根柱子,最终把一堆圆盘移动到目标柱子上,过程 ...
 - 递归可视化之汉诺塔的动画实现(turtle海龟)
		
import turtle class Stack: def __init__(self): self.items = [] def isEmpty(self): def push(self, ite ...
 - 基于HTML5的WebGL设计汉诺塔3D游戏
		
在这里我们将构造一个基于HT for Web的HTML5+JavaScript来实现汉诺塔游戏. http://hightopo.com/demo/hanoi_20151106/index.html ...
 - HT for Web 3D游戏设计设计--汉诺塔(Towers of Hanoi)
		
在这里我们将构造一个基于HT for Web的HTML5+JavaScript来实现汉诺塔游戏. 汉诺塔的游戏规则及递归算法分析请参考http://en.wikipedia.org/wiki/Towe ...
 
随机推荐
- ios xcode 下 报出 ”xx“is missing from working copy 的问题
			
在项目中提交过svn后,再在本机上删除不用的图片资源后,build后会有 ”xx“is missing from working copy 的警告.在网上找了些资料后,总结下. 直接在终端下用s ...
 - [UCSD白板题] Number of Inversions
			
Problem Introduction An inversion of a sequence \(a_0,a_1,\cdots,a_{n-1}\) is a pair of indices \(0 ...
 - Mini projects #4 ---- Pong
			
课程全名:An Introduction to Interactive Programming in Python,来自 Rice University 授课教授:Joe Warren, Scott ...
 - 大数据组件原理总结-Hadoop、Hbase、Kafka、Zookeeper、Spark
			
Hadoop原理 分为HDFS与Yarn两个部分.HDFS有Namenode和Datanode两个部分.每个节点占用一个电脑.Datanode定时向Namenode发送心跳包,心跳包中包含Datano ...
 - http://blog.csdn.net/chenriwei2/article/details/38047119
			
SSP或者说是空间金字塔匹配(spatial pyramid matching or SPM)是BoW的一个扩展,它把一张图片划分为从不同的分辨率级别然后聚合这些不同分辨率的图像,在深度学习之前SPM ...
 - U盘的不识别问题
			
1.案例: 我重新装过电脑以后出现过一个问题是: 我的U盘只能在我电脑上用,在其他电脑上不能用 其他人的U盘不能在我的电脑上用. 2.根本问题: 是驱动问题.接口上没符合的驱动,未能指定路径.电脑上可 ...
 - Getting Started with WebRTC [note]
			
Getting Started with WebRTC 原文 RTCPeerConnection 1.caller和callee互相发现彼此 2.并且交换capabilities信息 3.初始化ses ...
 - Ubuntu之root权限的获取
			
方案一: Ubuntu的root密码在没有设置之前是随机的,即在每一次开机的时候他的密码都不同,但是由于在安装Ubuntu的时候需要建立一个账户,而这个招呼又属于admin组,因此它可以对root进行 ...
 - MVC_Controller
			
准备工作 安装VS2010或更高版本 安装数据库2008或更高版本 视个人系统不同配置IIS本地服务 数据库和VS下载地址 http://msdn.itellyou.cn/ 本节目标 通过本节案例对M ...
 - myrocks之事务处理
			
前言 mysql目前支持的事务引擎有innodb,tokudb. rocksdb加入mysql阵营后,mysql支持的事务引擎增长至3个.myrocks目前支持的事务隔离级别有read-committ ...