岩纸剪刀游戏 - 效率?

时间:2015-11-19 20:32:03

标签: java

我为我的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();
  }
}

2 个答案:

答案 0 :(得分:2)

这完全取决于游戏&#34;游戏的概念。是。如果假设一场比赛是单轮RPS,没有得分,那么老师的处方解决方案就会很好。

但是,一旦你需要在轮次之间保留某种形式的会话状态,例如得分,那么你必须做出一个设计决定:跑步者是否包含保持得分的逻辑,还是游戏?通常情况下,人们会让游戏保持得分,而跑步者应该尽可能少地了解游戏的内部逻辑。

在另一种情况下,可能会要求您扩展跑步者,以便您可以在两种不同的游戏中进行选择。第二场比赛可能是&#34; Black Jack&#34;,在这种情况下,你不仅需要保持得分,还要跟踪哪些牌已经被比赛。正如你所看到的那样,跑步者的复杂性会随着你老师的方法而不必要地增长。

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

答案 1 :(得分:0)

我会说每一轮Rock / Paper / Scissors都是独立于其他所有人的。我会编写一个方法,接受玩家1和2的值,并返回一个胜利者。让它工作,然后把它放在游戏循环中一遍又一遍地播放。

可能存在第二个重载版本的play()方法,其中嵌入式计算机播放器随机选择并调用双人版本。

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

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