2017-03-27 8 views
0

ロック、ペーパー、はさみのゲームのコードセクションを作成しています。私はコンピュータが勝つかどうかに応じて1、0、または-1を返すメソッドを書いています。それはそれぞれ同型か、ユーザーが勝ちます。私は今までこのコードを持っています。ネストされたスイッチステートメントのReturn文がありません

private int nextPlay(char computerMove, char playerMove) { 
    switch (playerMove) { 
     case 'R': switch (computerMove) { 
      case 'R': return 0; 
      case 'P': return 1; 
      case 'S': return -1; 
     } 
     case 'P': switch (computerMove) { 
      case 'R': return -1; 
      case 'P': return 0; 
      case 'S': return 1; 
     } 
     case 'S': switch (computerMove) { 
      case 'R': return 1; 
      case 'P': return -1; 
      case 'S': return 0; 
     } 
    } 
} 

最後の括弧のところに私に "Missing Return Statement"がスローされます。助言がありますか?

P.S. computerMoveとplayerMoveの両方で使用できるオプションは、R、P、Sです。

+3

デフォルトの場合を追加し、エラー処理を実行します –

+3

'' playerMove'が '' R'''、 '' P'''、 '' S''でないとどうなりますか?コンパイラが知っている限り、それは任意の文字値を持つことができます。 Addメソッドの最後に新しいIllegalStateExceptionをスローする(「おっと!私は台無し!!」) ' – Andreas

+1

コンパイラは、利用可能なオプションが 'R'、' P'、 'S'のみであることを知りません。その観点から見ると、彼らは他の性格を持つことができます。 – ajb

答えて

0

switchステートメントにdefaultを追加するように指示されている人はいません。この場合はまったく必要ありませんが、従うのは一般的なルールです。

はしかし、あなたはplayerMoveおよび/またはcomputerMoveは3つの期待値('R''P'、または'S')のいずれかを持っていない場合はどうするか検討する必要があります。

computerMoveがない場合、あなたは外switchステートメントを終了するには、論理の流れをしたいのではなく、次のcaseに通って落下したい(技術的に、彼らはすべてちょうどそのを通じて落ちるが、それでもだろうが)、これを追加各外側にbreakがあります。case

これが壊れた場合、またはplayerMoveに有効な値がない場合、ロジックフローはメソッドの終了になり、そこにはreturnステートメントがありません。 そのはコンパイルエラーです。あなたがうまくいけば、その状況に入ることができないので、ここで

最良の解決策は、それが例外、すなわちthrowExceptionであることを宣言することです。あなたのコードは可能性があり

private int nextPlay(char computerMove, char playerMove) { 
    switch (playerMove) { 
     case 'R': 
      switch (computerMove) { 
       case 'R': return 0; 
       case 'P': return 1; 
       case 'S': return -1; 
      } 
      break; 
     case 'P': 
      switch (computerMove) { 
       case 'R': return -1; 
       case 'P': return 0; 
       case 'S': return 1; 
      } 
      break; 
     case 'S': 
      switch (computerMove) { 
       case 'R': return 1; 
       case 'P': return -1; 
       case 'S': return 0; 
      } 
      break; 
    } 
    throw new IllegalStateException("Oops! I messed up!!"); 
} 

しかし、それは、より説明的なエラーメッセージと良いでしょう:

private int nextPlay(char computerMove, char playerMove) { 
    switch (playerMove) { 
     case 'R': 
      switch (computerMove) { 
       case 'R': return 0; 
       case 'P': return 1; 
       case 'S': return -1; 
      } 
      throw new IllegalArgumentException("Invalid computer move: " + computerMove); 
     case 'P': 
      switch (computerMove) { 
       case 'R': return -1; 
       case 'P': return 0; 
       case 'S': return 1; 
      } 
      throw new IllegalArgumentException("Invalid computer move: " + computerMove); 
     case 'S': 
      switch (computerMove) { 
       case 'R': return 1; 
       case 'P': return -1; 
       case 'S': return 0; 
      } 
      throw new IllegalArgumentException("Invalid computer move: " + computerMove); 
    } 
    throw new IllegalArgumentException("Invalid player move: " + playerMove); 
} 

さて、あなたは代わりにdefault句でそれらのthrowのステートメントを追加することができます。同じ結果。

private int nextPlay(char computerMove, char playerMove) { 
    switch (playerMove) { 
     case 'R': 
      switch (computerMove) { 
       case 'R': return 0; 
       case 'P': return 1; 
       case 'S': return -1; 
       default: throw new IllegalArgumentException("Invalid computer move: " + computerMove); 
      } 
     case 'P': 
      switch (computerMove) { 
       case 'R': return -1; 
       case 'P': return 0; 
       case 'S': return 1; 
       default: throw new IllegalArgumentException("Invalid computer move: " + computerMove); 
      } 
     case 'S': 
      switch (computerMove) { 
       case 'R': return 1; 
       case 'P': return -1; 
       case 'S': return 0; 
       default: throw new IllegalArgumentException("Invalid computer move: " + computerMove); 
      } 
     default: throw new IllegalArgumentException("Invalid player move: " + playerMove); 
    } 
} 
0

私の提案

public static void main(String[] args) 
     { 
      Scanner scan = new Scanner(System.in); 

      int x=nextPlay('R','P'); 
      System.out.println(x); 
     } 
     private static int nextPlay(char computerMove, char playerMove) 
     { 
      if(playerMove=='R') 
      { 
       if(computerMove=='R') 
        return 0; 
       else if(computerMove=='P') 
        return 1; 
       else 
        return -1; 
      } 
      else if(playerMove=='P') 
      { 
       if(computerMove=='R') 
        return -1; 
       else if(computerMove=='P') 
        return 0; 
       else 
        return 1; 
      } 
      else 
      { 
       if(computerMove=='R') 
        return 1; 
       else if(computerMove=='P') 
        return -1; 
       else 
        return 0; 
      } 
     } 
0

ありがとうみんな!私は、各switchステートメントのケースの1つをデフォルトに設定することにしました(もちろん、それはどの文字であるかを追跡しています)。

charが意図したもの以外のものであれば問題が発生する可能性がありますが、私の先生はそれは大丈夫だと言い、次回は別の方法を使用します。

関連する問題