IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Projet informatique S1 prépa intégrée Algoscript (variante de Javascript)


Sujet :

JavaScript

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2020
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2020
    Messages : 6
    Par défaut Projet informatique S1 prépa intégrée Algoscript (variante de Javascript)
    Bonjour tout le monde, je suis en prépa intégrée en école d'ingé et j'ai un projet d'info à faire sur algoscript (une variante de javascript).
    C'est sûrement très facile pour vous mais je n'ai jamais vraiment programmé avant ça et je suis bloqué.

    Mon projet est un labyrinthe dans lequel on doit trouver la sortie. Le personnage que l'on commande est la tortue graphique, (commandée avec zqsd). J'ai crée un programme stockant les coordonnées de la tortue, et généré le tracé du labyrinthe avec un tableau (0 pour une case noire/mur, et 1 pour une case blanche).
    Mon problème c'est que je n'arrive pas à trouver un moyen d'empêcher la tortue d'entrer dans les cases noires et donc de traverser les murs. J'ai essayé de la déplacer vers l'arrière quand ses coordonnées rencontrent celles des limites des cases noires mais ça ne fonctionne pas et je ne comprends pas pourquoi. Je ne sais pas si quelqu'un içi a le temps et peut regarder mon code et m'aider, merci d'avance !! Le site sur lequel je travaille est https://algoscript.info/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    // Your code here
    var x;
    var y;
    var a;
     
     
    //création de la bordure
    RectanglePlein(0, 0, 1280, 20, 'black');
    RectanglePlein(1260, 20, 20, 110, 'black');
    RectanglePlein(1260, 185, 20, 410, 'black');
    RectanglePlein(0, 0, 20, 595, 'black');
    RectanglePlein(0, 570, 1280, 25, 'black');
     
     
    Deplacer(30, 50); //point de départ
    Lever();
    a = 0;
     
     
    function Keypressed(k) {
     
      if (k == Caractere_vers_Ascii('D')) {
     
        Droite(90);
        a = a + 90;
      }
      if (k == Caractere_vers_Ascii('Q')) {
     
        Gauche(90);
        a = a - 90;
      }
     
     
     
      if (k == Caractere_vers_Ascii('Z')) {
        Avancer(2); //Avance le personnage
        if (a < -360 || a > 360) {
          a = 0;
        }
     
        if (a == 0 || a == 360 || a == -360) { //Actualise les coordonnées du personnage 
          y = y + 2;
        }
        if (a == 180 || a == -180) { //Actualise les coordonnées du personnage 
          y = y - 2;
        }
        if (a == 90 || a == -270) { //Actualise les coordonnées du personnage 
          x = x + 2;
        }
        if (a == 270 || a == -90) { //Actualise les coordonnées du personnage 
          y = y + 2;
        }
      }
     
     
    }
     
    Ecrire(x);
     
    var T = Tableau(10, 18);
    T = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0];
    // T[numéro de ligne (0 à 9)*nombre de caractère par ligne + numéro du caractère(de 0 à 17)]
    Ecrire(T[0 * 18 + 0]); //test du tableau
     
    for (i = 0; i <= 9; i = i + 1) {
      for (j = 0; j <= 17; j = j + 1) {
     
        if (T[i * 18 + j] == 0) {
     
          RectanglePlein(j * 1240 / 18 + 20, i * 55 + 20, 1240 / 18, 55, 'black');
     
     
          if (x == j * 1240 / 18 + 20) {   //Déplacer la tortue vers l'arrière lorqu'elle arrive sur la limite d'un mur
     
            Deplacer(x - 2, y);
     
          }
          if (y == i * 55 + 20) {
     
            Deplacer(x, y - 2);
          }
          if (x == (j+1) * 1240 / 18 + 20) {
     
            Deplacer(x + 2, y);
     
          }
          if (y == (i+1) * 55 + 20) {
     
            Deplacer(x, y + 2);
          }
        }
      }
    }
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 684
    Par défaut
    bonjour,

    un petit rendu serait sympathique;
    et si possible, le reste du code (RectanglePlein()???)

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2020
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2020
    Messages : 6
    Par défaut
    https://algoscript.info/#&togetherjs=sGvC8Gr3Tp Si tout fonctionne correctement, vous aurez accès à un rendu avec ce lien dans "graphic output".
    Le code est écrit en entier. RectanglePlein est une fonction toute faite que l'on nous donne. En effet, algoscript est un javascript simplifié pour l'apprentissage avec des fonctions pré-faites que l'on a juste à utiliser.

  4. #4
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 573
    Par défaut
    vous devez tester si la position future est dans un mur avant de modifier x et y.

    le code suivant gère les cases intérieures, il faut encore rajouter la gestion des collisions sur les bords :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    function Keypressed(k) {
     
      if (k == Caractere_vers_Ascii('D')) {
     
        Droite(90);
        a = a + 90;
      }
     
      if (k == Caractere_vers_Ascii('Q')) {
     
        Gauche(90);
        a = a - 90;
     
      }
     
      if (a < 0) {
        a += 360;
      }
      if (a >= 360) {
        a -= 360;
      }
     
     
     
      if (k == Caractere_vers_Ascii('Z')) {
     
     
        if (a == 0) { //Actualise les coordonnées du personnage 
          if (position_dans_couloir(x, y + 2)) {
            y = y + 2;
            Avancer(2); //Avance le personnage
          }
        }
        if (a == 180) { //Actualise les coordonnées du personnage 
          if (position_dans_couloir(x, y - 2)) {
            y = y - 2;
            Avancer(2); //Avance le personnage
          }
        }
        if (a == 90) { //Actualise les coordonnées du personnage 
          if (position_dans_couloir(x + 2, y)) {
            x = x + 2;
            Avancer(2); //Avance le personnage
          }
        }
        if (a == 270) { //Actualise les coordonnées du personnage 
          if (position_dans_couloir(x - 2, y)) {
            x = x - 2;
            Avancer(2); //Avance le personnage
          }
        }
     
     
      }
     
     
      // debug
      RectanglePlein(60, 640, 200, 80, "white");
      Texte(100, 650, x.toString() + ", " + y.toString() + ", " + a.toString(), "black");
     
     
    }
     
     
    function position_dans_couloir(x, y) {
     
      i = Math.floor((30 - y) / 55);
      j = Math.floor((x + 10) / (1240 / 18));
     
     
      // debug position
      //RectanglePlein(60, 750, 200, 80, "white");
      //Texte(100, 760, i.toString() + ", " + j.toString() + " | " + T[i * 18 + j], "black");
      //
      return (T[i * 18 + j] == 1);
     
    }

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2020
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2020
    Messages : 6
    Par défaut
    Merci beaucoup je vais regarder ça !

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2020
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2020
    Messages : 6
    Par défaut
    Je ne comprends pas bien la fonction "position dans le couloir", que fait la fonction return exactement ?

    En effet, le déplacement (Avancer(2)) ne fonctionne pas lorsque j'appuie sur Z, et "position dans le couloir" en est une condition.
    Comme je ne comprends pas "position dans le couloir", je ne peux pas résoudre le problème du déplacement.

  7. #7
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 573
    Par défaut
    la fonction calcule la position dans le tableau en fonction des coordonnées x et y et elle retournes "true" s'il s'agit d'une case du tableau qui correspond à un couloir.

  8. #8
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 684
    Par défaut
    Rien à voir, mais juste pour donner des idées, j'ai adapté mon laby à ta tortue: http://javatwist.imingo.net/labytortue.htm

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Labytortue</title>
    <style>
    .ligne{justify-content: center;display:flex;margin:0px auto;}
    .bloc{background:white;display:flex;justify-content:center;align-items:center;height:35px;width:35px;border:1px solid;}
    .black{background-color:black}
    .red{background-color:red;}
    #console{text-align:center;}
    .hide{display:none;}
    #plateau{display:flex;justify-content:space-evenly;align-items:center;justify-content:space-evenly;}
    button{margin:20px;}
    </style>
    </head>
    <body>
    <div id="plateau">
    <ul>
    <li>Les points d'entrée et de sortie sont à chaque fois redéfinis.</li>
    <li>Le parcours se fait de haut en bas (très arbitraire...).</li>
    <li>Le trajet de la tortue sera toujours le plus court possible.</li>
    <li>On peut passer d'une zone blanche à une autre dans les 8 directions mais les diagonales sont optionnelles.</li>
    <li>Tu peux transformer la tortue en lièvre en changeant la variable "vitesse".</li>
    <li>S'il n'y a pas d'issue, un nouveau labyrinthe est reconstruit automatiquement.<br />
    </ul>
    <div id="console">
    <button id="go">Générer un labyrinthe</button>
    <img src="sm60.gif" alt="tortue" id="tortue" class="hide" />
    </div>
    <div id="c"></div>
    </div>
    <script>
    // bouton permettant de générer le labyrinthe
    document.getElementById("go").addEventListener("click",()=>lab());
            const lab=()=>{
            document.getElementById("go").disabled=true;
            const c=document.getElementById("c");
            const large=10, long=18;
            // vidage du précédent labyrinthe, éventuellement
            while(c.lastChild){c.removeChild(c.lastChild);};
    //*************************LA GENERATION DU LABYRINTHE*************************
            const tr=document.createElement("div"), td=document.createElement("div"), t=[];
            tr.classList.add("ligne");td.classList.add("bloc");
            for(let i=0;i<long;i++){
                    let r=tr.cloneNode();c.appendChild(r);
                    for(let j=0;j<large;j++){
    // tableau t = cases du labyrinthe
                            let c=td.cloneNode();t.push(large*i+j);c.title=large*i+j+1;r.appendChild(c);
                    };
            };      
            const cel=c.querySelectorAll(".bloc");
    // t2 contient la moitié des cases de t (aléatoire)
    // t3 contiendra tous les parcours possibles
    // t4 contiendra chaque dernière case des parcours
            let t2=new Set(), t3=[], t4=new Set(), bis=t.slice();
            for(let i=large*large/2;i>=0;i--){
                    let h=Math.floor(Math.random()*bis.length);t2.add(bis[h]);bis.splice(h,1)
            }
    // les cases correspondantes dans t sont noircies
            t.forEach((v,i,ta)=>{if(t2.has(i)){ta[i]="no";cel[i].classList.add("black")}else ta[i]=[]})
    //On choisit une case de départ et d'arrivée parmi les blanches (si possible)
            let debut, fin, tdeb=[], tfin=[];
            for(let i=0;i<large;i++){if(t[i]!="no"){tdeb.push(i)}};
            if(tdeb.length>0){debut=tdeb[Math.floor(Math.random()*tdeb.length)]}else lab();
            for(let i=t.length-large;i<t.length;i++){if(t[i]!="no"){tfin.push(i)}};
            if(tfin.length>0){fin=tfin[Math.floor(Math.random()*tfin.length)]}else lab();
    // La case de départ sera à l'origine de tous les parcours (ben oui)
            t3[0]=[debut];
    // définition des possibilités de déplacement pour chaque case blanche (maximum 8 directions)
            for(let lg=t.length,i=lg-1;i>=0;i--){if(t[i]!="no"){
                    if(i<lg-1  && t[i+1]!="no" && cel[i+1] && (i+1)%large!=0){t[i].push(i+1)}
                    if(i>0 && t[i-1]!="no" && cel[i-1] && i%large!=0){t[i].push(i-1)}
                    if(i<lg-large  && t[i+large]!="no"){t[i].push(i+large)}
                    if(i>=large  && t[i-large]!="no"){t[i].push(i-large)}
                    // ces 4 directions sont optionnelles: on peut commenter ces 4 lignes
                    if(i<lg-large-1 && t[i+large+1]!="no"&& (i+large+1)%large!=0){t[i].push(i+large+1)}
                    if(i>large && t[i-large-1]!="no" && i%large!=0){t[i].push(i-large-1)}
                    if(i<=lg-large && t[i+large-1]!="no"&& i%large!=0){t[i].push(i+large-1)}
                    if(i>=large && t[i-large+1]!="no" && (i-large+1)%large!=0){t[i].push(i-large+1)}
            }}
    //*************************LA RESOLUTION (FONCTION RECURSIVE)*************************
            const run=(arg)=>{              
                    arg++;
                    let long=t3.length;
    // ajout de toutes les nouvelles possibilités au tableau des parcours 
                    for(let i=0;i<long;i++){
                            let last=t3[i][t3[i].length-1];
                            for(let j=0;j<t[last].length;j++){
                                    if(!t4.has(t[last][j])){// indique qu'une nouvelle case est à ajouter
                                            t3.push([...t3[i],t[last][j]]);t4.add(t[last][j]);
                                    };
                            }
                    };
                    // on réinitialise t4 avec simplement les 2 dernières valeurs de chaque parcours
                    t4.clear();
                    for(let i=0;i<t3.length;i++){
                            t4.add(t3[i][t3[i].length-1]);t4.add(t3[i][t3[i].length-2])
                    };
                    if(t4.has(fin)){// test de victoire     : dernière case atteinte
                            const parcours=[],vitesse=500;
                            let cell=0;
                            for(let i=0;i<t3.length;i++){
                                    if(t3[i][t3[i].length-1]==fin){
                                            for(let j=0;j<t3[i].length;j++){parcours.push(t3[i][j]);
                                            };
                                    }
                            };
                            const timer=setInterval(()=>{
                                    if(cell<parcours.length){
                                            document.getElementById("tortue").classList.remove("hide");
                                            cel[parcours[cell]].appendChild(document.getElementById("tortue"));
                                            cel[parcours[cell]].classList.add("red");cell++
                                    }
                                    else {
                                            document.getElementById("console").appendChild(document.getElementById("tortue"));
                                            clearInterval(timer);
                                            document.getElementById("go").disabled=false;
                                            return
                                    }
                            },vitesse)
                    }
                    else{
                            // élimination des parcours provisoires sans issue
                            for(let i=0;i<t3.length;i++){if(t3[i].length<=arg){t3.splice(i,1);i--}};
                            if(!t3[0]){lab();return};// relance du constructeur
                            run(arg)
                    }
            };
            run(0);
    }
    </script>
    </body>
    </html>

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2020
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2020
    Messages : 6
    Par défaut
    Citation Envoyé par mathieu Voir le message
    la fonction calcule la position dans le tableau en fonction des coordonnées x et y et elle retournes "true" s'il s'agit d'une case du tableau qui correspond à un couloir.
    Ah et du coup le if(position) vérifie que le point vers lequel on se déplace est bien un couloir et si ce n'est pas le cas on ne peut pas avancer ?

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2020
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2020
    Messages : 6
    Par défaut
    Merci beaucoup, grâce à votre aide, j'ai pu résoudre mon problème !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Projet AlgoScript (variante de JavaScript)
    Par Sosuk dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 25/11/2013, 19h26
  2. réalisation d'un site de projet informatique
    Par liquid dans le forum Général Conception Web
    Réponses: 3
    Dernier message: 23/08/2006, 17h47
  3. Rejoindre une prépa intégrée après un an de prépa ?
    Par Denti-fritz dans le forum Etudes
    Réponses: 7
    Dernier message: 04/05/2005, 14h38
  4. Formation "Chef de projets informatiques" à Paris8
    Par liliaparis dans le forum Etudes
    Réponses: 3
    Dernier message: 24/04/2005, 12h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo