摇滚,纸,剪刀游戏Java

我是编程的新手,我正在尝试用Java编写一个非常简单的Rock,Paper,Scissors游戏。 它会编译并运行正常,但我想说的是“无效的移动。再试一次。” 当用户(personPlay)没有输入正确的字符(r,p或s)时沿着这些行的某些东西。 最好的方法是什么? 例如,如果输入“q”,则应打印“无效移动”。 非常感谢你提前!

// ************* // 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."); } 

}

我建议制作Rock,Paper和Scissors对象。 这些对象的逻辑既可以转换为Strings,也可以“知道”什么是什么。 Java枚举非常适合这种情况。

 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 } } 

如果String不是有效类型,则parseType方法可以返回null 。 并且您的代码可以检查该值是否为null,如果是,则打印“invalid try again”并循环返回以重新读取扫描程序。

 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"); } } 

此外,您的类型枚举可以通过让每个Type对象知道什么来决定什么:

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

每种类型将以不同的方式实现此方法,以查看什么击败了什么:

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

然后在你的代码中

  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!!"); } 

你可以插入这样的东西:

 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."); } 

在我们尝试解决无效字符问题之前, ifelse if语句周围缺少大括号会对程序的逻辑造成严重破坏。 把它改成这个:

 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."); 

更清楚! 现在抓住坏人物实际上是件小事。 您需要将else语句移动到else 尝试处理其他任何内容之前捕获错误的位置。 所以改变一切:

 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!!"); } 

为什么不检查用户输入的内容,然后要求用户再次输入正确的输入?

例如:

 //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") } 

对于其他修改,请检查我的总代码在pastebin

 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++;