0

これはヤッツィー ゲーム用で、このメソッドは 5 つのサイコロの値を計算して返すことになっています。しかし、これは、ユーザーが選択したカテゴリのパラメーターによって渡される switch ステートメントと、可能な各カテゴリの for ループを使用して、これを行う愚かな方法ですか。私のデザインのアイデアよりも、これを行うためのはるかに簡単な方法はありますか?

private int assignScoreToCategory(int category)
{
    int computedScore = 0;
    println("dice: "+dice1+" "+dice2+" "+dice3+" "+dice4+" "+dice5);

    //  Switches on the category the user has selected.
    switch (category)
    {
    case ONES: 
        for (int i = 0; i < 4; i++){
            if (diceArray[i] == ONES){
                println(computedScore);
                computedScore++;
            }
        }break;

    case TWOS: 



        break;
    case THREES: break;
    case FOURS: break;
    case FIVES: break;
    case SIXES: println("cat 6");   break;
    case UPPER_SCORE: break;
    case UPPER_BONUS: break;
    case THREE_OF_A_KIND: break;
    case FOUR_OF_A_KIND: break;
    case FULL_HOUSE: break;
    case SMALL_STRAIGHT: break;
    case YAHTZEE: break;
    case CHANCE: break;
    case LOWER_SCORE: break;
    case TOTAL: break;
    default: return 0; 
    }
    return computedScore;
}
4

1 に答える 1

6

enumの代わりに間違いなく採用する必要がありintます。次に、さらなる改善として、switch ステートメントに含まれるロジックを列挙型のインスタンス メソッドに移動します。switchその後、1 回のメソッド呼び出しでを置き換えることができます。列挙型メンバーごとに異なる実装を提供する優れた構文があります。このアイデアを、インスタンス変数の助けを借りて、可能な限り多くの領域をカバーする単一の一般的なメソッドの実装と組み合わせます。

enum Category {
  private final int score;
  ... 
  ONES(1) { 
    public int score() { 
      int computedScore = 0;
      for (int i = 0; i < 4; i++) {
       if (diceArray[i] == ONES) {
          println(computedScore);
          computedScore++;
       }
      }
      return computedScore;
    }
  },
  ...,
  SIXES(6),
  ...;

  private Category(int score) { this.score = score; }

  public int score() { return this.score; }
}

より完全な例を挙げたいと思いますが、具体的なロジックはあまり提供されていません。

于 2012-10-09T20:06:04.117 に答える