免费下载: Ghost全自动系统备份光盘正式版 V4.5 | 硬盘版 V2.0 | 排行榜 TOP50 玩玩小游戏:连连看游戏网 http://www.llkyx.com
首页 >> 下载中心 >> JavaScript源码 >> 汉诺塔游戏(Tower of Hanoi)js源代码

汉诺塔游戏(Tower of Hanoi)js源代码

作者:天空诚整理 来源:中国Asp之家 时间:2008-6-1 网友评论条 【

汉诺塔(又称河内塔)问题是印度的一个古老的传说。开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面。解答结果请自己运行计算,程序见尾部。面对庞大的数字(移动圆片的次数)18446744073709551615,看来,众僧们耗尽毕生精力也不可能完成金片的移动。

后来,这个传说就演变为汉诺塔游戏:

1.有三根杆子A,B,C。A杆上有若干碟子  
2.每次移动一块碟子,小的只能叠在大的上面  
3.把所有碟子从A杆全部移到C杆上

经过研究发现,汉诺塔的破解很简单,就是按照移动规则向一个方向移动金片:

如3阶汉诺塔的移动:A→C,A→B,C→B,A→C,B→A,B→C,A→C

注意:请使用IE浏览器玩这个JavaScript 汉诺塔 游戏

界面截图:

汉诺塔游戏源代码下载地址:Tower-of-Hanoi-game.rar (4.12 KB)

进入汉诺塔在线游戏:

http://www.aspxhome.com/game/Tower-of-Hanoi.htm   

部分游戏源代码:

  function dropDisk(disk){
        document.onmousemove=new Function("return false");
        if (!drag) return;
        var gameStatus=false;
        var topDisk = disksOnTowers[indexTo-1][0];
        if (indexFr==indexTo){
            getNewTop(indexFr,null);
            pushDisk(disk,indexFr); //put disk back to original tower
            getNewTop(indexFr,disk);
        }
        else if (topDisk==null) {
            pushDisk(disk,indexTo);
            getNewTop(indexFr,null);
            getNewTop(indexTo,disk);
            movectr++;
            currTower=indexTo;
            prevTower=indexFr;
            document.hanoi.btnUndo.disabled=false;
        }
        else if (parseInt(disk.style.width)<parseInt(topDisk.style.width)){
            pushDisk(disk,indexTo);
            getNewTop(indexFr,null);
            getNewTop(indexTo,disk);
            movectr++;
            currTower=indexTo;
            prevTower=indexFr;
            if (indexTo==3) gameStatus=checkStatus();
            document.hanoi.btnUndo.disabled=false;
        }
        else {
            getNewTop(indexFr,null);
            pushDisk(disk,indexFr); //put disk back to original tower
            getNewTop(indexFr,disk);
        }
     
        drag=false;
        document.hanoi.yourmove.value=movectr;
        if (gameStatus) {
            document.hanoi.btnUndo.disabled=true;
            minmove = parseInt(document.hanoi.minmove.value);
            if (movectr==minmove) msg="\n恭喜你! 你只用了 "+minmove+" 步!"
            else if (movectr>minmove) msg="\n努力啊!你还可以用更少的步数!"
            else msg="";
            alert("游戏结束 !!!"+msg);
            gameOver=true;
        }
        return;
    }     
   
    function checkStatus(){
        var gameStat = false;
        var disks=0;
        for (var i=0;i<disksOnTower3.length;i++){
            if (disksOnTowers[2][i]!=null) disks++;
        }
        if (disks==parseInt(document.hanoi.diskno.options[document.hanoi.diskno.options.selectedIndex].text)) gameStat=true;
        return gameStat;
    }

    function pushDisk(disk,index){
        var diskWidth = parseInt(disk.style.width);
        var towerLeft = parseInt(document.all["tower"+index].style.left);
        var topDisk = disksOnTowers[index-1][0];
        if (topDisk!=null){
            topDiskWidth = parseInt(topDisk.style.width);
            topDiskTop = parseInt(topDisk.style.top);
            disk.style.left=towerLeft+midhoriztower-diskWidth/2;
            disk.style.top=topDiskTop-diskheight*2-4;
        }
        else {
            disk.style.left=towerLeft+midhoriztower-diskWidth/2;
            disk.style.top=basetop-diskheight*2-4;
        } 
    }
  
    function getNewTop(index,disk){
        if (disk==null){  //pop
            for (var i=0;i<disksOnTower1.length-1;i++){
                disksOnTowers[index-1][i]=disksOnTowers[index-1][i+1];
            }
            disksOnTowers[index-1][disksOnTower1.length-1]=null;
        }
        else {  //push
            for (var i=disksOnTower1.length-1;i>=1;i--){
                disksOnTowers[index-1][i]=disksOnTowers[index-1][i-1];
            }
            disksOnTowers[index-1][0]=disk;
        }
    }

站长工具
英文域名注册及Whois查询:
相关文章
loading 请稍等,评论加载中...

Aspxhome.com. 中国Asp之家. 版权所有

闽ICP备06017341号