Browse Source

repo created

Bernardo Martins 5 years ago
parent
commit
8b5dc9467f
3 changed files with 113 additions and 143 deletions
  1. 0 90
      iHanoi_IMA.html
  2. 72 46
      js/iHanoiFunctions.js
  3. 41 7
      js/integration-functions.js

+ 0 - 90
iHanoi_IMA.html

@@ -1,90 +0,0 @@
-<!DOCTYPE html>
-<meta charset="UTF-8">
-<html>
-	<head>
-		<title> Torre de Hanoi </title>
-		<Style>
-			#planoDeFundo {
-				background :transparent;
-				width: 100%; 
-				height: 75%;
-				position: absolute;
-			}
-			#restart_button{
-				position:absolute;
-				border:1px solid gray;
-				border-radius: 7%;
-				font-size: 0.875;
-				word-wrap: break-word;
-				max-width: 7%;
-				left: 21%;
-				top:5%;
-			}
-			#A_button{
-				position:absolute;
-				border:1px solid gray;
-				border-radius: 7%;
-				font-size: 1;
-				height:3%;
-				width: 20%;
-				left: 6.6%;
-				top:76%;
-			}
-			#B_button{
-				position:absolute;
-				border:1px solid gray;
-				border-radius: 7%;
-				font-size: 1;
-				height: 3%;
-				word-wrap: break-word;
-				width: 20%;
-				left: 40.5%;
-				top:76%;
-			}
-			#C_button{
-				position:absolute;
-				border:1px solid gray;
-				border-radius: 7%;
-				font-size: 1;
-				height: 3%;
-				width: 20%;
-				left: 74%;
-				top:76%;
-			}
-		</Style>
-		<script src="js/jquery-3.3.1.min.js"></script>
-		<script src="js/integration-functions.js"></script>
-	</head>
-	<body>
-	<div class="task"  style="display:none">
-		<button id="A_button" onclick="buttonClick(0)">A</button>
-		<button id="B_button" onclick="buttonClick(1)">B</button>
-		<button id="C_button" onclick="buttonClick(2)">C</button>
-		<canvas id="planoDeFundo"  width="1024" height="615">
-		Seu navegador não suporta o recurso Canvas. Atualize-o para utilizar esse recurso
-		</canvas>
-		<script src="js/iHanoiFunctions.js"></script>
-	</div>
-	<div class="creation" style="display:none">
-		Quantidade de discos no desafio: 
-		<select name="Discos">
-			<option>2</option>
-			<option>3</option>
-			<option>4</option>
-			<option>5</option>
-			<option>6</option>
-			<option>7</option>
-		</select>
-	</div>
-	<!--<div class="answer" style display:none>
-		<button id="Run" onclick="buttonClick(0)">A</button>
-		<button id="Next Line" onclick="buttonClick(1)">B</button>
-		<button id="Previous Line" onclick="buttonClick(2)">C</button>
-		<canvas id="planoDeFundo"  width="1024" height="615">
-		Seu navegador não suporta o recurso Canvas. Atualize-o para utilizar esse recurso
-		</canvas>
-		<script src="js/iHanoiAnswer.js"></script>
-	</div>-->
-    	
-  </body>
-</html>

+ 72 - 46
js/iHanoiFunctions.js

@@ -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();
+	}
+}

+ 41 - 7
js/integration-functions.js

@@ -24,9 +24,15 @@ function getAnswer() {
     // então trata-se de resolução de atividade
     if (iLMparameters.iLM_PARAM_SendAnswer == 'false') {
         // Montar o retorno da resposta do aluno
-        return moves;
+        var teacherReturn ="Numero de discos: "+nDisks+"  Quantidade de Movimentos: "+nTotalMovements+
+                            "\nQuantidade de erros: "+nWrongMoves+"  Tempo Total: "+totalTime+
+                            "\n --De Para";
+        for(var i=0; i<totalMoves.length; i++){
+            teacherReturn+="\n"+totalMoves[i];
+        }
+        return teacherReturn;
     } else {//se for o professor acessando, mostra a pagina de elaboração
-        return JSON.stringify($('form[name="creation"]').serializeArray());
+        return "Número de Discos: "+$('.cDiscos').val();
     }
 }
 
@@ -56,11 +62,31 @@ function getiLMContent() {
     // O parâmetro "iLM_PARAM_Assignment" fornece o URL do endereço que deve ser
     // requisitado via AJAX para a captura dos dados da atividade
     $.get(iLMparameters.iLM_PARAM_Assignment, function (d) {
-
         // Uma vez que os dados foram recebidos, o método "organizaAtividade" é chamado.
         // Observe que esse método faz parte do arquivo js/iarithmetic-functions.js
-        inicio(4);//(JSON.parse(d));
-
+        console.log(d);
+        res = d.split(" ");
+        inicio(parseInt(res[3]));
+        if (res.indexOf("Quantidade")!=-1){
+            document.getElementById("A_button").disabled = true;
+            document.getElementById("B_button").disabled = true;
+            document.getElementById("C_button").disabled = true;
+            res = d.split("\n");
+            var j = 0
+            while(res[j].indexOf("--")==-1){
+                j++;
+            }
+            j++;
+            while(j<res.length){
+                res2 = res[j].split("  ");
+                nTotalMovements--;
+                console.log(res2);
+                idF= res2[0];
+                idT= res2[1];
+                finishMove(parseInt(res2[0]),parseInt(res2[1]));
+                j++;
+            }
+        }
     });
 }
 
@@ -71,7 +97,6 @@ function getiLMContent() {
 $(document).ready(function() {
     // Se iLM_PARAM_SendAnswer for false, então trata-se de resolução de atividade,
     // portanto, a "DIV" de resolução é liberada
-    iLMparameters.iLM_PARAM_SendAnswer='false';
     if (iLMparameters.iLM_PARAM_SendAnswer == 'false') {
         $('.task').css("display","block");
         getiLMContent();
@@ -80,4 +105,13 @@ $(document).ready(function() {
         // é para a elaboração de atividade:
         $('.creation').css("display","block");
     }
-});
+});
+
+function sleep(milliseconds) {
+  var startSleep = new Date().getTime();
+  for (var i = 0; i < 1e7; i++) {
+    if ((new Date().getTime() - startSleep) > milliseconds){
+      break;
+    }
+  }
+}