Steen-, papier-, schaarspel Java

Ik ben nieuw in programmeren en ik probeer een heel eenvoudig Steen, Papier, Schaar-spel in Java te schrijven. Het compileert en werkt prima, maar ik wil iets zeggen als “Ongeldige zet. Probeer het opnieuw.” of iets in die richting voor wanneer de gebruiker (personPlay) geen correct teken invoert (r, p of s). Wat zou de beste manier zijn om dat te doen? Als u bijvoorbeeld een “q” invoert, zou deze “Ongeldige zet” moeten afdrukken. Bij voorbaat hartelijk dank!

// *************
// Rock.java 
// ************* 
import java.util.Scanner; 
import java.util.Random; 
public class Rock 
{ 
public static void main(String[] args) 
{ 
    String personPlay; //User's play -- "R", "P", or "S" 
    String computerPlay = ""; //Computer's play -- "R", "P", or "S" 
    int computerInt; //Randomly generated number used to determine 
                     //computer's play 
    String response; 
    Scanner scan = new Scanner(System.in); 
    Random generator = new Random(); 
    System.out.println("Hey, let's play Rock, Paper, Scissors!\n" + 
                       "Please enter a move.\n" + "Rock = R, Paper" + 
                       "= P, and Scissors = S.");
    System.out.println();
    //Generate computer's play (0,1,2) 
    computerInt = generator.nextInt(3)+1; 
    //Translate computer's randomly generated play to 
    //string using if //statements 
    if (computerInt == 1) 
       computerPlay = "R"; 
    else if (computerInt == 2) 
       computerPlay = "P"; 
    else if (computerInt == 3) 
       computerPlay = "S"; 
    //Get player's play from input-- note that this is 
    // stored as a string 
    System.out.println("Enter your play: "); 
    personPlay = scan.next();
    //Make player's play uppercase for ease of comparison 
    personPlay = personPlay.toUpperCase(); 
    //Print computer's play 
    System.out.println("Computer play is: " + computerPlay); 
    //See who won. Use nested ifs 
    if (personPlay.equals(computerPlay)) 
       System.out.println("It's a tie!"); 
    else if (personPlay.equals("R")) 
       if (computerPlay.equals("S")) 
          System.out.println("Rock crushes scissors. You win!!");
    else if (computerPlay.equals("P")) 
            System.out.println("Paper eats rock. You lose!!"); 
    else if (personPlay.equals("P")) 
       if (computerPlay.equals("S")) 
       System.out.println("Scissor cuts paper. You lose!!"); 
    else if (computerPlay.equals("R")) 
            System.out.println("Paper eats rock. You win!!"); 
    else if (personPlay.equals("S")) 
         if (computerPlay.equals("P")) 
         System.out.println("Scissor cuts paper. You win!!"); 
    else if (computerPlay.equals("R")) 
            System.out.println("Rock breaks scissors. You lose!!"); 
    else 
         System.out.println("Invalid user input."); 
}

}


Antwoord 1, autoriteit 100%

Ik zou aanraden om steen-, papier- en schaarobjecten te maken. De objecten zouden de logica hebben van zowel vertalen van/naar Strings als ook “weten” wat wat beter is dan wat. De Java-enum is hier perfect voor.

public enum Type{
  ROCK, PAPER, SCISSOR;
  public static Type parseType(String value){
     //if /else logic here to return either ROCK, PAPER or SCISSOR
     //if value is not either, you can return null
  }
}

De methode parseTypekan nullretourneren als de tekenreeks geen geldig type is. En je code kan controleren of de waarde null is en zo ja, print “ongeldige probeer opnieuw” en loop terug om de scanner opnieuw te lezen.

Type person=null;
 while(person==null){
      System.out.println("Enter your play: "); 
      person= Type.parseType(scan.next());
      if(person ==null){
         System.out.println("invalid try again");
      }
 }

Bovendien kan uw type-enum bepalen wat beter is dan wat door elk Type-object te laten weten:

public enum Type{
    //...
    //each type will implement this method differently
    public abstract boolean beats(Type other);
}

elk type zal deze methode op een andere manier implementeren om te zien wat beter is dan wat:

ROCK{
   @Override
   public boolean beats(Type other){            
        return other ==  SCISSOR;
   }
}
 ...

Vervolgens in uw code

Type person, computer;
   if (person.equals(computer)) 
   System.out.println("It's a tie!");
  }else if(person.beats(computer)){
     System.out.println(person+ " beats " + computer + "You win!!"); 
  }else{
     System.out.println(computer + " beats " + person+ "You lose!!");
  }

Antwoord 2

Je zou zoiets als dit kunnen invoegen:

personPlay = "B";
while (!personPlay.equals("R") && !personPlay.equals("P") && !personPlay.equals("S")) {
    //Get player's play from input-- note that this is 
    // stored as a string 
    System.out.println("Enter your play: "); 
    personPlay = scan.next();
    //Make player's play uppercase for ease of comparison 
    personPlay = personPlay.toUpperCase();
    if (!personPlay.equals("R") && !personPlay.equals("P") && !personPlay.equals("S"))
        System.out.println("Invalid move. Try again.");
}

Antwoord 3

Voordat we het probleem met ongeldige tekens proberen op te lossen, veroorzaakt het ontbreken van accolades rond de ifen else if-instructies grote schade aan de logica van uw programma. Verander het in dit:

if (personPlay.equals(computerPlay)) {
   System.out.println("It's a tie!");
}
else if (personPlay.equals("R")) {
   if (computerPlay.equals("S")) 
      System.out.println("Rock crushes scissors. You win!!");
   else if (computerPlay.equals("P")) 
        System.out.println("Paper eats rock. You lose!!");
}
else if (personPlay.equals("P")) {
   if (computerPlay.equals("S")) 
       System.out.println("Scissor cuts paper. You lose!!"); 
   else if (computerPlay.equals("R")) 
        System.out.println("Paper eats rock. You win!!");
} 
else if (personPlay.equals("S")) {
     if (computerPlay.equals("P")) 
         System.out.println("Scissor cuts paper. You win!!"); 
     else if (computerPlay.equals("R")) 
        System.out.println("Rock breaks scissors. You lose!!");
}
else 
     System.out.println("Invalid user input.");

Veel duidelijker! Het is nu eigenlijk een fluitje van een cent om de slechte karakters te vangen. U moet de else-instructie verplaatsen naar een plaats waar de fouten worden opgevangen voordatu iets anders probeert te verwerken. Dus verander alles in:

if( /* insert your check for bad characters here */ ) { 
     System.out.println("Invalid user input.");
}
else if (personPlay.equals(computerPlay)) {
   System.out.println("It's a tie!");
}
else if (personPlay.equals("R")) {
   if (computerPlay.equals("S")) 
      System.out.println("Rock crushes scissors. You win!!");
   else if (computerPlay.equals("P")) 
        System.out.println("Paper eats rock. You lose!!");
}
else if (personPlay.equals("P")) {
   if (computerPlay.equals("S")) 
       System.out.println("Scissor cuts paper. You lose!!"); 
   else if (computerPlay.equals("R")) 
        System.out.println("Paper eats rock. You win!!");
} 
else if (personPlay.equals("S")) {
     if (computerPlay.equals("P")) 
         System.out.println("Scissor cuts paper. You win!!"); 
     else if (computerPlay.equals("R")) 
        System.out.println("Rock breaks scissors. You lose!!");
}

Antwoord 4

Waarom controleert u niet wat de gebruiker heeft ingevoerd en vraagt u de gebruiker vervolgens opnieuw om de juiste invoer in te voeren?

bijvoorbeeld:

//Get player's play from input-- note that this is 
// stored as a string 
System.out.println("Enter your play: "); 
response = scan.next();
if(response=="R"||response=="P"||response=="S"){
  personPlay = response;
}else{
  System.out.println("Invaild Input")
}

controleer voor de andere aanpassingen mijn totale code op pastebin


Antwoord 5

int w =0 , l =0, d=0, i=0;
    Scanner sc = new Scanner(System.in);
// try tentimes
    while (i<10) {
        System.out.println("scissor(1) ,Rock(2),Paper(3) ");
        int n = sc.nextInt();
        int m =(int)(Math.random()*3+1);
        if(n==m){
            System.out.println("Com:"+m +"so>>> " + "draw");
            d++;
        }else if ((n-1)%3==(m%3)){
            w++;
            System.out.println("Com:"+m +"so>>> " +"win");
        }
        else if(n >=4 )
        {
            System.out.println("pleas enter correct number)");
    }
        else {
            System.out.println("Com:"+m +"so>>> " +"lose");
            l++;
        }
        i++;

Other episodes