汉诺塔源码

在这里插入图片描述

<!doctype html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <meta name="Generator" content="EditPlus®">
  <meta name="Author" content="">
  <meta name="Keywords" content="">
  <meta name="Description" content="">
  <title>Document</title>
  <script type="text/javascript" >
  	var input={};
	input.A = [8,7,6,5,4,3,2,1];
	input.B = [];
	input.C=[];
	input.from = "A";
	input.target="C";
	var currentMove = 0;
	var moves = [];
  	function Hanoi(param){
		var fromArray;
		if("A" === param.from){
			fromArray = param.A;
		}else if("B" === param.from){
			fromArray = param.B;
		}else if("C" === param.from){
			fromArray = param.C;
		}

		var step1From =  param.from;
		var step1Target;
		if("A" === param.from && "B" === param.target){
			step1Target = "C";
		}else if("A" === param.from && "C" === param.target){
			step1Target = "B";
		}else if("B" === param.from && "C" === param.target){
			step1Target = "A";
		}else if("B" === param.from && "A" === param.target){
			step1Target = "C";
		}else if("C" === param.from && "A" === param.target){
			step1Target = "B";
		}else if("C" === param.from && "B" === param.target){
			step1Target = "A";
		}
		var step3From = step1Target;
		var step3Target = param.target ;



		if(fromArray.length == 1){
				console.log("move " + fromArray[0] + " from " + param.from + " to " + param.target);
				var moving = {};
				moving.index =  fromArray[0];
				moving.from =  param.from;
				moving.target =  param.target;
				moves.push(moving);
				return;
			}else if(fromArray.length > 1){
				//将7,6,5,4,3,2,1从A挪到B
				var step1Param = {};
				step1Param.A = [];
				step1Param.B = [];
				step1Param.C=[];
				step1Param.from = step1From;
				step1Param.target= step1Target;

				var step1FromArray;
				if("A" === param.from){
					step1FromArray = step1Param.A;
				}else if("B" === param.from){
					step1FromArray = step1Param.B;
				}else if("C" === param.from){
					step1FromArray = step1Param.C;
				}

				for(var i = 1;i<fromArray.length;i++){
					step1FromArray.push(fromArray[i]);
				}
				Hanoi(step1Param);

				//将8从A挪到C
				console.log("move " + fromArray[0] + " from " + param.from + " to " + param.target);
				var moving = {};
				moving.index =  fromArray[0];
				moving.from =  param.from;
				moving.target =  param.target;
				moves.push(moving);

				//将7,6,5,4,3,2,1从B挪到C
				var step3Param = {};
				step3Param.A = [];
				step3Param.B = [];
				step3Param.C=[];
				step3Param.from = step3From;
				step3Param.target= step3Target;

				var step3FromArray;
				if("A" === param.from && "B" === param.target){
					step3FromArray = step3Param.C;
				}else if("A" === param.from && "C" === param.target){
					step3FromArray = step3Param.B;
				}else if("B" === param.from && "C" === param.target){
					step3FromArray = step3Param.A;
				}else if("B" === param.from && "A" === param.target){
					step3FromArray = step3Param.C;
				}else if("C" === param.from && "A" === param.target){
					step3FromArray = step3Param.B;
				}else if("C" === param.from && "B" === param.target){
					step3FromArray = step3Param.A;
				}
				for(var i = 1;i<fromArray.length;i++){
					step3FromArray.push(fromArray[i]);
				}
				Hanoi(step3Param);
			}
	}

	

  </script>
  <script type="text/javascript" src="jquery.min.js" ></script>
  <script type="text/javascript" >
  		$(document).ready(function(){
			$("#test").click(function(){
				testClicking();
			});

			$("#moveB").click(function(){
				moveClicking();
			});
			var boxWidth = $("#box").width();
			var boxHeight = $("#box").height();
			var boxLeft = $("#box").offset().left;
			var boxTop =$("#box").offset().top;

			var groundWidth = $("#ground").width();
			var groundHeight = $("#ground").height();
			
			var newGroundLeft = (boxWidth - groundWidth)/2 + boxLeft;
			var newGroundTop = (boxHeight - groundHeight) + boxTop;
			$("#ground").offset({"left":newGroundLeft,"top":newGroundTop});

			var groundLeft = $("#ground").offset().left;
			var groundTop =$("#ground").offset().top;

			var cylinderWidth = $(".cylinder").width();
			var cylinderHeight = $(".cylinder").height();
			var newCylinderALeft = (groundWidth/3 - cylinderWidth)/2 + groundLeft;
			var newCylinderBLeft = (groundWidth/3 - cylinderWidth)/2 + groundLeft + groundWidth/3;
			var newCylinderCLeft = (groundWidth/3 - cylinderWidth)/2 + groundLeft + groundWidth/3 + groundWidth/3;
			var newCylinderTop = groundTop - cylinderHeight;

			$("#cylinderA").offset({"left":newCylinderALeft,"top":newCylinderTop});
			$("#cylinderB").offset({"left":newCylinderBLeft,"top":newCylinderTop});
			$("#cylinderC").offset({"left":newCylinderCLeft,"top":newCylinderTop});
			
			var round1Width = $("#round1").width();
			var round2Width = $("#round2").width();
			var round3Width = $("#round3").width();
			var round4Width = $("#round4").width();
			var round5Width = $("#round5").width();
			var round6Width = $("#round6").width();
			var round7Width = $("#round7").width();
			var round8Width = $("#round8").width();

			var cylinderA = $("#cylinderA").offset().left;
			var newRound1Left =(cylinderWidth - round1Width)/2 +cylinderA;
			var newRound1Top = groundTop - 15 * 8;
			$("#round1").offset({"left":newRound1Left,"top":newRound1Top});

			var newRound2Left =(cylinderWidth - round2Width)/2 +cylinderA;
			var newRound2Top = groundTop - 15 * 7;
			$("#round2").offset({"left":newRound2Left,"top":newRound2Top});

			var newRound3Left =(cylinderWidth - round3Width)/2 +cylinderA;
			var newRound3Top = groundTop - 15 * 6;
			$("#round3").offset({"left":newRound3Left,"top":newRound3Top});

			var newRound4Left =(cylinderWidth - round4Width)/2 +cylinderA;
			var newRound4Top = groundTop - 15 * 5;
			$("#round4").offset({"left":newRound4Left,"top":newRound4Top});

			var newRound5Left =(cylinderWidth - round5Width)/2 +cylinderA;
			var newRound5Top = groundTop - 15 * 4;
			$("#round5").offset({"left":newRound5Left,"top":newRound5Top});

			var newRound6Left =(cylinderWidth - round6Width)/2 +cylinderA;
			var newRound6Top = groundTop - 15 * 3;
			$("#round6").offset({"left":newRound6Left,"top":newRound6Top});

			var newRound7Left =(cylinderWidth - round7Width)/2 +cylinderA;
			var newRound7Top = groundTop - 15 * 2;
			$("#round7").offset({"left":newRound7Left,"top":newRound7Top});

			var newRound8Left =(cylinderWidth - round8Width)/2 +cylinderA;
			var newRound8Top = groundTop- 15 * 1;
			$("#round8").offset({"left":newRound8Left,"top":newRound8Top});
	});

	var sizeA = 8;
	var sizeB = 0;
	var sizeC = 0;
	function move(index,from,target){
		var cylinderA = $("#cylinderA").offset().left;
		var cylinderB = $("#cylinderB").offset().left;
		var cylinderC = $("#cylinderC").offset().left;
		var cylinderWidth = $(".cylinder").width();
		var roundWidth = $("#round" + index).width();
		var groundTop =$("#ground").offset().top;
		var newLeft = 0;
		var newRoundTop = 0;

		if("A" === from){
			sizeA--;
		}else if("B" === from){
			sizeB--;
		}else if("C" === from){
			sizeC--;
		}

		if("A" === target){
			newLeft =(cylinderWidth - roundWidth)/2 +cylinderA - 9;
			newRoundTop = groundTop- 15 * (sizeA + 1) - 9;
			sizeA++;
		}else if("B" === target){
			newLeft =(cylinderWidth - roundWidth)/2 +cylinderB - 9;
			newRoundTop = groundTop- 15 * (sizeB+1) - 9;
			sizeB++;
		}else if("C" === target){
			newLeft =(cylinderWidth - roundWidth)/2 +cylinderC - 9;
			newRoundTop = groundTop- 15 * (sizeC + 1) - 9;
			sizeC++;
		}

		$("#round" + index).animate({top:"150px"},200);
		$("#round" + index).animate({left: newLeft + "px"},200);
		$("#round" + index).animate({top:newRoundTop + "px"},5000,"swing",function(){moveClicking();});
	}

	function testClicking(){
		currentMove = 0;
		moves = [];
		Hanoi(input);
		alert("装载完了");
	}

	function moveClicking(){
		if(currentMove<moves.length){
			var moving = moves[currentMove];
			move(moving.index,moving.from,moving.target);
			currentMove ++;
		}else{
			alert("播放完毕");
		}
	}
  </script>
  <style type="text/css" >
  	div{
		position: absolute;
	}
  	.box{
		border:1px solid #CCC;
		width:1000px;
		height:500px;
	}
  	#ground{
		background-color: #f00;
		width:600px;
		height:30px;
	}
	.cylinder{
		width:20px;
		height:120px;
		background-color:#ca6;
	}
	.round{
		height:15px;
		border-radius:2px;
	}
	#round1{
		width:40px;
		background-color:#AB71CF;
	}
	#round2{
		width:56px;
		background-color:#EE3335;
	}
	#round3{
		width:72px;
		background-color:#FD6846;
	}
	#round4{
		width:88px;
		background-color:#B0E478;
	}
	#round5{
		width:104px;
		background-color:#FED61B;
	}
	#round6{
		width:120px;
		background-color:#FD6547;
	}
	#round7{
		width:136px;
		background-color:#E63233;
	}
	#round8{
		width:152px;
		background-color:#8E3C9E;
	}
  </style>
 </head>
 <body>
  <div id= "box" class="box">
  	<div id="cylinderA" class="cylinder" ></div>
	<div id="cylinderB" class="cylinder" ></div>
	<div id="cylinderC" class="cylinder" ></div>
	<div id="round1" class="round" ></div>
	<div id="round2" class="round" ></div>
	<div id="round3" class="round" ></div>
	<div id="round4" class="round" ></div>
	<div id="round5" class="round" ></div>
	<div id="round6" class="round" ></div>
	<div id="round7" class="round" ></div>
	<div id="round8" class="round" ></div>
	<div id="ground" ></div>
  </div>
  <button id="test" type="button" style="margin-top:500px;" >计算步骤</button>
  <button id="moveB" type="button">开搞</button>
 </body>
</html>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值