[java]pb avec boolean

domxaline -  
 domxaline -
Bonjour,
j'ai écrit ce prg en exécutant j' ai les erreurs suivant

Let's play a game,I'll pick a nb between
1 and 100,and you try to guess it

What is your first guess?
50
That's too high Try again
25
That's too high Try again
15
That is too bas, try again
20
That's too high Try again
18
That's too high Try again
16
You didn't get the nb in 6 guesses
You lose.My nb was 17

Would you like to play again
y
Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at java.util.Scanner.nextBoolean(Unknown Source)
at Textprg.Guessingame1.main(Guessingame1.java:15)

aidez moi s'il vous plaît

package Textprg;
import java.util.Scanner;
public class Guessingame1 
{
	public static void main(String[]args)
    {
      System.out.println("Let's play a game,I'll pick a nb between");
      System.out.println("1 and 100,and you try to guess it");
      boolean playagain;
      
      do{
            playgame();
            System.out.println("Would you like to play again");
            Scanner sc=new Scanner(System.in);
            playagain=sc.nextBoolean();
        }while(playagain);
      System.out.println("Thanks for playing.Goodbye.");
    }
      static void playgame()
      {
       int computersnb;
       int usersguess;
       int guesscount=0;
       computersnb=(int)(100*Math.random())+1;
       System.out.println("");
       System.out.println("What is your first guess?");
       while(true)
       {
    	   Scanner sc1=new Scanner(System.in);
    	   usersguess=sc1.nextInt();
    	   guesscount++;
    	   if(usersguess==computersnb)
    	   {
    		   System.out.println("You get in "+guesscount+" Guesses!My nb was "+computersnb);
    		   break;
    	   }
    	   if (guesscount==6)
    	   {
    		   System.out.println("You didn't get the nb in 6 guesses");
    		   System.out.println("You lose.My nb was "+computersnb);
    		   break;
    	   }
       if(usersguess<computersnb)
    	   System.out.println("That is too bas, try again");
       else if(usersguess>computersnb)
    	   System.out.println("That's too high Try again");
       }
       System.out.println("");
      }

}



aidez
A voir également:

11 réponses

Tibo-k3
 
Apparament, le problème vient de " sc.nextBoolean() ".

Dans ton cas sc vaut "y", or d'après ce que j'ai pu voir sur le net, il faut taper "true" ou "false"et non pas "y" ou "n".

Il faut que tu trouve un moyen de dire en gros :

if (scanner = "y") { scanner = "true" }
if (scanner = "n") { scanner = "false" }

si tu veux garder une réponse en "y" et "n"... Après je suis vraiment pas copain avec les Scan, BufferReader et trucs dans le genre pour te dire la synthaxe exact.

Source : https://www.scribd.com/document/7385864/LES-CLASSES-Scanner-String-StringBuffer-StringTokenizer-Et-Math
0
a
 
merci pour ta réponse,mais comment on les place,aide moi s'il te plaît
0
Tibo-K3 Messages postés 21 Statut Membre 3
 
Alors déjà 3 choses :

1- "That is to bas", ca veut rien dire ^^ C'est du franglais...

2- Ton code ne fait pas de gestion de mauvaise saisie... Si quand tu demande de taper un chiffre, tu tapes une lettre ou un mot, ca va planter ! Pour ca deux solutions:

-2.1 : La solution propre : les chiffres et lettres comporte un code ASCII, tu découpes le String recu et tu vérifie char par char que le code ASCII correspond bien a celui d'un chiffre et non pas d'une lettre ou symbole... C'est un peu chiant à faire.

-2.2 : La méthode bourrin : tu fais du Try/Catch sur la conversion en Integer de ta saisie. J'explique en algo :
try ( convertir en int ) catch ( afficher "saisir un chiffre !")

3- Tes corrections

-3.1 : Faire que l'on doive taper Y ou N pour rejouer ou quitter (plus ajout de vérif de la saisie). Remplace tout le corps de ton premier DO par :

 playgame(); 
 // Permet de stocker la valeur saisie 
 String saisie_user = "";
 // Tant que la saisie est differente de y ou n, on redemande de taper ! 
 while(!saisie_user.equals("y") && !saisie_user.equals("n")) 
 { 
  // On dit a l'utilisateur ce qu'il doit taper, tant qu'a faire... 
  System.out.println("Would you like to play again (y/n)");   
  Scanner sc = new Scanner(System.in); 
  // On stocke la valeur saisie 
  saisie_user = sc.nextLine(); 
 } 
 playagain = (saisie_user.equals("y"));  
 // A ce stade, saisie user vaut soit y ou n. Dans le cas de y, equals retourne true, n retourne false.


-3.2 : Vérifier que la saisie est bien un integer :

Remplace ton

 usersguess=sc1.nextInt();


par :

 try  
  { 
   usersguess=sc1.nextInt(); 
  } 
  catch (Exception e) 
  { 
   System.out.println("Only use an integer, please !"); 
   usersguess = -1; 
  }


Par contre il faudra que tu intialises ton usersguess pour ça, donc :

int usersguess;
devient :
int usersguess = -1;


Et tant qu'à faire remplace :

 if(usersguess<computersnb) 
  System.out.println("That is too bas, try again"); 
 else if(usersguess>computersnb) 
  System.out.println("That's too high Try again");


par (ca permet de pas afficher "too bas" ou "too high" si y'a eut une erreur de saisie) :

 if(usersguess<computersnb && usersguess != -1) 
  System.out.println("That is too bas, try again"); 
 else if(usersguess>computersnb) 
  System.out.println("That's too high Try again"); 


Voilà... Allez je retourne sur MON code Java mtn ^^

Dit moi si ca t'a servi ;)
0
domxaline
 
bonjour,
j'ai essayé comme tu m'a dit,il rentre pas dans le boucle 'y' ou 'n'
aide moi s'il te plaît
package Textprg;
import java.util.Scanner;
public class Guessingame1 
{
	public static void main(String[]args)
    {
      System.out.println("Let's play a game,I'll pick a nb between");
      System.out.println("1 and 100,and you try to guess it");
      boolean playagain;
            playgame();
            String saisieuser="";
            while(!saisieuser.equals("y")&& !saisieuser.equals("n"));
            {
            System.out.println("would you like to play again (y/n");
            Scanner sc=new Scanner(System.in);
            saisieuser=sc.nextLine();
            }
            playagain=(saisieuser.equals("y"));
    }
    
            
      static void playgame()
      {
       int computersnb;
       int usersguess;
       int guesscount=0;
       computersnb=(int)(100*Math.random())+1;
       System.out.println("");
       System.out.println("What is your first guess?");
       while(true)
       {
    	   Scanner sc1=new Scanner(System.in);
    	   usersguess=sc1.nextInt();
    	   guesscount++;
    	   if(usersguess==computersnb)
    	   {
    		   System.out.println("You get in "+guesscount+" Guesses!My nb was "+computersnb);
    		   break;
    	   }
    	   if (guesscount==6)
    	   {
    		   System.out.println("You didn't get the nb in 6 guesses");
    		   System.out.println("You lose.My nb was "+computersnb);
    		   break;
    	   }
       if(usersguess<computersnb)
    	   System.out.println("That is too bas, try again");
       else if(usersguess>computersnb)
    	   System.out.println("That's too high Try again");
       }
       System.out.println("");
      }

}

resultat de ce prg:
Let's play a game,I'll pick a nb between
1 and 100,and you try to guess it

What is your first guess?
50
That is too bas, try again
80
That's too high Try again
70
That's too high Try again
55
That is too bas, try again
58
That's too high Try again
56
You get in 6 Guesses!My nb was 56
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Tibo-K3 Messages postés 21 Statut Membre 3
 
Normal, j'ai dit remplace le "corps de ton DO"... Toi, tu as viré le "do" !

do {
// tu colles ce que je t'ai filé et vire ce qu'il y avait avant ici
}
while (playagain)
0
domxaline
 
est ce que c'est ça que tu veux que je fasse,
en compilant j'ai erreur suivantes

Exception in thread "main" java.lang.Error: Unresolved compilation problems:
Syntax error, insert "}" to complete Block
Syntax error, insert "while ( Expression ) ;" to complete DoStatement

at Textprg.Guessingame1.main(Guessingame1.java:19)

la ligne 19 est la suivante
playagain=(saisieuser.equals("y"));

do{
    	 playgame();
    	 String saisieuser="";
    	 while(!saisieuser.equals("y")&& !saisieuser.equals("n"))
    	 {
    		 System.out.println("Would you like to play agin(y/n)");
    		 Scanner sc=new Scanner(System.in);
    		 saisieuser=sc.nextLine();
    	 }
        playagain=(saisieuser.equals("y"));
      }
0
domxaline
 
la méthode playgame marche bien,je pense ça sera inutile de le changer,
j'ai pb seulement sur la boucle do....while
0
Tibo-K3 Messages postés 21 Statut Membre 3
 
Si tu suis mot à mot ce que j'ai dit, ca donne le code suivant et ca marche... ^^

Sur le coup, fait juste copier coller de ca :


import java.util.Scanner; 
public class Guessingame1  
{ 
 public static void main(String[]args) 
 { 
  System.out.println("Let's play a game,I'll pick a nb between"); 
  System.out.println("1 and 100,and you try to guess it"); 
  boolean playagain; 

  do{ 
   playgame();  
   // Permet de stocker la valeur saisie  
   String saisie_user = ""; 
   // Tant que la saisie est differente de y ou n, on redemande de taper !  
   while(!saisie_user.equals("y") && !saisie_user.equals("n"))  
   {  
    // On dit a l'utilisateur ce qu'il doit taper, tant qu'a faire...  
    System.out.println("Would you like to play again (y/n)");    
    Scanner sc = new Scanner(System.in);  
    // On stocke la valeur saisie  
    saisie_user = sc.nextLine();  
   }  
   playagain = (saisie_user.equals("y"));   
   // A ce stade, saisie user vaut soit y ou n. Dans le cas de y, equals retourne true, n retourne false. 
  } 
  while(playagain); 
  System.out.println("Thanks for playing.Goodbye."); 
 } 
 static void playgame() 
 { 
  int computersnb; 
  int usersguess = -1; 
  int guesscount=0; 
  computersnb=(int)(100*Math.random())+1; 
  System.out.println(""); 
  System.out.println("What is your first guess?"); 
  while(true) 
  { 
   Scanner sc1=new Scanner(System.in); 
   try   
   {  
    usersguess=sc1.nextInt();  
   }  
   catch (Exception e)  
   {  
    System.out.println("Only use an integer, please !");  
    usersguess = -1;  
   } 

   guesscount++; 
   if(usersguess==computersnb) 
   { 
    System.out.println("You get in "+guesscount+" Guesses!My nb was "+computersnb); 
    break; 
   } 
   if (guesscount==6) 
   { 
    System.out.println("You didn't get the nb in 6 guesses"); 
    System.out.println("You lose.My nb was "+computersnb); 
    break; 
   } 
   if(usersguess<computersnb && usersguess != -1)  
    System.out.println("That is too bas, try again");  
   else if(usersguess>computersnb)  
    System.out.println("That's too high Try again");  
  } 
  System.out.println(""); 
 } 

} 
0
domxaline
 
merci beaucoup,le prg marche,mais quand même j'ai une question
pourquoi userguess=-1,peux tu m'expliquer s'il te plaît
0
Tibo-K3 Messages postés 21 Statut Membre 3
 
Alors il y'a plusieurs raisons :

int userguess = -1 (la création de la variable) : les modifications de userguess par la suite sont enfermées dans des blocs conditionnels ("if" et "try", quoi que je sais pas si "try" est considéré comme une conditionnelle... bref), par habitude (même par obligation de compilation ?), il faut donc initialiser la variable...

Mais la principale raison, c'est qu'il faut donner une valeur à userguess pour pouvoir distinguer le cas "l'utilisateur a mis une valeur" et "l'utilisateur a mis une valeur erronée (une lettre par ex)".
J'ai choisi arbitrairement "-1" car l'utilisateur ne va - théoriquement - pas essayer cette valeur...

En gros, userguess == -1 veut dire "si la saisie est incorrecte".

Ca permet de le distinguer du cas "la saisie est inférieure"...

Bien sûr, reste le cas où l'utilisateur saisie "-1", et ca ne lui retournera rien... Pour faire bien, il y aurait fallu soit :
- utiliser une autre variable (un boolean) pour "marquer" le cas de saisie erronée et non pas utiliser userguess,
- empecher la saisie d'un integer inférieur à 0 de la part de l'utilisateur et lui retourner "L'entier doit être supérieur ou égal à 0".

Voilà...
0
domxaline
 
merci beaucoup pour ton aide
0