2017-02-19 3 views
0

ce qui suit est mon code pour un jeu de rock, papier, ciseaux dans BlueJ. Lorsque je compile et que l'utilisateur entre une entrée, l'ordinateur imprime immédiatement de nombreuses sorties de playerWins(). Le jeu se termine lorsque l'utilisateur tape "Quitter". Quelqu'un pourrait-il m'aider pour que mon écran ne soit pas inondé? (et s'il y a un moyen de condenser mon code qui serait aussi génial).Rock, Paper, Scissors- BlueJ boucle folle

import java.util.Random; 
import java.util.Scanner; 

public class RockPaperScissors 
{ 

    public static void main(String[] args) 
    { 
     int wins = 0, losses = 0, ties = 0; 
     boolean output; 
     Scanner scan = new Scanner(System.in); 
     System.out.print("(R)ock, (P)aper, (S)cissors, or quit: "); 
     String playerChoice = scan.nextLine(); 
     while (playerChoice.equals("quit") == false) 
     {  
      playerChoice = playerChoice.toUpperCase(); 
      String computerChoice = getComputerChoice(); 
      if(playerChoice.equals(computerChoice) != true) 
      { 
       output = playerWins(playerChoice, computerChoice); 
       if (output == true) 
       { 
        wins++; 
       } 
       else if (output == false) 
       { 
        losses++; 
       } 
      } 
      else 
      { 
       ties++; 
       System.out.println("Tie!"); 
      } 
     } 
     System.out.println("QUIT"); 
     System.out.println("Wins: " + wins); 
     System.out.println("Losses: " + losses);    
     System.out.println("Ties: " + ties); 
     scan.close(); 
    } 
    public static String getComputerChoice() 
    { 
     Random gen = new Random(); 
     int num = gen.nextInt(30) + 1; 
     if (num % 3 == 2) 
     { 
      return "R"; 
     } 
     else if (num % 3 == 1) 
     { 
      return "P"; 
     } 
     else 
     { 
      return "S"; 
     } 
    } 
    public static boolean playerWins(String playerChoice, String computerChoice) 
    { 
     if (playerChoice.equals("R") == true) 
     { 
      if (computerChoice.equals("P") == true) 
      { 
       System.out.println("My Point! \nP beats R"); // Rock is beaten by paper 
       return false; 
      } 
      else if (computerChoice.equals("S") == true) 
      { 
       System.out.println("Your Point! \nR beats S"); // Rock beats scissors 
       return true; 
      } 
     } 
     else if (playerChoice.equals("P") == true) 
     { 
      if (computerChoice.equals("R") == true) 
      { 
       System.out.println("Your Point! \nP beats R"); //Paper beats rock 
       return true; 
      } 
      else if (computerChoice.equals("S") == true) 
      { 
       System.out.println("My Point! \nS beats P"); //Paper is beaten by scissors 
       return false; 
      } 
     } 
     else if (playerChoice.equals("S") == true) 
     { 
      if (computerChoice.equals("P") == true) 
      { 
       System.out.println("Your Point! \nS beats P"); //Scissor beats paper 
       return true; 
      } 
      else if (computerChoice.equals("R") == true) 
      { 
       System.out.println("My Point! \nR beats S"); //Scissors is beaten by rock 
       return false; 
      } 
     } 
     return false; 
    } 
} 
+0

Mettez à jour 'playerChoice' ** dans ** the' while (playerChoice.equals ("quit") == false) '* loop * dans' main'. 'playerChoice = scan.nextLine();' - sinon, boucle infinie sans demander d'autre choix. –

+0

Qu'est-ce que * "... aide moi pour que mon écran ne soit pas inondé" * signifie? Pouvez-vous montrer une partie de la sortie? – jww

Répondre

1

Ces deux lignes sont le problème:

String playerChoice = scan.nextLine(); 
while (playerChoice.equals("quit") == false) { 

Vous lisez une ligne, puis vérifier que la ligne encore et encore. Vous devez lire une nouvelle ligne à l'intérieur la boucle. La façon dont vous l'avez maintenant, c'est juste essayer de faire le même mouvement au cours des temps infinis.

Essayez:

String playerChoice = scan.nextLine(); 
while (playerChoice.equals("quit") == false) { 

    //do all of the stuff that is already inside your loop 

    playerChoice = scan.nextLine(); 
} 

Cela recueillir les commentaires de l'utilisateur à nouveau à chaque fois après le traitement de la dernière entrée.

0

Vous regardez la saisie de l'utilisateur une seule fois, soit avant la boucle:

String playerChoice = scan.nextLine(); 

Une méthode très agréable pour résoudre c'est le suivant:

String playerChoice; 
while((playerChoice = scan.nextLine()).equals("quit") == false) 
{ 
    //more code 
} 

Ce que le code ci-dessus ne , est que playerChoice est réglé juste avant que .equals("quit") soit appelé. Si vous utilisez cette méthode, vous n'avez pas besoin d'une ligne supplémentaire à la fin de votre boucle pour définir playerChoice mais faites-le simplement dans la tête de votre boucle.