Java 石头剪刀布游戏-效率?

Java 石头剪刀布游戏-效率?,java,Java,我为我的CS班(高中四年级)做了一个石头剪子游戏,老师给我的shell文件指出,我必须在跑步者中加入do-while循环,但我不明白为什么?我的代码行得通,但她说最好在runner中编写?为什么?还有,我怎样才能写得更有效?(注意:我是一个完全的初学者,在上这门课之前,我对编码一无所知。我还没有学会递归。) 我的代码: import java.util.Random; import java.util.Scanner; public class RockPapersScissors { pr

我为我的CS班(高中四年级)做了一个石头剪子游戏,老师给我的shell文件指出,我必须在跑步者中加入do-while循环,但我不明白为什么?我的代码行得通,但她说最好在runner中编写?为什么?还有,我怎样才能写得更有效?(注意:我是一个完全的初学者,在上这门课之前,我对编码一无所知。我还没有学会递归。)

我的代码:

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();

  }
}

我想说,每一轮石头/布/剪刀都是独立的。我会编写一个方法,接受玩家1和2的值并返回一个获胜者。让它发挥作用,然后把它放在游戏循环中一遍又一遍地玩

可能存在第二个重载版本的play()方法,该方法带有一个嵌入式计算机播放器,可以随机选择并调用两个播放器版本

也许这也是你老师的意思。为什么不问问他们,而不是让我们了解他/她的想法?用苏格拉底的方法你可以学到很多东西


不要担心效率;对于这样一个微不足道的应用程序来说,这并不重要。让它运行;使其正确运行;让它快速运行。

这一切都取决于“游戏”是什么。如果游戏被假定为单轮RPS,没有记分,那么老师指定的解决方案是好的

然而,只要你需要在两轮比赛之间保持某种形式的状态,比如得分,那么你就必须做出一个设计决定:跑步者是否包含保持得分的逻辑,或者游戏是否包含?通常,一个人会让游戏记分,跑步者应该尽可能少地了解游戏的内部逻辑

在另一种情况下,可能会要求您展开跑步者,以便您可以在两种不同的游戏中进行选择。第二个游戏可能是“黑杰克”,在这种情况下,你不仅需要记录分数,还需要记录哪些牌已经玩过。正如你所看到的,跑步者的复杂性会随着你老师的方法而不必要地增加

老师应该给你更好的要求,或者你应该问。
顺便说一句,这种情况在现实世界中经常发生。

如果这段代码真的有效,那么这个问题可能更适合。我认为这更多地归结为你的输入(你的扫描器)与游戏模型(你的游戏方法)相关联的事实。如果您想修改此代码以使用输入文件而不是标准输入,则需要修改您的播放方法。如果那是他们想要的,那就不是积极的,但那是我的第一个想法。
public class RPSRunner {

  public static void main(String[] args) {
    RockPapersScissors test = new RockPapersScissors();
    test.play();
  }
}