2015-11-19 128 views
1

我为我的CS课(高中的高中)做了一个Rock Paper Scissors游戏,我的老师给了我shell文件,注意到我必须在runner循环中做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(); 
    } 
} 
+4

如果这段代码真的有效,那么这个问题可能更适合[CodeReview](http://codereview.stackexchange.com/)。 – Turing85

+0

我认为这更多地归结为你有你的输入(你的扫描仪)绑定到游戏模型(你的玩法)的事实。如果您想修改此代码以使用输入文件而不是标准输入,则需要修改播放方法。如果那是他们正在寻找的东西,那就不是肯定的,但这是我的第一个想法。 – mascoj

回答

0

我会说,每一轮的岩石/纸/剪刀是独立于所有其他人。我会写一个单一的方法,参与球员1和2的价值观,并返回一个胜利者。让它工作,然后把它放在游戏循环中反复播放。

可能会有一个嵌入式电脑播放器的play()方法的第二个重载版本,可以随机选择和调用双播放器版本。

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

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

2

这一切都取决于什么是“游戏”的概念。如果假设一场比赛是单轮RPS,而没有得分,那么老师的处方解决方案就会很好。

但是,只要您需要在各回合之间保留某种形式的会话状态(例如分数),那么您将不得不做出设计决定:跑步者是否包含保持得分的逻辑,还是游戏?通常情况下,人们会让游戏保持得分,而跑步者应该尽可能少地了解游戏的内部逻辑。

在另一种情况下,您可能会被要求扩展亚军,以便您可以选择两种不同的游戏。第二场比赛可能是“黑杰克”,在这种情况下,你不仅需要保持得分,还要跟踪已经玩过的牌。正如你所看到的那样,运动员的复杂性可能随着老师的方法而不必要地增加。

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