public static void Main()
Console.WriteLine("Hello World");
return {pegs: pegs, disks: disks, timeline: timeline, scene: scene, workingFrame: workingFrame, updateWorkingFrame: updateWorkingFrame, getWorkingFrame: getWorkingFrame};
var convertLetterToPeg = function(pegLetter) {
if(pegLetter === "A" || pegLetter === "B" || pegLetter === "C"){
return objects.pegs[pegLetter.charCodeAt(0)-65];
var moveDisk = function(fromPeg, toPeg) {
var triedFromPeg = fromPeg;
fromPeg = convertLetterToPeg(fromPeg);
toPeg = convertLetterToPeg(toPeg);
badMoveMessage = "'"+triedFromPeg+"' is not a valid peg";
badMoveMessage += "\nvalid peg names are 'A','B' or 'C'";
badMoveMessage = "'"+triedToPeg+"' is not a valid peg";
badMoveMessage += "\nvalid peg names are 'A','B' or 'C'";
else if(fromPeg.countDisks() === 0){
badMoveMessage = "You attempted to move a disk from peg "+ fromPeg.letter;
badMoveMessage += " but that peg\nwas empty";
else if(toPeg.countDisks() > 0 && fromPeg.getTopDisk().number > toPeg.getTopDisk().number ){
badMoveMessage = "You attempted to move disk "+fromPeg.getTopDisk().number +" from peg ";
badMoveMessage += fromPeg.letter + " onto disk " + toPeg.getTopDisk().number + " on peg ";
badMoveMessage += toPeg.letter +"\nIt is against the rules to move larger disks onto smaller disks";
badMoveMessage += "\nFurther calls to the moveDisk function will be blocked.";
badMoveMessage += "\nPress 'Restart' to be able to call the function again.";
var nowFrame = objects.getWorkingFrame();
var duration = WINDOW_SIZE * 3 / (16 * 4);
if(fromPeg !== null){ workingDisk = fromPeg.getTopDisk();}
if(toPeg !== null){ numOnToPeg = toPeg.disks.length; }
objects.timeline.addEvent(nowFrame, duration, function() {
objects.scene.draggingSprite = objects.scene.sprites.indexOf(workingDisk);
var destY = toPeg.y + toPeg.h - (workingDisk.h+0.1) * (numOnToPeg + 1);
var changeInY = destY - workingDisk.y;
var yIncrament = changeInY / (duration - (frame - nowFrame - 4));
var destX = toPeg.x + toPeg.w / 2 - workingDisk.w / 2;
var changeInX = destX - workingDisk.x;
var xIncrament = changeInX / (duration - (frame - nowFrame - 4));
workingDisk.translate(xIncrament, yIncrament);
println(fromPeg.letter + " -> "+toPeg.letter);
workingDisk.x = toPeg.x + toPeg.w / 2 - workingDisk.w / 2;
var disksUnder = numOnToPeg;
workingDisk.y = toPeg.y + toPeg.h - (workingDisk.h+0.1) * (disksUnder + 1);
objects.workingFrame = nowFrame + duration + 1;
objects.updateWorkingFrame(objects.workingFrame);
var workingDisk = fromPeg.getTopDisk();
workingDisk.moveToPeg(toPeg);
var getSparePeg = function(peg1, peg2) {
peg1 = convertLetterToPeg(peg1);
peg2 = convertLetterToPeg(peg2);
if(peg1 === null || peg2 === null){ return null; }
var sparePegIndex = 3 - (peg1.number - 1) - (peg2.number - 1);
return objects.pegs[sparePegIndex].letter;
var isSolved=function(toPeg){
if(badmove){ return false; }
var pegA= convertLetterToPeg("A");
var pegB= convertLetterToPeg("B");
var pegC= convertLetterToPeg("C");
var goalPeg = convertLetterToPeg(toPeg);
if(goalPeg === null){ return false; }
if(goalPeg.disks.length !== 5 ){return false;}
if(goalPeg === pegA){ return pegB.disks.length ===0 && pegC.disks.length ===0; }
if(goalPeg === pegB){ return pegA.disks.length ===0 && pegC.disks.length ===0; }
if(goalPeg === pegC){ return pegA.disks.length ===0 && pegB.disks.length ===0; }
getSparePeg: getSparePeg,
var solveHanoi = function(numDisks, fromPeg, toPeg) {
isSolved = hanoi.isSolved(toPeg);
var sparePeg = hanoi.getSparePeg(fromPeg, toPeg);
solveHanoi(numDisks-1, fromPeg,sparePeg);
hanoi.moveDisk(fromPeg,toPeg);
solveHanoi(numDisks-1, sparePeg, toPeg);
Program.assertEqual(hanoi.isSolved("B"),true);