|
@@ -3,8 +3,8 @@ var context = canvas.getContext('2d');
|
|
|
var towerA = [], towerB = [], towerC = [];
|
|
|
var toMove = null;
|
|
|
var idF=" ", idT= " ";
|
|
|
-var nMovements = 0, nWrongMoves=0, nDisks;
|
|
|
-var moves=""; //string to save movements
|
|
|
+var nMovements = 0, nTotalMovements = 0, nWrongMoves = 0, nDisks;
|
|
|
+var moves = [], totalMoves = []; //vector to save movements
|
|
|
var acertou=0;
|
|
|
var optimalSolution;
|
|
|
//NavyBlue Lime Fuchsia yellow Orange LightSteelBlue red
|
|
@@ -12,14 +12,13 @@ var colors = ["#000080","#00FF00", "#FF00FF", "yellow", "#FFA500", "#B0C4DE","re
|
|
|
var start = Date.now(), startOfMove, totalTime, moveTime; //timing vars
|
|
|
|
|
|
function inicio (QntityDisks){
|
|
|
- nDisks = QntityDisks;
|
|
|
- optimalSolution= Math.pow(2,nDisks)-1;
|
|
|
+ nDisks=QntityDisks;
|
|
|
+ optimalSolution= Math.pow(2,QntityDisks)-1;
|
|
|
var x = 0;
|
|
|
var y = 558;
|
|
|
var w = 330;
|
|
|
- moves="";
|
|
|
startOfMove=Date.now();
|
|
|
- for (var i = 0; i < nDisks; i++) {
|
|
|
+ for (var i = 0; i < QntityDisks; i++) {
|
|
|
var disk = new Disk(x,y,w,40,colors[i]);
|
|
|
towerA.push(disk);
|
|
|
x+=20; //moves to the right
|
|
@@ -48,20 +47,15 @@ class Disk{
|
|
|
}
|
|
|
}
|
|
|
function reinicio (){
|
|
|
- while(towerA.length>0){
|
|
|
- towerA.pop();
|
|
|
- }
|
|
|
- while(towerB.length>0){
|
|
|
- towerB.pop();
|
|
|
- }
|
|
|
- while(towerC.length>0){
|
|
|
- towerC.pop();
|
|
|
- }
|
|
|
+ towerA.splice(0,towerA.length);
|
|
|
+ towerB.splice(0,towerB.length);
|
|
|
+ towerC.splice(0,towerC.length);
|
|
|
+ moves.splice(0,moves.length);
|
|
|
nMovements=0;
|
|
|
idF = " ";
|
|
|
idT=" ";
|
|
|
toMove=null;
|
|
|
- inicio();
|
|
|
+ inicio(nDisks);
|
|
|
}
|
|
|
function drawTowers (){
|
|
|
context.beginPath();
|
|
@@ -133,47 +127,26 @@ function drawFromTo (){
|
|
|
context.font = "50px Arial";
|
|
|
context.fillStyle = "black";
|
|
|
context.fillText("Move from "+idF+" to "+idT, 50, 50);
|
|
|
- context.fillText("Movements: "+nMovements, 50, 100);
|
|
|
+ context.fillText("Movements: "+nTotalMovements, 50, 100);
|
|
|
}
|
|
|
|
|
|
|
|
|
function moveDisk (origin, destiny){
|
|
|
var originTower = getTower(origin), destinyTower = getTower(destiny), topDiskOrigin, topDiskDestiny;
|
|
|
moveTime = Math.floor( (Date.now()- startOfMove) /1000);
|
|
|
- moves+="\n"+origin+" "+destiny+" "+moveTime;
|
|
|
startOfMove = Date.now();//update start of movement
|
|
|
- console.clear();
|
|
|
+ if(nMovements< moves.length){
|
|
|
+ moves.splice(nMovements, moves.length- nMovements);
|
|
|
+ }
|
|
|
+ moves.push(origin+" "+destiny);
|
|
|
+
|
|
|
console.log(moves);
|
|
|
nMovements++;
|
|
|
-
|
|
|
- topDiskOrigin = originTower[originTower.length-1];
|
|
|
- if(destinyTower.length>0){
|
|
|
- topDiskDestiny = destinyTower[destinyTower.length-1];
|
|
|
- if(topDiskOrigin.w<topDiskDestiny.w){
|
|
|
- topDiskOrigin.x += 345*(destiny-origin);
|
|
|
- topDiskOrigin.y += 42*(originTower.length-destinyTower.length-1);
|
|
|
- originTower.pop();
|
|
|
- destinyTower.push(topDiskOrigin);
|
|
|
- drawScene();
|
|
|
- } else{
|
|
|
- nWrongMoves++;
|
|
|
- alert("Movimento Inválido");
|
|
|
- idF =" ";
|
|
|
- idT =" ";
|
|
|
- drawScene();
|
|
|
- }
|
|
|
- }else{
|
|
|
- topDiskOrigin.x += 345*(destiny-origin);
|
|
|
- topDiskOrigin.y += 42*(originTower.length-destinyTower.length-1);
|
|
|
- originTower.pop();
|
|
|
- destinyTower.push(topDiskOrigin);
|
|
|
- nMovements++;
|
|
|
- drawScene();
|
|
|
- }
|
|
|
+ finishMove(origin, destiny);
|
|
|
if(towerC.length == nDisks && nDisks!=0){
|
|
|
acertou=1;
|
|
|
totalTime= Date.now() - start;
|
|
|
- if(nMovements==optimalSolution){
|
|
|
+ if(nTotalMovements==optimalSolution){
|
|
|
alert("You Won in the least amount of movements!!!\nCongratulations!!!");
|
|
|
}else{
|
|
|
alert("You Won!!!\nCongratulations!!");
|
|
@@ -206,4 +179,57 @@ function roundRect(ctx, x, y, width, height, radius, fill, stroke) {
|
|
|
ctx.fill();
|
|
|
}
|
|
|
}
|
|
|
-inicio(4);
|
|
|
+
|
|
|
+function undo(){
|
|
|
+ if(nMovements>0){
|
|
|
+ var res = moves[nMovements-1].split(" ");
|
|
|
+ nMovements--;
|
|
|
+ if (nMovements>1){
|
|
|
+ var res2 = moves[nMovements-2].split(" ");
|
|
|
+ idf = res2[0];
|
|
|
+ idt = res2[1];
|
|
|
+ } else{
|
|
|
+ idf = "";
|
|
|
+ idt = "";
|
|
|
+ }
|
|
|
+ finishMove(parseInt(res[1]), parseInt(res[0]));
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+function redo(){
|
|
|
+ if (nMovements < moves.length){
|
|
|
+ var res = moves[nMovements].split(" ");
|
|
|
+ nMovements++;
|
|
|
+ console.log(res[0]+ res[1]);
|
|
|
+ finishMove(parseInt(res[0]), parseInt(res[1]));
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+function finishMove(origin, destiny){
|
|
|
+ nTotalMovements++;
|
|
|
+ var originTower = getTower(origin), destinyTower = getTower(destiny), topDiskOrigin, topDiskDestiny;
|
|
|
+ topDiskOrigin = originTower[originTower.length-1];
|
|
|
+ totalMoves.push(origin+" "+destiny+" "+moveTime);
|
|
|
+ if(destinyTower.length>0){
|
|
|
+ topDiskDestiny = destinyTower[destinyTower.length-1];
|
|
|
+ if(topDiskOrigin.w<topDiskDestiny.w){
|
|
|
+ topDiskOrigin.x += 345*(destiny-origin);
|
|
|
+ topDiskOrigin.y += 42*(originTower.length-destinyTower.length-1);
|
|
|
+ originTower.pop();
|
|
|
+ destinyTower.push(topDiskOrigin);
|
|
|
+ drawScene();
|
|
|
+ } else{
|
|
|
+ nWrongMoves++;
|
|
|
+ alert("Movimento Inválido");
|
|
|
+ idF =" ";
|
|
|
+ idT =" ";
|
|
|
+ drawScene();
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ topDiskOrigin.x += 345*(destiny-origin);
|
|
|
+ topDiskOrigin.y += 42*(originTower.length-destinyTower.length-1);
|
|
|
+ originTower.pop();
|
|
|
+ destinyTower.push(topDiskOrigin);
|
|
|
+ drawScene();
|
|
|
+ }
|
|
|
+}
|