11498 sujets

JavaScript, DOM et API Web HTML5

Bonjour à Tous,
dans le cadre institutionnel, j'ai mis en place un script pédagogique pour introduire la notion de robot autonome.
Dans l'idée, l'utilisateur se retrouve devant un labyrinthe,
il doit construire un robot adapté à un contexte,
il passe par 4 étapes :
- le choix du capteur de couleur (jaune ou bleu)
- le déplacement d'obstacle (vert ou rose)
- le super saut (au dessus d'un obstacle jaune ou bleu)
- une téléportation (entre des marqueurs rose ou vert)
Heu.. n'essayez pas forcément de comprendre ce passage, ça prend du sens devant l'illustration.

Mon problème se situe quand je donne la possibilité à l'utilisateur de recommencer le jeu quand il n'arrive pas à trouver la solution.
En fait, à chaque nouvelle tentative, les derniers paramètres sont répétés une fois supplémentaire.
Je m'explique, si l'utilisateur essaye pour la troisième fois (il a donc pressé 2fois le bouton "recommencer"), le "robot" va exécuter 3 fois la dernière configuration (capteur de couleur, déplacement d'obstacle...).

Comment faire pour éviter cette répétition ?
Je vous remercie pour vos lumières


$(function() {
    robotAutonome ();
    function robotAutonome () {
    // drag and drop
        $( ".ligneBleue, .ligneJaune, .sphereRose, .sphereVerte" ).draggable({ revert: "invalid" });
        $( ".programme" ).droppable({
            accept: ".ligneBleue, .ligneJaune",
            drop: function( event, ui ) {
// premier drag & drop
                $(".programme").append($(ui.draggable)).addClass("capteur-"+ui.draggable.attr("class"))
                $(ui.draggable).replaceWith($(ui.draggable).html()+ui.draggable.attr("data-original-title")+"<hr/>"); 
                $(".capteurs").fadeOut(300);
                $(".obstacles").fadeIn(1500);
                $( ".obstacleJaune, .obstacleBleu" ).draggable({ revert: "invalid" });
                $( ".programme" ).droppable({
                    accept: ".obstacleJaune, .obstacleBleu",
                    drop: function( event, ui ) {
// second drag & drop
                        $(".programme").append($(ui.draggable)).addClass("capteur-"+ui.draggable.attr("class"))
                        $(ui.draggable).replaceWith($(ui.draggable).html()+ui.draggable.attr("data-original-title")+"<hr/>"); 
                        $(".obstacles").fadeOut(300);
                        $(".spheres").fadeIn(1500);
                        $( ".programme" ).droppable({
                            accept: ".sphereRose, .sphereVerte",
                            drop: function( event, ui ) {
// troisième drag & drop
                                $(".programme").append($(ui.draggable)).addClass("capteur-"+ui.draggable.attr("class"))
                                $(ui.draggable).replaceWith($(ui.draggable).html()+ui.draggable.attr("data-original-title")+"<hr/>");                        
                                $(".spheres").fadeOut(300);
                                $(".murs").fadeIn(1500);
                                $( ".murVert, .murRose" ).draggable({ revert: "invalid" });
                                $( ".programme" ).droppable({
                                    accept: ".murRose, .murVert",
                                    drop: function( event, ui ) {
// dernier drag & drop
$(".programme").append($(ui.draggable)).addClass("capteur-"+ui.draggable.attr("class"))
                                        $(ui.draggable).replaceWith($(ui.draggable).html()+ui.draggable.attr("data-original-title")); 
                                        $(".murs").fadeOut();
                                        $(".briquesProgramme").fadeOut(300);
                                        $(".generateurRobot").fadeIn(1500);
                                        robotHeight = $(".jeu2 [class^=robot-]").height()
                                        robotWidth = $(".jeu2 [class^=robot-]").width()
// on génère le robot
                                        $(".generateurRobot").click(function () {                                                                  
                                            if ($(".programme").hasClass("capteur-ligneBleue") && $(".programme").hasClass("capteur-obstacleJaune") && $(".programme").hasClass("capteur-sphereRose") && $(".programme").hasClass("capteur-murVert") ) {
                                                $(".robot-bJRV").fadeIn();
                                                $(".executer").fadeIn(1500);
                                                coordonnees("b",21);
                                            };
                                            if ($(".programme").hasClass("capteur-ligneJaune") && $(".programme").hasClass("capteur-obstacleBleu") && $(".programme").hasClass("capteur-sphereVerte") && $(".programme").hasClass("capteur-murRose") ) {
                                                $(".robot-jBVR").fadeIn();
                                                $(".executer").fadeIn(1500);
                                                coordonnees("j",22);
                                            };
                                            if ($(".programme").hasClass("capteur-ligneJaune") && $(".programme").hasClass("capteur-obstacleJaune") && $(".programme").hasClass("capteur-sphereRose") && $(".programme").hasClass("capteur-murRose") ) {
                                                $(".robot-jJRR").fadeIn();
                                                $(".executer").fadeIn(1500);
                                                coordonnees("j",6);
                                            };
                                            if ($(".programme").hasClass("capteur-ligneJaune") && $(".programme").hasClass("capteur-obstacleJaune") && $(".programme").hasClass("capteur-sphereVerte") && $(".programme").hasClass("capteur-murVert") ) {
                                                $(".robot-jJVV").fadeIn();
                                                $(".executer").fadeIn(1500);
                                                coordonnees("j",5);
                                            };           
// j'ai réduit la liste pour le post sur ce forum car il y a 16 combinaisons possibles                             
                                        })
                                    }    
                                })    
                            }
                        });
                    }
                });
            }
        });
    }
// cette fonction permet d établir l itinéraire du robot en fonction de ses paramètres
    function coordonnees(parcours, nbCheckpoints) {
        $(".executer").click(function () {
            for (var i = 0; i < nbCheckpoints; i++) {
                // on recupere les coordonnees x et y
                divsCheckPosition = $(".checkPoint-"+parcours+"-" + i).position();
                $(".jeu2 [class^=robot-]").animate({
                    "left": divsCheckPosition.left - robotHeight/2.2,
                    "top": divsCheckPosition.top - robotWidth/2.2
                }, 1000);
// si les checkpoints valent 6, cela veut dire que la couleur du téléporteur n est pas bonne, le robot prend donc un mauvais itinéraire
                if (nbCheckpoints == 6) {
                    setTimeout(function() { 
                        badCheckPosition = $(".badCheckPoint-"+parcours).position();
                        $(".jeu2 [class^=robot-]").animate({
                            "left": badCheckPosition.left - robotHeight/2.2,
                            "top": badCheckPosition.top - robotWidth/2.2
                        }, 1000);
                    }, 5000);
                };
            }
// la bonne combinaison est équivalente à 22 checkPoints franchis. Si ce n'est pas le cas, je donne la possibilité à l'utilisateur de recommencer
            if (nbCheckpoints != 22) {
                $("#scNu-a-1 .restart").fadeIn();
                $("#scNu-a-1 .jeu2 .restart").click(function () {      
                    $(".jeu2 [class^=robot-]").css("left","7.9%").css("top","45.7%").fadeOut();
                    $(".programme").html('').removeClass().addClass("programme cadreBlanc");
// je vide la div .briquesProgamme car elle est devenue incomplète à cause des drag & drop 
                    $(".briquesProgramme").html('');
// et je la réécris
                    $(".briquesProgramme").html('<h6>Les actions / ou briques de programme</h6><div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 cadreBlanc capteurs"><h6>Capteur de couleur</h6><div class="col-xs-6 col-sm-6 col-md-6 col-lg-6"><a class="ligneBleue" title="" data-placement="bottom" data-toggle="tooltip" data-original-title="Si je vois une ligne bleue, je la suis."><img alt="" src="++resource++unice.medites.images/parcours-pedagogiques/numerique/p1/etape1/ligneBleue.png" /></a></div><div class="col-xs-6 col-sm-6 col-md-6 col-lg-6"><a class="ligneJaune" title="" data-placement="bottom" data-toggle="tooltip" data-original-title="Si je vois une ligne jaune, je la suis."><img alt="" src="++resource++unice.medites.images/parcours-pedagogiques/numerique/p1/etape1/ligneJaune.png" /></a></div></div><div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 cadreBlanc obstacles"><h6>Déplacement d\'obstacle</h6><div class="col-xs-6 col-sm-6 col-md-6 col-lg-6"><a class="obstacleBleu" title="" data-placement="bottom" data-toggle="tooltip" data-original-title="Si je rencontre un obstacle bleu, je saute par dessus."><img alt="" src="++resource++unice.medites.images/parcours-pedagogiques/numerique/p1/etape1/obstacleBleu.png" /></a></div><div class="col-xs-6 col-sm-6 col-md-6 col-lg-6"><a class="obstacleJaune" title="" data-placement="bottom" data-toggle="tooltip" data-original-title="Si je rencontre un obstacle jaune, je saute par dessus."><img alt="" src="++resource++unice.medites.images/parcours-pedagogiques/numerique/p1/etape1/obstacleJaune.png" /></a></div></div><div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 cadreBlanc spheres"><h6>Super saut</h6><div class="col-xs-6 col-sm-6 col-md-6 col-lg-6"><a class="sphereRose" title="" data-placement="bottom" data-toggle="tooltip" data-original-title="Si je rencontre une sphère rose, je stoppe mes précédentes actions pour sauter jusqu\'à la prochaine sphère rose, et ensuite je reprends mes précédentes actions."><img alt="" src="++resource++unice.medites.images/parcours-pedagogiques/numerique/p1/etape1/sphereRose.png" /></a></div><div class="col-xs-6 col-sm-6 col-md-6 col-lg-6"><a class="sphereVerte" title="" data-placement="bottom" data-toggle="tooltip" data-original-title="Si je rencontre une sphère verte, je stoppe mes précédentes actions pour sauter jusqu\'à la prochaine sphère verte, et ensuite je reprends mes précédentes actions."><img alt="" src="++resource++unice.medites.images/parcours-pedagogiques/numerique/p1/etape1/sphereVerte.png" /></a></div></div><div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 cadreBlanc murs"><h6>Mur</h6><div class="col-xs-6 col-sm-6 col-md-6 col-lg-6"><a class="murRose" title="" data-placement="bottom" data-toggle="tooltip" data-original-title="Si je rencontre un mur rose, je passe à travers."><img alt="" src="++resource++unice.medites.images/parcours-pedagogiques/numerique/p1/etape1/murRose.png" /></a></div><div class="col-xs-6 col-sm-6 col-md-6 col-lg-6"><a class="murVert" title="" data-placement="bottom" data-toggle="tooltip" data-original-title="Si je rencontre un mur vert, je passe à travers."><img alt="" src="++resource++unice.medites.images/parcours-pedagogiques/numerique/p1/etape1/murVert.png" /></a></div></div>').fadeIn();
                    parcours = null;
                    nbCheckpoints = null;    
                    robotAutonome();
                })
            }
// si les 22 checkPoints sont franchis, il y a la récompense
            if (nbCheckpoints == 22) {
                $("#scNu-a-1 .jauge").children("li:last-child").addClass("jaugeColor");
                $("#scNu-a-1 li:last-child.jaugeColor").click(function () {
                    $("#great-scNu-a-1b").fadeIn(500);
                })
            }
        });
    }
});

upload/13541-jeu2Parcou.png

PS : je ne suis pas un codeur, j'apprends sur le tas Smiley cligne
Modifié par Guim (14 Oct 2015 - 10:05)
Mdr... j'ai rien compris ^^

upload/60168-AlsaQuirk.png

Ok, j'arrête de plaisanter...
A toute hasard, le problème ne viendrai pas de cette ligne :
$("#scNu-a-1 .jeu2 .restart").click(function () { 

Ou tu ajoute un écouteur a chaque fois que tu exécute la fonction coordonnees().
Peut être faudrait-il que tu modifies ainsi:

$(function() {
    function robotAutonome () {
        // ...
    }
    $("#scNu-a-1 .jeu2 .restart").click(function () {
        // ...
    };
    robotAutonome ();
});


@+
Modifié par Safina (14 Oct 2015 - 13:01)
haha Smiley cligne
mais non, il faut plaisanter, la vie serait trop triste sinon
upload/13541-Sans-titre.jpg

Hormis cela,
j'ai tenté de modifier l'emplacement de la fonction robotAutonome ();
j'ai fait plusieurs tentatives, et je perds mon drag & drop Smiley decu