2015-04-19 6 views
5

Ich mache ein einfaches Schere-Stein-Schere-Programm, bin mir aber nicht sicher, wie man sicherstellen kann, dass der Benutzer nur eine gültige Auswahl trifft. Ich muss in der Lage sein, sie zu wiederholen, wenn sie nicht eine Varriante von "Rock", "Papier" oder "Schere" eingeben (Großschreibung spielt keine Rolle) und später "Ja" oder "Nein". Vorschläge?Wie kann ich sicherstellen, dass der Benutzer eine gültige Auswahl trifft?

import java.util.*; 

public class RockPaperScissors { 

private int wins = 0; 
private int losses = 0; 
private int ties = 0; 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 

    RockPaperScissors model = new RockPaperScissors(); 
    Scanner scan = new Scanner(System.in); 

    while (true) { 
     System.out.println("Rock, Paper, Scissors... Pick one! (Type Rock, Paper, or Scissors)"); 
     String playerChoice = scan.next(); 

     String computerChoice = model.getRandomChoice(); 

     System.out.println("You chose " + playerChoice + "."); 
     System.out.println("The computer chose " + computerChoice + "."); 

     RockPaperScissors.GameOutcome outcome = model.getGameOutcome(
       playerChoice, computerChoice); 

     if (outcome == RockPaperScissors.GameOutcome.WIN) { 
      System.out.println("You won! Congratulations"); 
     } else if (outcome == RockPaperScissors.GameOutcome.LOSE) { 
      System.out.println("You lose! Better luck next time!"); 
     } else { 
      System.out.println("Tie!"); 
     } 

     System.out.print("Do you want to play again? (Yes/No):"); 

     String answer = scan.next(); 
     if (answer.equalsIgnoreCase("no")) { 
      break; 
     } 
    } 

    System.out.println("Thanks for playing!"); 
    System.out.println("Wins: " + model.getWins()); 
    System.out.println("Losses: " + model.getLosses()); 
    System.out.println("Ties: " + model.getTies()); 
    scan.close(); 
} 

public static enum GameOutcome { 
    WIN, LOSE, TIE; 
} 

public GameOutcome getGameOutcome(String userChoice, String computerChoice) { 

    if (userChoice.equalsIgnoreCase("Rock")) { 

     if (computerChoice.equalsIgnoreCase("Paper")) { 
      losses++; 
      return GameOutcome.LOSE; 
     } else if (computerChoice.equalsIgnoreCase("Scissors")) { 
      wins++; 
      return GameOutcome.WIN; 
     } 
    } else if (userChoice.equalsIgnoreCase("Paper")) { 

     if (computerChoice.equalsIgnoreCase("Scissors")) { 
      losses++; 
      return GameOutcome.LOSE; 
     } else if (computerChoice.equalsIgnoreCase("Rock")) { 
      wins++; 
      return GameOutcome.WIN; 
     } 
    } else if (userChoice.equalsIgnoreCase("Scissors")) { 
     if (computerChoice.equalsIgnoreCase("Rock")) { 
      losses++; 
      return GameOutcome.LOSE; 
     } else if (computerChoice.equalsIgnoreCase("Paper")) { 
      wins++; 
      return GameOutcome.WIN; 
     } 
    } 
    ties++; 
    return GameOutcome.TIE; 
} 

public String getRandomChoice() { 
    double d = Math.random(); 

    if (d < .33) { 
     return "Rock"; 
    } else if (d < .66) { 
     return "Paper"; 
    } else { 
     return "Scissors"; 

    } 
} 

public int getWins() { 
    return wins; 
} 

public int getLosses() { 
    return losses; 
} 

public int getTies() { 
    return ties; 
} 

}

+3

Erstellen Sie eine Schleife, die kontinuierlich Benutzereingaben erfasst, bis sie etwas Gültiges eingibt. Sobald der Benutzer eine korrekte Antwort eingegeben hat, verlassen Sie die Schleife –

+0

@VinceEmigh Wie kann ich das trotz der Großschreibung arbeiten? –

+0

Verwenden Sie 'equalsIgnoreCase (String)', wenn Benutzereingaben mit den gültigen Optionen verglichen werden –

Antwort

3

Wenn ich eine Sitzung von roshambo gegen den Computer spielen, würde Ich mag, dass ich meine Auswahl zu machen, indem nur die Eingabe im ersten Brief von "Rock", "Paper" oder "Scissors".

eine reiche enum Verwendung hier eine natürliche Wahl ist:

private enum Choice { 

    ROCK ("Rock"), 
    PAPER ("Paper"), 
    SCISSORS ("Scissors"); 

    private String displayName; 

    private static final List<Choice> VALUES = 
      Collections.unmodifiableList(Arrays.asList(values())); 
      private static final int SIZE = VALUES.size(); 
    private static final Random RANDOM = new Random();   

    private Choice(String dn) { 
     displayName = dn; 
    } 

    /** 
    * Returns a random Choice. 
    */ 
    public static Choice getRandomChoice() { 
     return VALUES.get(RANDOM.nextInt(SIZE)); 
    } 

    /** 
    * Returns a Choice that matches the input string. The input is considered a match if it starts with the same character 
    * as the displayname of a Choice. If no match is found, returns null. 
    */ 
    public static Choice fromInput(String input) { 

     if (input == null || input.length() == 0) { 
      return null; 
     } 

     for (Choice c : VALUES) { 
      if (Character.toLowerCase(c.displayName.charAt(0)) 
        == Character.toLowerCase(input.charAt(0))) { 
       return c; 
      } 
     } 
     return null; 
    } 

    /** 
    * Returns the text to display to the user, asking for input to #fromInput(). 
    */ 
    public static String promptText() { 
     StringBuilder sb = new StringBuilder(); 
     for (Choice c : VALUES) { 
      if (sb.length() > 0) { 
       sb.append(", "); 
      } 
      sb.append(c.displayName).append(" (") 
        .append(c.displayName.charAt(0)).append(")"); 
     } 
     sb.append(". Pick one!"); 
     return sb.toString(); 
    } 
} 

die meisten Funktionen werden deklarativ im enum, Ihre Kundennummer ein viel einfacher geworden codiert ist. Die enum behandelt auch die zufällige Auswahl des Computers (Idee von this Antwort).

while (true) { 

     Choice choice = null; 

     while (choice == null) { 
      System.out.println(Choice.promptText()); 
      choice = Choice.fromInput(scan.next()); 
     } 

     String computerChoice = Choice.getRandomChoice().displayName; 
// ... 

Sie können auch die meisten kapseln (wenn nicht alle) der Logik, die Sie in der getGameOutcome Methode haben, in Choice.

5

Halten Sie die gültigen Optionen in einer Liste, Schleife, die die Eingabe von dem Benutzer zu fragen, bis er etwas gültig eingeben.

List<String> validChoices = Arrays.asList("rock", "paper", "scissors"); 
Scanner sc = new Scanner(System.in); 
String choice = null; 
do 
{ 
    System.out.println("Enter a choice (rock|paper|scissors)"); 
    choice = sc.next().toLowerCase();//Retrieve as lower case 
} 
while(!validChoices.contains(choice)); 
+0

'toLowerCase()' erstellt ein neues 'String'-Objekt. Wahrscheinlich am besten vergleichen mit 'equalsIgnoreCase' –

+0

@VinceEmigh 'equalsIgnoreCase' verwenden' regionMatches', die 'toUpperCase' aufrufen. –

+0

@VinceEmigh Beachten Sie, dass ich immer noch "equalsIgnoreCase" bevorzuge, da es einige Optimierungen wie die Überprüfung der Länge und einen Vergleich mit ref für das Zeichenliteral gibt. In meinem Beispiel verwende ich nicht einmal 'equals', sondern überprüfe, ob die Liste die Zeichenfolge enthält. –

1

Somesing wie

if (!playerChoise.equalsIgnoreCase("paper") && ...) continue; 

Oder können Sie gültigen choises in Liste speichern, wie oben gezeigt, und foreach-Schleife verwenden. Aber es wird schwieriger, weil Sie alle Varianten überprüfen müssen. Vielleicht etwas wie.

private boolean checkValid(String userChoise, String... variants) { 
    for (String s : variants) { 
     if (playerChoise.equalsIgnoreCase(s)) return true; 
    } 
    return false; 
} 

Und es für beide Fälle nennen:

if (!checkValid(userChoise, "rock", "papper", "scissors")) continue; 
Verwandte Themen