0

明らかにJavaを学んでいます。ゲームをうまく動かすことができました。しかし、ユーザーが R/P/S 以外のものを入力すると、デフォルトで Rock になるようにする必要があります。ループする必要はありません。岩を置くとゲームは完璧に機能します。RPS 以外のものを入れても完璧に動作し、デフォルトでロックします。ただし、紙またははさみを実行すると、紙とはさみの答えが得られ、デフォルトで岩の答えが得られます。これが機能しない理由についてのヒントはありますか?

また、私の方向は間違っていますか?私はこれをより良い方法で行うことができますか?これは本当に...せいぜいエレガントではありません。

    public static void main(String[] args) {
            // TODO Auto-generated method stub
    Scanner in = new Scanner(System.in);
    String userChoice="", userInput, compChoice="";
    int ranInt = (int)(Math.random()*3);
    if (ranInt == 0){
            compChoice = "Rock";
    } else if (ranInt == 1){
            compChoice = "Paper";
    }else if (ranInt == 2){
            compChoice = "Scissors";
    }
    System.out.println("Please select one of [R/P/S]: ");
            userInput = in.next();

    if(userInput.equalsIgnoreCase("p")){
            userChoice = "Paper ";
            if(compChoice.equalsIgnoreCase("Rock")){
                    System.out.println("You chose: "+userChoice);
                    System.out.println("I chose: "+compChoice);
                    System.out.println(userChoice + "beats "+compChoice +"- you win!");
            }else if (compChoice.equalsIgnoreCase("Paper")){
                    System.out.println("You chose: "+userChoice);
                    System.out.println("I chose: "+compChoice);
                    System.out.println("A tie!");
            }else if(compChoice.equalsIgnoreCase("Scissors")){
                    System.out.println("You chose: "+userChoice);
                    System.out.println("I chose: "+compChoice);
                    System.out.println(compChoice + " beats " + userChoice + " - i win!");
                    }
            }

    if(userInput.equalsIgnoreCase("S")){
            userChoice = "Scissors ";
            if(compChoice.equalsIgnoreCase("Paper")){
                    System.out.println("You chose: "+userChoice);
                    System.out.println("I choce: "+compChoice);
                    System.out.println(userChoice + "beats "+compChoice +"- you win!");
            }else if(compChoice.equalsIgnoreCase("Scissors")){
                    System.out.println("You chose: "+userChoice);
                    System.out.println("I chose: "+compChoice);
                    System.out.println("A tie!");
            }else if(compChoice.equalsIgnoreCase("Rock")){
                    System.out.println("You chose: "+userChoice);
                    System.out.println("I chose: "+compChoice);
                    System.out.println(compChoice + " beats " + userChoice + " - i win!");
                    }
            }              
    if(userInput.equalsIgnoreCase("R")){
            userChoice = "Rock ";
            if(compChoice.equalsIgnoreCase("Rock")){
                    System.out.println("You chose: "+userChoice);
                    System.out.println("I chose: "+compChoice);
                    System.out.println("A Tie!");
            }else if(compChoice.equalsIgnoreCase("Paper")){
                    System.out.println("You chose: "+userChoice);
                    System.out.println("I chose: "+compChoice);
                    System.out.println(compChoice + " beats " + userChoice + " - you lose!");
            }else if(compChoice.equalsIgnoreCase("Scissors")){
                    System.out.println("You chose: "+userChoice);
                    System.out.println("I chose: "+compChoice);
                    System.out.println(userChoice + " beats " + compChoice + " - you win!");
                    }
            }
    else {
            userChoice = "";
            System.out.println("Invalid selection, defaulting to rock.");
            if(compChoice.equalsIgnoreCase("Rock")){
                    System.out.println("You chose: Rock");
                    System.out.println("I chose: "+compChoice);
                    System.out.println("A Tie!");
            }else if (compChoice.equalsIgnoreCase("Paper")){
                    System.out.println("You chose: Rock");
                    System.out.println("I chose: "+compChoice);
                    System.out.println(compChoice + " beats " + "Rock - you lose!");
            } else if(compChoice.equalsIgnoreCase("Scissors")){
                    System.out.println("You chose: Rock");
                    System.out.println("I chose: "+compChoice);
                    System.out.println("Rock beats " + compChoice + " - you win!");
                    } 
            }
    }

}

4

3 に答える 3

3

疑似コードでは、コードの構造は次のとおりです。

if (paper) {
    process paper
}

if (scissors) {
    process scissors
}

if (rock) {
    process rock
} else {
    process default rock
}

(ケースは相互に排他的であるため) paperorscissorsが true の場合、 thenrockは false であり、elseが実行されることに注意してください。構造を次のように変更するだけです。

if (paper) {
    process paper
} else if (scissors) {
    process scissors
} else if (rock) {
    process rock
} else {
    process default rock
}
于 2013-02-08T05:22:04.670 に答える
3

コードelse ifには「S」分岐と「R」分岐が必要です。それ以外の場合、ロジックは次のように進みます (「S」入力の場合)。

if (P) do something // いいえ、だから先に進む
if (S) do something // はい、だから 'S' を
する if (R) do something else do something different // 'R' ではないので、何か違うことをする.

コードに「エレガンス」を追加するアイデアについては、 Rock、Paper、Scissorsの Rosetta Code ページをご覧ください。

于 2013-02-08T05:22:34.513 に答える
1

「エレガントな」ソリューションについて質問しましたが、これを行う1つの方法は、勝利マトリックスを使用することです。つまり、次のようなものです。

public enum RPS {
   ROCK, PAPER, SCISSORS;

   public int test(RPS otherRps) {
      int[][] winMatrix = { 
            {  0, -1,  1 }, 
            {  1,  0, -1 }, 
            { -1,  1,  0 } };
      return winMatrix[ordinal()][otherRps.ordinal()];
   }
}

次に、列挙型の test(...) メソッドを呼び出すだけで結果をテストできます。例えば:

import java.util.Random;
import java.util.Scanner;

public class RockPaperScissors {
   private static Random random = new Random();
   private static Scanner in = new Scanner(System.in);

   public static void main(String[] args) {
      RPS compChoice = RPS.values()[random.nextInt(RPS.values().length)];
      RPS userChoice = getUserChoice();

      String result = "";
      switch (userChoice.test(compChoice)) {
      case 1:
         result = "you win!";
         break;

      case -1:
         result = "you lose!";
         break;

      case 0:
         result = "it's a tie";

      default:
         break;
      }
      System.out.printf("You chose %s, the computer chose %s, %s%n",
            userChoice, compChoice, result);
   }

   private static RPS getUserChoice() {
      System.out.print("Please select one of [R/P/S]: ");
      String userChoiceStr = in.nextLine().trim();
      if (userChoiceStr.isEmpty()) {
         return RPS.ROCK;
      }
      for (RPS rps : RPS.values()) {
         if (rps.toString().startsWith(userChoiceStr.toUpperCase())) {
            return rps;
         }
      }

      return RPS.ROCK; // default
   }
}
于 2013-02-08T05:54:45.723 に答える