Browse Source

add iAssign compatibility

Bernardo 4 years ago
parent
commit
89d5d5b5f7

BIN
assets/acoes.png


BIN
assets/diskSelection/fiveDisks.png


BIN
assets/diskSelection/fourDisks.png


BIN
assets/diskSelection/sixDisks.png


BIN
assets/diskSelection/threeDisks.png


BIN
assets/diskSelection/twoDisks.png


BIN
assets/diskSelector.png


BIN
assets/redo2.png


BIN
assets/redoDisabled2.png


BIN
assets/restart.png


BIN
assets/sounds/wrongBuzz.mp3


+ 0 - 0
assets/strokedDisks/index.html


BIN
assets/undo2.png


BIN
assets/undoDisabled2.png


BIN
assets/wrongMove.png


+ 16 - 0
css/styles.css

@@ -0,0 +1,16 @@
+.cDiscos{
+  position: absolute;
+  margin-left: 90%;
+  margin-top: 2%;
+  height: 0.5%;
+  width: 2%;
+}
+
+.button{
+  position: absolute;
+  margin-left: 70%;
+  margin-top: 2%;
+  font-size: 80%;
+  width: 9%;
+  text-align: center;
+}

+ 14 - 0
ilm-application.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<application xmlns="http://line.ime.usp.br/application/1.5">
+  <name>iHanoi</name>
+  <url>http://www.matematica.br/ihanoi</url>
+  <version>2</version>
+  <type>HTML5</type>
+  <description>{"en":"The Objective to move N discs from stick A to C, following some rule (from the game Towers of Hanoi)","pt_br":"O objetivo é mover N discos da haste A para C, seguindo algumas regras (implementa o jogo Torres de Hanói)"}</description>
+  <extension>ihn</extension>
+  <file_jar>iHanoi</file_jar>
+  <file_class>iHanoi/index.html</file_class>
+  <width>800</width>
+  <height>600</height>
+  <evaluate>1</evaluate>
+</application>

+ 9 - 4
index.html

@@ -1,19 +1,24 @@
 <!doctype html>
 <html lang="en">
+
 <head>
     <meta charset="UTF-8" />
     <title>iHanoi</title>
-    <script src="http://cdn.jsdelivr.net/npm/phaser@3.16.2/dist/phaser.js"></script>
+    <script src="https://cdn.jsdelivr.net/npm/phaser@3.16.2/dist/phaser.js"></script>
+    <script src="https://code.jquery.com/jquery-3.4.1.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>
     <style type="text/css">
         body {
             margin: 0;
         }
     </style>
+    <link rel='stylesheet' type='text/css' href='./css/styles.css'>
 </head>
+
 <body>
 
-  <script src="js/iHanoiFunctions.js"></script>
-  <script src="js/phaserConfig.js"></script>
+    <script src="js/iHanoiFunctions.js"></script>
+    <script src="js/phaserConfig.js"></script>
 
 </body>
-</html>
+
+</html>

+ 230 - 166
js/iHanoiFunctions.js

@@ -1,190 +1,254 @@
-var isMoving = false, diskOrigin, diskDestiny, movements;
+var isMoving = false,
+    diskOrigin, diskDestiny, movements;
 var nWrongMoves = 0;
-var moves = [], totalMoves = []; //vector to save movements
-var acertou=0;
+var moves = [],
+    totalMoves = []; //vector to save movements
+var acertou = 0;
 var optimalSolution;
-var redo = false, undo = false;
-var textDict = {disk0: "stroked0",
-								disk1: "stroked1",
-								disk2: "stroked2",
-								disk3: "stroked3",
-								disk4: "stroked4",
-								disk5: "stroked5",
-								stroked0: "disk0",
-								stroked1: "disk1",
-								stroked2: "disk2",
-								stroked3: "disk3",
-								stroked4: "disk4",
-								stroked5: "disk5"}
+var redo = false,
+    undo = false;
+var textDict = {
+    disk0: "stroked0",
+    disk1: "stroked1",
+    disk2: "stroked2",
+    disk3: "stroked3",
+    disk4: "stroked4",
+    disk5: "stroked5",
+    stroked0: "disk0",
+    stroked1: "disk1",
+    stroked2: "disk2",
+    stroked3: "disk3",
+    stroked4: "disk4",
+    stroked5: "disk5"
+};
+
+var wrongBuzz = new Audio('assets/sounds/wrongBuzz.mp3');
+//freesounds.org
+
 //To know which tower was selected
-function getTower (id){
-	switch(id){
-		case 0:
-			return towerA;
-		case 1:
-			return towerB;
-		case 2:
-			return towerC;
-	}
+function getTower(id) {
+    switch (id) {
+        case 0:
+            return towerA;
+        case 1:
+            return towerB;
+        case 2:
+            return towerC;
+    }
+}
+
+function selectA() {
+    if (!isMoving) {
+        if (towerA.length > 0) {
+            diskOrigin = 0;
+            isMoving = true;
+            towerA[towerA.length - 1].setTexture(textDict[towerA[towerA.length - 1].texture.key]);
+        }
+    } else {
+        if (diskOrigin != 0) {
+            moveFromTo(diskOrigin, 0);
+        } else {
+            towerA[towerA.length - 1].setTexture(textDict[towerA[towerA.length - 1].texture.key]);
+            isMoving = false;
+            nMoves.text++;
+        }
+    }
 }
 
-function selectA (){
-  if (!isMoving){
-    if(towerA.length>0){
-      diskOrigin = 0;
-      isMoving = true;
-      towerA[towerA.length-1].setTexture(textDict[towerA[towerA.length-1].texture.key]);
+function selectB() {
+    if (!isMoving) {
+        if (towerB.length > 0) {
+            diskOrigin = 1;
+            isMoving = true;
+            towerB[towerB.length - 1].setTexture(textDict[towerB[towerB.length - 1].texture.key]);
+        }
+    } else {
+        if (diskOrigin != 1) {
+            moveFromTo(diskOrigin, 1);
+        } else {
+            towerB[towerB.length - 1].setTexture(textDict[towerB[towerB.length - 1].texture.key]);
+            isMoving = false;
+            nMoves.text++;
+        }
     }
-  } else{
-    if(diskOrigin!=0){
-      moveFromTo(diskOrigin, 0);
-    } else{
-      towerA[towerA.length-1].setTexture(textDict[towerA[towerA.length-1].texture.key]);
-      isMoving=false;
-			nMoves.text++;
+}
+
+function selectC() {
+    if (!isMoving) {
+        if (towerC.length > 0) {
+            diskOrigin = 2;
+            isMoving = true;
+            towerC[towerC.length - 1].setTexture(textDict[towerC[towerC.length - 1].texture.key]); //levantar o disco
+        }
+    } else {
+        if (diskOrigin != 2) {
+            moveFromTo(diskOrigin, 2);
+        } else {
+            towerC[towerC.length - 1].setTexture(textDict[towerC[towerC.length - 1].texture.key]);
+            isMoving = false;
+            nMoves.text++;
+        }
     }
-  }
 }
 
-function selectB (){
-  if (!isMoving){
-    if(towerB.length>0){
-      diskOrigin = 1;
-      isMoving = true;
-      towerB[towerB.length-1].setTexture(textDict[towerB[towerB.length-1].texture.key]);
+
+function moveFromTo(origin, destiny) {
+    var originTower = getTower(origin),
+        destinyTower = getTower(destiny);
+    var topDiskOrigin = originTower[originTower.length - 1],
+        topDiskDestiny;
+    if (!undo && !redo) {
+        topDiskOrigin.setTexture(textDict[topDiskOrigin.texture.key]);
+    }
+    if (destinyTower.length > 0) {
+        //movement to a tower with a disk in it
+        topDiskDestiny = destinyTower[destinyTower.length - 1];
+        if (topDiskOrigin.displayWidth <= topDiskDestiny.displayWidth) {
+            topDiskOrigin.x += 435 * (destiny - origin);
+            topDiskOrigin.y += 28 * (originTower.length - destinyTower.length - 1);
+            originTower.pop();
+            destinyTower.push(topDiskOrigin);
+            //control variables
+            nMoves.text++;
+            totalMoves.push(origin + "  " + destiny);
+            if (!undo) {
+                //if it is either a redo or a new move we must add new moves to the current sequence for possible 'undos'
+                if (!redo) {
+                    //if it is a new move, we clean all possible "redos"
+                    moves.splice(nCurrentMoves, moves.length - nCurrentMoves);
+                    moves.push(origin + "  " + destiny);
+                }
+                nCurrentMoves++;
+                undoButton.setInteractive({ useHandCursor: true });
+                undoButton.setTexture('undo');
+                if (nCurrentMoves == moves.length) {
+                    redoButton.disableInteractive();
+                    redoButton.setTexture('redoDisabled');
+                }
+                redo = false;
+            } else {
+                nCurrentMoves--;
+                undo = false;
+                redoButton.setInteractive({ useHandCursor: true });
+                redoButton.setTexture('redo');
+                if (nCurrentMoves == 0) {
+                    undoButton.disableInteractive();
+                    undoButton.setTexture('undoDisabled');
+                }
+            }
+        } else {
+            invalidMovement(destiny);
+        }
+    } else {
+        //move to a tower without a disk in it
+        topDiskOrigin.x += 435 * (destiny - origin);
+        topDiskOrigin.y += 28 * (originTower.length - destinyTower.length - 1);
+        originTower.pop();
+        destinyTower.push(topDiskOrigin);
+        //control variables
+        nMoves.text++;
+        totalMoves.push(origin + "  " + destiny);
+        if (!undo) {
+            //if it is either a redo or a new move we must add new moves to the current sequence for possible 'undos'
+            if (!redo) {
+                //if it is a new move, we clean all possible "redos" and add the new move to the list
+                moves.splice(nCurrentMoves, moves.length - nCurrentMoves);
+                moves.push(origin + "  " + destiny);
+            }
+            nCurrentMoves++;
+            if (nCurrentMoves == moves.length) {
+                redoButton.disableInteractive();
+                redoButton.setTexture('redoDisabled');
+            }
+            undoButton.setInteractive({ useHandCursor: true });
+            undoButton.setTexture('undo');
+            redo = false;
+        } else {
+            nCurrentMoves--;
+            undo = false;
+            redoButton.setInteractive({ useHandCursor: true });
+            redoButton.setTexture('redo');
+            if (nCurrentMoves == 0) {
+                undoButton.disableInteractive();
+                undoButton.setTexture('undoDisabled');
+            }
+        }
     }
-  } else{
-    if(diskOrigin!=1){
-      moveFromTo(diskOrigin, 1);
-    } else{
-      towerB[towerB.length-1].setTexture(textDict[towerB[towerB.length-1].texture.key]);
-      isMoving=false;
-			nMoves.text++;
+    movements += origin + " " + destiny + "\n"
+    isMoving = false;
+    if (towerC.length == diskQntity) {
+        if (nMoves.text == minimumMoves) {
+            gameWonMsg.text = "Você terminou de mover a torre com o menor \n número de movimentos possivel " + nMoves.text + "!!";
+        } else {
+            gameWonMsg.text = "Você terminou de mover a torre em " + nMoves.text + " movimentos!!\n O minimo eram " + minimumMoves + " movimentos";
+        }
+    } else {
+        gameWonMsg.text = '';
     }
-  }
 }
 
-function selectC (){
-  if (!isMoving){
-    if(towerC.length>0){
-      diskOrigin = 2;
-      isMoving = true;
-      towerC[towerC.length-1].setTexture(textDict[towerC[towerC.length-1].texture.key]); //levantar o disco
+function redoMove() {
+    if (nCurrentMoves < moves.length) {
+        var res = moves[nCurrentMoves].split("  ");
+        redo = true;
+        moveFromTo(parseInt(res[0]), parseInt(res[1]));
+        if (nCurrentMoves == moves.length) redoButton.setInteractive({ useHandCursor: false });
     }
-  } else{
-    if(diskOrigin!=2){
-      moveFromTo(diskOrigin, 2);
-    } else{
-      towerC[towerC.length-1].setTexture(textDict[towerC[towerC.length-1].texture.key]);
-      isMoving=false;
-			nMoves.text++;
+}
+
+function undoMove() {
+    if (nCurrentMoves > 0) {
+        var res = moves[nCurrentMoves - 1].split("  ");
+        undo = true;
+        moveFromTo(parseInt(res[1]), parseInt(res[0]));
+        if (nCurrentMoves == 0) undoButton.setInteractive({ useHandCursor: false });
+        redoButton.setInteractive({ useHandCursor: true });
     }
-  }
 }
 
+function destroyDisks(torre) {
+    for (var i = 0; i < torre.length; i++) {
+        torre[i].destroy();
+    }
+    torre.splice(0, torre.length);
+}
 
-function  moveFromTo (origin, destiny){
-  var originTower = getTower(origin), destinyTower = getTower(destiny);
-  var topDiskOrigin = originTower[originTower.length-1], topDiskDestiny;
-	if (!undo && !redo)	{
-		topDiskOrigin.setTexture(textDict[topDiskOrigin.texture.key]);
-	}
-  if (destinyTower.length>0){
-		//movement to a tower with a disk in it
-    topDiskDestiny = destinyTower[destinyTower.length-1];
-    if(topDiskOrigin.displayWidth<=topDiskDestiny.displayWidth){
-			topDiskOrigin.x += 435*(destiny-origin);
-			topDiskOrigin.y += 28*(originTower.length-destinyTower.length-1);
-			originTower.pop();
-			destinyTower.push(topDiskOrigin);
-			//control variables
-			nMoves.text++;
-			totalMoves.push(origin+"  "+destiny);
-			if (!undo){
-				//if it is either a redo or a new move we must add new moves to the current sequence for possible 'undos'
-				if(!redo){
-					//if it is a new move, we clean all possible "redos"
-					moves.splice(nCurrentMoves, moves.length- nCurrentMoves);
-					moves.push(origin+"  "+destiny);
-				}
-				nCurrentMoves++;
-				undoButton.setInteractive({useHandCursor: true});
-				undoButton.setTexture('undo');
-				if(nCurrentMoves==moves.length){
-					redoButton.disableInteractive();
-					redoButton.setTexture('redoDisabled');
-				}
-				redo=false;
-			}else{
-				nCurrentMoves--;
-				undo=false;
-				redoButton.setInteractive({useHandCursor: true});
-				redoButton.setTexture('redo');
-				if(nCurrentMoves==0){
-					undoButton.disableInteractive();
-					undoButton.setTexture('undoDisabled');
-				}
-			}
+function restart(n = 0) {
+    if (n > 0) diskQntity = n;
+    restartVariables();
+    var diskX = 220,
+        diskY = 430;
+    for (var i = diskQntity - 1; i >= 0; i--) {
+        towerA[diskQntity - 1 - i] = scene.add.sprite(diskX, diskY, 'disk' + i).setScale(0.13); //.setDisplaySize(diskWidth, diskHeight);
+        diskY -= 28;
     }
-  }else{
-		//move to a tower without a disk in it
-    topDiskOrigin.x += 435*(destiny-origin);
-		topDiskOrigin.y += 28*(originTower.length-destinyTower.length-1);
-		originTower.pop();
-		destinyTower.push(topDiskOrigin);
-		//control variables
-		nMoves.text++;
-		totalMoves.push(origin+"  "+destiny);
-		if (!undo){
-			//if it is either a redo or a new move we must add new moves to the current sequence for possible 'undos'
-			if(!redo){
-				//if it is a new move, we clean all possible "redos" and add the new move to the list
-				moves.splice(nCurrentMoves, moves.length- nCurrentMoves);
-				moves.push(origin+"  "+destiny);
-			}
-			nCurrentMoves++;
-			if(nCurrentMoves==moves.length){
-				redoButton.disableInteractive();
-				redoButton.setTexture('redoDisabled');
-			}
-			undoButton.setInteractive({useHandCursor: true});
-			undoButton.setTexture('undo');
-			redo=false;
-		}else{
-			nCurrentMoves--;
-			undo=false;
-			redoButton.setInteractive({useHandCursor: true});
-			redoButton.setTexture('redo');
-			if(nCurrentMoves==0){
-				undoButton.disableInteractive();
-				undoButton.setTexture('undoDisabled');
-			}
-		}
-  }
-	movements+=origin+" "+destiny+"\n"
-  isMoving=false;
-	if (towerC.length == diskQntity){
-		gameWonMsg.text = "Você terminou de mover a torre!!! Parabéns!!"
-	}else{
-		gameWonMsg.text ='';
-	}
 }
 
-function redoMove(){
-	if (nCurrentMoves < moves.length){
-		var res = moves[nCurrentMoves].split("  ");
-		redo=true;
-		moveFromTo(parseInt(res[0]), parseInt(res[1]));
-		if(nCurrentMoves==moves.length) redoButton.setInteractive({useHandCursor: false});
-	}
+function restartVariables() {
+    destroyDisks(towerA);
+    destroyDisks(towerB);
+    destroyDisks(towerC);
+    isMoving = false;
+    moves.splice(0, moves.length);
+    nCurrentMoves = 0;
+    minimumMoves = Math.pow(2, diskQntity) - 1;
 }
 
-function undoMove(){
-	if(nCurrentMoves>0){
-		var res = moves[nCurrentMoves-1].split("  ");
-		undo=true;
-		moveFromTo(parseInt(res[1]), parseInt(res[0]));
-		if(nCurrentMoves==0) undoButton.setInteractive({useHandCursor: false});
-		redoButton.setInteractive({useHandCursor: true});
-	}
+function selectDisks(qntity, game) {
+    diskQntity = qntity;
+    restartVariables();
+    game.scene.start('sceneGame');
+
 }
+
+
+function invalidMovement(torre) {
+    wrongMoveSprite.setX(220 + torre * 435);
+    wrongBuzz.play();
+    wrongMoveSprite.setAlpha(1);
+    scene.time.delayedCall(1000, hideX, [], scene);
+}
+
+function hideX() {
+    wrongMoveSprite.setAlpha(0);
+}

+ 108 - 0
js/integration-functions.js

@@ -0,0 +1,108 @@
+// Função para ler parâmetros informados pelo iTarefa via URL
+// Apesar de não ser obrigatório, será muito útil para capturar os parâmetros
+function getParameterByName(name) {
+    var match = RegExp('[?&]' + name + '=([^&]*)').exec(window.location.search);
+    return match ? decodeURIComponent(match[1].replace(/\+/g, ' ')) : null;
+}
+
+// Criando um array com os parâmetros informados pelo iTarefa
+// Observe que para cada parâmetro, é realizada a chamada do método getParameterByName, implementado acima
+var iLMparameters = {
+    iLM_PARAM_ServerToGetAnswerURL: getParameterByName("iLM_PARAM_ServerToGetAnswerURL"),
+    iLM_PARAM_SendAnswer: getParameterByName("iLM_PARAM_SendAnswer"),
+    iLM_PARAM_AssignmentURL: getParameterByName("iLM_PARAM_AssignmentURL"),
+    iLM_PARAM_Assignment: getParameterByName("iLM_PARAM_Assignment"),
+    lang: getParameterByName("lang")
+};
+
+// Função chamada pelo iTarefa quando o professor finaliza a criação da atividade
+// ou quando o aluno finaliza a resolução do exercício
+// O retorno é um JSON com os dados do exercício ou da resolução
+// Esse retorno será armazenado no banco de dados do Moodle, pelo iTarefa
+function getAnswer() {
+    // Se o parâmetro "iLM_PARAM_SendAnswer" for false,
+    // então trata-se de resolução de atividade
+    if (iLMparameters.iLM_PARAM_SendAnswer == 'false') {
+        // Montar o retorno da resposta do aluno
+        var studentAnswer = "Numero de discos: " + diskQntity + " \nQuantidade de Movimentos: " + nMoves.text + " \nMovimentos:";
+        for (var i = 0; i < totalMoves.length; i++) {
+            studentAnswer += "\n" + totalMoves[i];
+        }
+        return teacherReturn;
+    } else { //se for o professor acessando, mostra a pagina de elaboração
+        return "Número de Discos: " + diskQntity;
+    }
+}
+
+// Função chamada pelo iTarefa para receber a nota do aluno na atividade
+// O retorno é um valor entre 0.0 e 1.0
+function getEvaluation() {
+    if (iLMparameters.iLM_PARAM_SendAnswer == 'false') {
+
+        // Cálculo da nota: resposta correta = 1, errada = 0
+        var nota;
+        if (towerC.length == diskQntity) nota = 1;
+        else nota = 0;
+        /*  Para fazer nota proporcional descomente as 3 linhas abaixo
+        nota=nMoves.text/(Math.pow(2,diskQntity)-1);
+        if (towerB.length==diskQntity) nota *= 0.8;
+        else if(!towerC.length==diskQntity) nota=0;*/
+
+        // A chamada do método abaixo é obrigatória!
+        // Observe que a chamada parte do iLM para o iTarefa
+        parent.getEvaluationCallback(nota);
+    }
+}
+
+
+// Função para que o iMA leia os dados da atividade fornecidos pelo iTarefa
+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
+        res = d.split(" ");
+        console.log(res[3]);
+
+        setQntityDisks(parseInt(res[3]));
+        //andar até o estado do ultimo envio
+        if (res.length > 4) {
+            res = d.split(/[\r]?\n/);
+            for (i = 3; i < res.length; i++) {
+                var mv = res[i].split(" ");
+                redo = 1; //previne de mudar a textura do disco
+                moveFromTo(parseInt(mv[0]), parseInt(mv[2]));
+            }
+        }
+    });
+}
+
+// Adicionamos a diretiva .ready(), para que quando a página HTML estiver carregada,
+// seja verificado qual a visualização deve ser apresentada: se a área de construção
+// de atividade ou de resolução. E no caso de ser resolução, os dados da atividade
+// precisam ser consultados, pelo método implementado acima, o 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
+    if (iLMparameters.iLM_PARAM_SendAnswer == 'false') {
+        //abre a resolução da atividade
+        //pode ser tanto o prof quanto o aluno
+        $('.task').css("display", "block");
+        getiLMContent();
+    } else {
+        // Caso não esteja em modo de resolução de atividade, a visualização no momento
+        // é 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;
+        }
+    }
+}

File diff suppressed because it is too large
+ 2 - 0
js/jquery-3.3.1.min.js


+ 170 - 90
js/phaserConfig.js

@@ -1,104 +1,184 @@
+var towerA = [],
+    towerB = [],
+    towerC = [];
+var diskQntity = 3,
+    nMoves, nCurrentMoves = 0,
+    minimumMoves = Math.pow(2, diskQntity) - 1;
+var textsFont = { fontFamily: 'Arial', fontSize: 50, color: '#000000' };
+var gameWonMsg, nMoves;
+var redoButton, undoButton, restartButton, diskSelectorButton;
+var scene, tween;
+var wrongMoveSprite;
+class sceneGame extends Phaser.Scene {
+    constructor() {
+        super({ key: 'sceneGame' });
+    }
 
-    var config = {
-        type: Phaser.AUTO,
-        scale:{
-          mode: Phaser.Scale.FIT,
-          width: 1320,
-          height: 600
-        },
-        scene: {
-            preload: preload,
-            create: create,
-            update: update
+    preload() {
+        scene = this;
+        this.load.image('sky', 'assets/sky.png');
+        this.load.image('acoesBox', 'assets/acoes.png');
+        //this.load.image('base', 'assets/baseText.png');
+        this.load.image('torre', 'assets/torre.png');
+        this.load.image('selectionArea', 'assets/selectionArea.png');
+        //buttons
+        this.load.image('redo', 'assets/redo2.png');
+        this.load.image('redoDisabled', 'assets/redoDisabled2.png');
+
+
+        this.load.image('undo', 'assets/undo2.png');
+        this.load.image('undoDisabled', 'assets/undoDisabled2.png');
+
+        this.load.image('restart', 'assets/restart.png');
+
+        this.load.image('wrongMove', 'assets/wrongMove.png');
+
+        //Only loads disk selection if its the teacher using
+        try {
+            if (iLMparameters.iLM_PARAM_SendAnswer == 'true')
+                this.load.image('diskSelector', 'assets/diskSelector.png');
+            console.log("iAssign version");
+        } catch (e) {
+            this.load.image('diskSelector', 'assets/diskSelector.png');
+            console.log("web-version");
         }
-    };
+        //load all imgs needed for the exercise
+        for (var i = 0; i < 6; i++) {
 
-    var game = new Phaser.Game(config);
-    var towerA=[], towerB=[], towerC=[];
-    var diskQntity=3, nMoves, nCurrentMoves=0;
-    var textsFont = { fontFamily: 'Arial', fontSize: 64, color: '#000000' };
-    var gameWonMsg;
-    var redoButton, undoButton;
+            this.load.image('disk' + i, 'assets/disk' + i + '.png')
+            this.load.image('stroked' + i, 'assets/strokedDisks/stroked' + i + '.png')
+        }
+    }
 
-    function preload ()
-    {
-      this.load.image('sky', 'assets/sky.png');
-      //this.load.image('base', 'assets/baseText.png');
-      this.load.image('torre','assets/torre.png');
-      this.load.image('selectionArea', 'assets/selectionArea.png');
-      //buttons
-      this.load.image('redo', 'assets/redo.png');
-      this.load.image('redoDisabled', 'assets/redoDisabled.png');
+    create() {
+        //misc
+        this.add.image(0, 0, 'sky').setOrigin(0).setDisplaySize(1320, 600);
 
 
-      this.load.image('undo', 'assets/undo.png');
-      this.load.image('undoDisabled', 'assets/undoDisabled.png');
+        this.add.sprite(120, 90, 'acoesBox').setDisplaySize(80, 70);
+        nMoves = this.add.text(90, 70, 0, textsFont);
 
+        this.add.text(120, 520, 'Torre A', textsFont);
+        this.add.text(555, 520, 'Torre B', textsFont);
+        this.add.text(990, 520, 'Torre C', textsFont);
+        gameWonMsg = this.add.text(300, 150, '', { fontFamily: 'Arial', fontSize: 36, color: '#00ef00', align: 'center' });
 
-      //load all imgs needed for the exercise
-      for (var i = 0; i < diskQntity; i++) {
+        //buttons
+        redoButton = this.add.sprite(720, 90, 'redoDisabled').setDisplaySize(80, 70); //.setInteractive({useHandCursor: false});
+        redoButton.on('pointerdown', function(pointer) {
+            redoMove();
+        });
+        undoButton = this.add.sprite(600, 90, 'undoDisabled').setDisplaySize(80, 70); //.setInteractive({useHandCursor: false});
+        undoButton.on('pointerdown', function(pointer) {
+            undoMove();
+        });
 
-        this.load.image('disk'+i, 'assets/disk'+i+'.png')
-        this.load.image('stroked'+i, 'assets/strokedDisks/stroked'+i+'.png')
-      }
-    }
+        restartButton = this.add.sprite(990, 90, 'restart').setDisplaySize(80, 60).setInteractive({ useHandCursor: true });
+        restartButton.on('pointerdown', function(pointer) {
+            restart();
+        });
+
+        diskSelectorButton = this.add.sprite(1200, 90, 'diskSelector').setDisplaySize(80, 70).setInteractive({ useHandCursor: true });
+        diskSelectorButton.on('pointerdown', function(pointer) {
+            this.scene.start('sceneDiskSelection');
+        }, this);
+
+
+        //Towers
+        this.add.image(220, 320, 'torre').setScale(0.13);
+        this.add.image(655, 320, 'torre').setScale(0.13);
+        this.add.image(1090, 320, 'torre').setScale(0.13);
+
+        //Disks
+        var diskX = 220,
+            diskY = 430;
+        for (var i = diskQntity - 1; i >= 0; i--) {
+            towerA[diskQntity - 1 - i] = this.add.sprite(diskX, diskY, 'disk' + i).setScale(0.13); //.setDisplaySize(diskWidth, diskHeight);
+            diskY -= 28;
+        }
+
+        //towerA Selection Area
+        var towerASelectionArea = this.add.sprite(220, 375, 'selectionArea').setDisplaySize(400, 320).setInteractive({ useHandCursor: true });
+        towerASelectionArea.on('pointerdown', function(pointer) {
+            selectA();
+
+        });
+
+        //towerB selectionArea
+        var towerBSelectionArea = this.add.sprite(655, 375, 'selectionArea').setDisplaySize(400, 320).setInteractive({ useHandCursor: true });
+        towerBSelectionArea.on('pointerdown', function(pointer) {
+            selectB();
+        });
 
-    function create ()
-    {
-      this.add.image(0,0,'sky').setOrigin(0).setDisplaySize(1320,600);
-      //Texts
-      this.add.text(20,20,'Movimentos:' ,textsFont);
-      nMoves = this.add.text(390,20,0 ,textsFont);
-      this.add.text(120,520,'Torre A' ,textsFont);
-      this.add.text(555,520,'Torre B' ,textsFont);
-      this.add.text(990,520,'Torre C' ,textsFont);
-      gameWonMsg = this.add.text(20,150,'',{ fontFamily: 'Arial', fontSize: 64, color:'#00ef00' });
-
-      //buttons
-      redoButton = this.add.sprite(695, 100, 'redoDisabled').setDisplaySize(60,60)//.setInteractive({useHandCursor: false});
-        redoButton.on('pointerdown', function(pointer){
-          redoMove();
+        var towerCSelectionArea = this.add.sprite(1090, 375, 'selectionArea').setDisplaySize(400, 320).setInteractive({ useHandCursor: true });
+        towerCSelectionArea.on('pointerdown', function(pointer) {
+            selectC();
         });
-      undoButton = this.add.sprite(625, 100, 'undoDisabled').setDisplaySize(60,60)//.setInteractive({useHandCursor: false});
-      undoButton.on('pointerdown', function(pointer){
-        undoMove();
-      });
-      //Towers
-      this.add.image(220,320,'torre').setScale(0.13);
-      this.add.image(655,320,'torre').setScale(0.13);
-      this.add.image(1090,320,'torre').setScale(0.13);
-
-      //Disks
-      var diskX=220, diskY=430;
-      for (var i = diskQntity-1; i >=0; i--) {
-        towerA[diskQntity-1-i]= this.add.sprite(diskX,diskY,'disk'+i).setScale(0.13);//.setDisplaySize(diskWidth, diskHeight);
-        diskY -= 28;
-      }
-
-      //towerA Selection Area
-     var towerASelectionArea = this.add.sprite(220, 375, 'selectionArea').setDisplaySize(400,320).setInteractive({useHandCursor: true});
-     towerASelectionArea.on('pointerdown', function (pointer) {
-       selectA();
-
-    });
-
-    //towerB selectionArea
-    var towerBSelectionArea = this.add.sprite(655, 375, 'selectionArea').setDisplaySize(400,320).setInteractive({useHandCursor: true});
-    towerBSelectionArea.on('pointerdown', function (pointer) {
-      selectB();
-   });
-
-   var towerCSelectionArea = this.add.sprite(1090, 375, 'selectionArea').setDisplaySize(400,320).setInteractive({useHandCursor: true});
-   towerCSelectionArea.on('pointerdown', function (pointer) {
-     selectC();
-  });
-
-
-  }
-
-    function update ()
-    {
+
+
+
+        wrongMoveSprite = this.add.sprite(220, 300, 'wrongMove').setDisplaySize(100, 100).setAlpha(0);
     }
-    function event() {
+
+    update() {}
+    event() {
         console.log('over');
     }
+}
+
+
+class sceneDiskSelection extends Phaser.Scene {
+    constructor() {
+        super({ key: 'sceneDiskSelection' });
+    }
+
+    preload() {
+        this.load.image('sixDisks', 'assets/diskSelection/sixDisks.png');
+        this.load.image('fiveDisks', 'assets/diskSelection/fiveDisks.png');
+        this.load.image('fourDisks', 'assets/diskSelection/fourDisks.png');
+        this.load.image('threeDisks', 'assets/diskSelection/threeDisks.png');
+        this.load.image('twoDisks', 'assets/diskSelection/twoDisks.png');
+    }
+
+    create() {
+        this.add.image(0, 0, 'sky').setOrigin(0).setDisplaySize(1320, 600);
+
+        var sixDisksButton = this.add.sprite(850, 450, 'sixDisks').setDisplaySize(200, 200).setInteractive({ useHandCursor: true });
+        sixDisksButton.on('pointerdown', function(pointer) {
+            selectDisks(6, this);
+        }, this);
+
+        var fiveDisksButton = this.add.sprite(450, 450, 'fiveDisks').setDisplaySize(200, 200).setInteractive({ useHandCursor: true });
+        fiveDisksButton.on('pointerdown', function(pointer) {
+            selectDisks(5, this);
+        }, this);
+
+        var fourDisksButton = this.add.sprite(1050, 200, 'fourDisks').setDisplaySize(200, 200).setInteractive({ useHandCursor: true });
+        fourDisksButton.on('pointerdown', function(pointer) {
+            selectDisks(4, this);
+        }, this);
+
+        var threeDisksButton = this.add.sprite(650, 200, 'threeDisks').setDisplaySize(200, 200).setInteractive({ useHandCursor: true });
+        threeDisksButton.on('pointerdown', function(pointer) {
+            selectDisks(3, this);
+        }, this);
+
+        var twoDisksButton = this.add.sprite(250, 200, 'twoDisks').setDisplaySize(200, 200).setInteractive({ useHandCursor: true });
+        twoDisksButton.on('pointerdown', function(pointer) {
+            selectDisks(2, this);
+        }, this);
+    }
+}
+
+var config = {
+    type: Phaser.AUTO,
+    scale: {
+        mode: Phaser.Scale.FIT,
+        width: 1320,
+        height: 600
+    },
+    scene: [sceneGame, sceneDiskSelection]
+        //  canvas: doocument.querySelector('mainDiv');
+};
+
+var game = new Phaser.Game(config);