我为我的CS课程(高中的高年级)制作了一个Rock Paper Scissors游戏,我的老师给我的shell文件指出我必须在跑步者中使用do while循环,但我不明白为什么?我的代码有效,但她说在跑步者中写它会更好吗?为什么?另外,如何更有效地编写它? (注意:我是一个初学者,在上课之前,他不知道编码。还没有学过递归。)
我的代码:
import java.util.Random;
import java.util.Scanner;
public class RockPapersScissors {
private String user;
private int computer;
public RockPapersScissors(){
setPlayers(" ");
}
public RockPapersScissors(String s){
setPlayers(s);
}
public void setPlayers(String s){
user=s;
}
public void play(){
Scanner keyboard = new Scanner(System.in);
Random num = new Random();
int numUser = 0;
String playAgain = "";
do{
System.out.print("Rock-Paper-Scissors - pick your weapon[R,P,S] :: ");
user = keyboard.next();
System.out.println("player has "+ user);
switch(user){
case "R": numUser = 0; break;
case "P": numUser = 1; break;
case "S": numUser = 2; break;
case "r": numUser = 0; break;
case "p": numUser = 1; break;
case "s": numUser = 2; break;
default: System.out.println("Please enter a valid choice. Restart game.\n"); continue;
}
computer = num.nextInt(3);
switch(computer){
case 0: System.out.println("computer has R"); break;
case 1: System.out.println("computer has P"); break;
case 2: System.out.println("computer has S"); break;
}
if(numUser == computer){
System.out.println("!Draw Game!");
}else if(numUser == 0){
if(computer == 1){
System.out.println("!Computer Wins <<Paper Covers Rock>>!");
}if(computer == 2){
System.out.println("!Player Wins <<Rock Breaks Scissors>>!");
}
}else if(numUser == 1){
if(computer == 2){
System.out.println("!Computer Wins <<Scissors cuts paper>>!");
}if(computer == 0){
System.out.println("!Player Wins <<Paper Covers Rock>>!");
}
}else if(numUser == 2){
if(computer == 0){
System.out.println("!Computer Wins <<Rock Breaks Scissors>>!");
}if(computer == 1){
System.out.println("!Player Wins <<Scissors cuts paper>>!");
}
}
System.out.print("\nDo you want to play again? ");
playAgain = keyboard.next();
System.out.println("\n");
}while(playAgain.equals("y") || playAgain.equals("yes") || playAgain.equals("Y"));
System.out.println("Goodbye.");
keyboard.close();
}
}
我的跑步者:
public class RPSRunner {
public static void main(String[] args) {
RockPapersScissors test = new RockPapersScissors();
test.play();
}
}
答案 0 :(得分:2)
这完全取决于游戏&#34;游戏的概念。是。如果假设一场比赛是单轮RPS,没有得分,那么老师的处方解决方案就会很好。
但是,一旦你需要在轮次之间保留某种形式的会话状态,例如得分,那么你必须做出一个设计决定:跑步者是否包含保持得分的逻辑,还是游戏?通常情况下,人们会让游戏保持得分,而跑步者应该尽可能少地了解游戏的内部逻辑。
在另一种情况下,可能会要求您扩展跑步者,以便您可以在两种不同的游戏中进行选择。第二场比赛可能是&#34; Black Jack&#34;,在这种情况下,你不仅需要保持得分,还要跟踪哪些牌已经被比赛。正如你所看到的那样,跑步者的复杂性会随着你老师的方法而不必要地增长。
老师应该给你更好的要求,或者你应该问。 顺便说一句,这种情况一直在现实世界中发生。
答案 1 :(得分:0)
我会说每一轮Rock / Paper / Scissors都是独立于其他所有人的。我会编写一个方法,接受玩家1和2的值,并返回一个胜利者。让它工作,然后把它放在游戏循环中一遍又一遍地播放。
可能存在第二个重载版本的play()方法,其中嵌入式计算机播放器随机选择并调用双人版本。
也许这就是你老师的意思。为什么不问他们而不是让我们读他/她的想法?你可以使用苏格拉底方法学到很多东西。
不要担心效率;对于这样一个微不足道的应用程序并不重要。让它运行;让它运行正常;让它快速运行。