Partage
  • Partager sur Facebook
  • Partager sur Twitter

Boucle infinie node

Sujet résolu
    18 janvier 2018 à 21:05:48

    Bonsoir à tous !

    const readline = require('readline')
    const fs = require('fs')
    var chiffre = ''
    let dev = 0
    let rando = 0
    let i = 0
    
    const rl = readline.createInterface({
      input: process.stdin,
      output: process.stdout
    })
    
    function rand()
    {
      dev = Math.floor(Math.random() * 1000)
      return dev
    }
    
    function devine()
    {
      rando = rand();
      console.log(rando);
      do {
        rl.question('Merci de saisir un nombre comprit entre 0 et 999\n', answer => {
            chiffre = answer;
            if (parseInt(chiffre, 10) > rando)
            {
              process.stdout.write('Moins !');
              i++;
            }
            if (parseInt(chiffre, 10) < rando)
            {
              process.stdout.write('Plus !');
              i++;
            }
            if (parseInt(chiffre, 10) === rando)
            {
              process.stdout.write('GG ! Vous avez trouvé le nombre mystère en ' + (i + 1) + ' coups !\n');
              process.exit();
            }
          });
        } while (parseInt(chiffre, 10) != rando);
    }
    
    devine()
    

    J'ai un petit soucie dans mon code, qui est le jeu du plus ou moins.

    En faite je boucle inf quand je lance le programme et ce dernier ne me demande même pas de rentrer ma valeur.

    Par contre, si je retire le "do" là pas de soucie (sauf que je voudrais que le programme boucle jusqu'à ce que j'ai trouvé ma valeur)

    Merci d'avance et bonne soirée :)

    • Partager sur Facebook
    • Partager sur Twitter
      18 janvier 2018 à 22:12:49

      Je ne connais pas cette librairie mais il semblerai que nodejs n'attend pas que le fait que l'utilisateur doit entrer un nombre, du coup ca continue sans que tu puisse ecrire. Je te conseille de changer de librairie, c'est vraiment pas ouf
      • Partager sur Facebook
      • Partager sur Twitter
      Si vous voulez me mp, venez sur Discord (username: Stelyus#8984)
        18 janvier 2018 à 22:17:29

        Bonjour,

        Tu as écrit ton programme de manière synchrone alors que la question est asynchrone. Si tu veux continuer à écrire de cette manière, tu peux utiliser le paquet readline-sync. Sinon, il faut changer le code afin d'invoquer à nouveau rl.question après que chaque réponse soit traitée.

        • Partager sur Facebook
        • Partager sur Twitter
          19 janvier 2018 à 8:52:45

          Bonjour,

          J'ai fait comme tu as dit Yovar sauf que je boucle inf encore ^_^

          const readline = require('readline')
          const fs = require('fs')
          var chiffre = ''
          let dev = 0
          let rando = 0
          let i = 0
          
          const rl = readline.createInterface({
            input: process.stdin,
            output: process.stdout
          })
          
          function rand()
          {
            dev = Math.floor(Math.random() * 1000)
            return dev
          }
          
          function devine()
          {
            rando = rand();
            console.log(rando);
            do {
              rl.question('Merci de saisir un nombre comprit entre 0 et 999\n', answer => {
                  chiffre = answer;
                  if (parseInt(chiffre, 10) > rando)
                  {
                    rl.question('Moins !', answer => {
                      chiffre = answer
                      rl.close();
                    });
                  }
                  if (parseInt(chiffre, 10) < rando)
                  {
                    rl.question('Plus !', answer => {
                      chiffre = answer
                      rl.close();
                    });
                  }
                  if (parseInt(chiffre, 10) === rando)
                  {
                    process.stdout.write('GG ! Vous avez trouvé le nombre mystère en ' + (i + 1) + ' coups !\n');
                    process.exit();
                  }
                });
              } while (parseInt(chiffre, 10) != rando);
          }
          
          devine()



          -
          Edité par UnixShellDev 19 janvier 2018 à 8:55:20

          • Partager sur Facebook
          • Partager sur Twitter
            19 janvier 2018 à 10:22:35

            Non ça ne corrige pas le problème. Si tu n'utilises pas readline-sync, alors il faut modifier ton programme de manière à ne plus utiliser de boucle. De plus tu as ajouté rl.close mais cela n'arrange rien, au contraire, tu risques de ne plus pouvoir utiliser rl avant que le nombre n'ait été trouvé.

            Je te conseille de faire une fonction pour poser la question et une fonction pour traiter la réponse. Si la réponse n'est pas satisfaisante, tu invoques à nouveau celle pour poser la question. En séparant en deux fonctions distinctes je pense que tu y arriveras plus facilement.

            • Partager sur Facebook
            • Partager sur Twitter
              19 janvier 2018 à 11:08:46

              J'ai refait mon code, mais je ne boucle plus du coup et ne passe pas dans ma fonction reponse ^^

              const readline = require('readline')
              const fs = require('fs')
              var chiffre = '';
              let dev = 0;
              let rando = 0;
              let i = 0;
              let rep;
              let quest;
              
              const rl = readline.createInterface({
                input: process.stdin,
                output: process.stdout
              })
              
              function rand()
              {
                dev = Math.floor(Math.random() * 1000);
                console.log(dev);
                return dev;
              }
              
              function reponse(chiffre, rand)
              {
                if (chiffre > rand)
                {
                  process.stdout.write('Moins !\n');
                }
                if (chiffre < rand)
                {
                  process.stdout.write('Plus !\n');
                }
                if (chiffre === rand)
                {
                  process.stdout.write('Vous avez trouvé le nombre mystère\n');
                  process.exit();
                }
              }
              
              function question()
              {
                rl.question('Réponse : ', answer => {
                  chiffre = answer;
                })
                return (parseInt(chiffre, 10));
              }
              
              function devinette()
              {
                process.stdout.write('Merci de saisir un nombre entre 0 et 999\n');
                rando = rand();
                quest = question();
                reponse(quest, rando);
              }
              
              devinette();
              

              -
              Edité par UnixShellDev 19 janvier 2018 à 11:28:53

              • Partager sur Facebook
              • Partager sur Twitter
                19 janvier 2018 à 12:25:27

                C'est pas mal, mais je pense qu'on a toujours un petit soucis avec l'asynchrone. Le code suivant :

                function question()
                {
                  rl.question('Réponse : ', answer => {
                    chiffre = answer;
                  })
                  return (parseInt(chiffre, 10));
                }

                ne fait pas ce que tu crois. La syntaxe answer => { ... } crée une fonction anonyme qui sera utilisée comme fonction de rappel quand rl aura lu la réponse. À ce moment-là tu lui dis juste ce qui va se passer quand il aura la réponse, mais une fois cela indiqué ton code continue, même s'il n'a pas encore eu la réponse. Donc tu ne peux pas faire un retour comme tu le souhaites.

                Je te propose quelques modifications pour que cela fonctionne. C'est plus facile de comprendre les choses quand elles marchent :

                 // Pas la peine de passer la réponse en paramètre, on peut utiliser la
                 // variable rando.
                function reponse(chiffre)
                {
                  if (chiffre > rando)
                  {
                    process.stdout.write('Moins !\n');
                  }
                  if (chiffre < rando)
                  {
                    process.stdout.write('Plus !\n');
                  }
                  // J'ai mis == pour faciliter les comparaisons avec du texte.
                  if (chiffre == rando)
                  {
                    process.stdout.write('Vous avez trouvé le nombre mystère\n');
                    process.exit();
                  }
                  // Si on est arrivé jusque là c'est que le processus continue,
                  // donc que l'utilisateur n'a pas trouvé la bonne réponse.
                  question();
                }
                
                function question()
                {
                  // On peut tout simplement indiquer la fonction reponse comme fonction
                  // de rappel. Elle attend elle-même un argument, la réponse.
                  rl.question('Réponse : ', reponse);
                }
                
                function devinette()
                {
                  process.stdout.write('Merci de saisir un nombre entre 0 et 999\n');
                  rando = rand();
                  question();
                }
                
                devinette();

                Cela n'est pas un code parfait, mais c'en est un qui fait fonctionner le tien avec très peu de modifications.

                -
                Edité par Yovar 19 janvier 2018 à 12:27:04

                • Partager sur Facebook
                • Partager sur Twitter
                  19 janvier 2018 à 13:34:14

                  ça fonctionne !! merci beaucoup et du coup effectivement c'est bien plus clair !

                  Merci infiniment !

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Boucle infinie node

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown