Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème incompréhensible avec le jeu "Plus ou Moins"

Vraiment, je ne comprends pas...

Sujet résolu
    14 février 2011 à 18:26:02

    Bonjour,
    Je suis actuellement le cours de Javascript de JoSé2 : Tout sur le Javascript !.
    J'en suis au jeu "Plus ou Moins" : TD : Jeu du "Plus ou Moins".
    J'ai développé une amélioration qui consiste à proposer à l'utilisateur une personnalisation du jeu, en lui demandant le nombre minimum et le nombre maximum. Lorsque je teste mon jeu dans l'option "Personnaliser", l'ordinateur me demande comme prévu le nombre minimum puis le nombre maximum. Mais ensuite, un problème se pose : quel que soit le nombre maximum que l'on choisit, le message affiché est toujours "C'est plus", même quand on entre le nombre maximum !
    Voici mon code :

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
       <head>
           <title>Jeu ~ Plus ou moins</title>
           <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    	   <script type="text/javascript">
    			<!--
    				function nombreAleatoire(min, max)
    				{
    					var nombre = min + (max - min + 1) * Math.random();
    					return Math.floor(nombre);
    				}
    				
    				function personnaliserPartie()
    				{
    					alert('Vous allez personnaliser votre partie.\nVeuillez suivre les instructions à l\'écran.');
    					var min = prompt('Entrez le nombre minimum :');
    					var max = prompt('Entrez le nombre maximum :');
    					lancerPartie(min, max);
    				}
    				
    				function lancerPartie(min, max)
    				{
    					var compteurManches = 0; // Nombre de manches jouées.
    					var meilleurScore = 0; // Meilleur score.
    					var score; // Score de la manche en cours.
    					var continuer;
    					do
    					{
    						score = lancerManche(min, max);
    						if(score)
    						{
    							if(meilleurScore == 0 || score < meilleurScore)
    							{
    								meilleurScore = score;
    							}
    							if(score == 1)
    							{
    								continuer = confirm('Bravo, vous avez gagné en 1 coup ! Félicitations ! Voulez-vous rejouer ?');
    							}
    							else if(score > 1)
    							{
    								continuer = confirm('Bravo, vous avez gagné en ' + score + ' coups.\nVoulez-vous rejouer ?');
    							}
    							compteurManches++;
    						}
    						else
    						{
    							if(confirm('Voulez-vous vraiment arrêter ?') == true)
    							{
    								continuer = false;
    							}
    							else
    							{
    								continuer = true;
    							}
    						}
    					} while(continuer == true);
    					// Affichage du meilleur score (si une manche au moins a été jouée) :
    					if(compteurManches != 0)
    					{
    						if(compteurManches == 1)
    						{
    							if(meilleurScore == 1)
    							{
    								alert('Vous avez joué 1 manche et vous avez trouvé le nombre du premier coup ! Toutes mes félicitations !');
    							}
    							else
    							{
    								alert('Vous avez joué 1 manche et votre score est de ' + meilleurScore + ' coups. À bientôt sur mon site !');
    							}
    						}
    						else
    						{
    							if(meilleurScore == 1)
    							{
    								alert('Vous avez joué ' + compteurManches + ' manches et votre meilleur score est de 1 coup (très belle performance !). À bientôt sur mon site !');
    							}
    							else
    							{
    								alert('Vous avez joué ' + compteurManches + ' manches et votre meilleur score est de ' + meilleurScore + ' coups. À bientôt sur mon site !');
    							}
    						}
    					}
    					else if(compteurManches == 0)
    					{
    						alert('Dommage, vous n\'avez joué aucune manche.');
    					}
    				}
    					
    				function lancerManche(min, max)
    				{
    					var nombreADeviner = nombreAleatoire(min, max);
    					var nombrePropose = 0;
    					var compteurCoups = 0;
    					var messageAAfficher = 'Le nombre à deviner est compris entre ' + min + ' et ' + max + '.';
    					do
    					{
    						nombrePropose = prompt(messageAAfficher);
    						// Message à afficher au prochain tour :
    						if(nombrePropose == null)
    						{
    							return 0;
    						}
    						else if(nombrePropose < min)
    						{
    							messageAAfficher = 'Veuillez entrer un nombre supérieur ou égal à ' + min + '.';
    						}
    						else if(nombrePropose > max)
    						{
    							messageAAfficher = 'Veuillez entrer un nombre inférieur ou égal à ' + max + '.';
    						}
    						else if(nombreADeviner < nombrePropose)
    						{
    							messageAAfficher = 'C\'est moins.';
    							compteurCoups++;
    						}
    						else if(nombreADeviner > nombrePropose)
    						{
    							messageAAfficher = 'C\'est plus.';
    							compteurCoups++;
    						}
    						else if(nombreADeviner != nombrePropose)
    						{
    							messageAAfficher = 'Veuillez entrer un nombre entier.';
    						}
    					} while(nombrePropose != nombreADeviner);
    					return (compteurCoups + 1);
    				}
    			//-->
    		</script>
       </head>
       <body>
    		<p>
    			<a href="#" onclick="javascript:lancerPartie(1, 50)">Partie Zéro</a><br />
    			<a href="#" onclick="javascript:lancerPartie(1, 100)">Partie facile</a><br />
    			<a href="#" onclick="javascript:lancerPartie(1, 500)">Partie niveau moyen</a><br />
    			<a href="#" onclick="javascript:lancerPartie(1, 1000)">Partie difficile</a><br />
    			<a href="#" onclick="javascript:personnaliserPartie()">Personnaliser</a><br />
    		</p>
    		<script type="text/javascript">
    			<!--
    			alert('Bienvenue sur mon jeu de "Plus ou moins" codé en Javascript !');
    			//-->
    		</script>
       </body>
    </html>
    
    <!-- Jeu - Plus ou Moins (Jeu - Plus ou Moins.html) -->
    


    Merci d'avance pour votre aide.
    Cordialement,
    bouboudu21 :)
    • Partager sur Facebook
    • Partager sur Twitter
      14 février 2011 à 18:38:57

      Essais avec ça :

      var min = parseInt(prompt('Entrez le nombre minimum :'), 10);
      var max = parseInt(prompt('Entrez le nombre maximum :'), 10);
      
      • Partager sur Facebook
      • Partager sur Twitter
        14 février 2011 à 18:48:55

        Merci beaucoup Tiller, maintenant ça marche !
        Mais je voudrais juste que tu m'éclaires : pourquoi le parseInt est-il nécessaire ? Et qu'est-ce que fait cette fonction ? Et que signifie le 10 ?
        En tous cas merci pour ta réponse ultra-rapide.

        Cordialement,
        bouboudu21 :)
        • Partager sur Facebook
        • Partager sur Twitter
          14 février 2011 à 18:55:16

          En fait, prompt renvoi une chaîne de caractères.

          parseInt transforme une chaîne de caractères, en nombre. Le 10 permettant de préciser la base. Il permet d'éviter les erreurs du style si tu as tapé 010 qui renverra 8 (étant interprété comme étant en base 8)

          Le fait d'avoir une chaine de caractère gène quand tu fais dans ton random un min + (...).

          Le + servant aussi à concaténer, tu obtiens par exemple si min = 2 et que le random est 60, "260"
          • Partager sur Facebook
          • Partager sur Twitter
            14 février 2011 à 18:59:52

            D'accord, mais ce que je ne comprends pas, c'est que dans la fonction lancerManche(min, max), on n'a pas besoin d'utiliser parseInt. Est-ce parce qu'on a sans le vouloir précisé le type de la variable en écrivant var nombrePropose = 0 ?

            Encore merci,
            bouboudu21
            • Partager sur Facebook
            • Partager sur Twitter
              14 février 2011 à 19:51:41

              Non, c'est que tu ne fais que des comparaisons.

              L'opérateur ">" ou "<" n'existe pas pour les chaines de caractères, donc le moteur "comprend" qu'il doit convertir la chaine en nombre. Il fait une conversion implicite.

              En revanche, l'opérateur "+" existe pour les nombres (addition) mais également pour les chaines de caractères. Donc il fait la concaténation sans se poser de questions.
              • Partager sur Facebook
              • Partager sur Twitter
                14 février 2011 à 19:59:15

                j'aime bien le "sans le vouloir" :)

                Quand tu écris var nombrePropose = 0; ici nombrePropose est de type number (nombre)
                Si tu avais écris var nombrePropose = "0"; là le type de nombrePropose serait string (chaîne de caractères)

                La différence entre eux est minime mais cela change bien le type de la variable.

                Si tu veux, tu peux faire alert(typeof nombrePropose); pour connaître le type de la variable.
                • Partager sur Facebook
                • Partager sur Twitter

                Problème incompréhensible avec le jeu "Plus ou Moins"

                × 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