0

私は学校でプロジェクトに取り組んでいます。列挙型の値を循環させる方法はたくさん見つかりましたが、すべての検索で、列挙型の値を保持する一連の変数を循環させる方法が見つかりませんでした。

いくつかのコンテキスト: プロジェクトは TicTacToe ゲームです。プロジェクトを完了するために作成する必要がある列挙型と一連のメソッドが与えられました。メソッドのシグネチャを変更することは許可されておらず、提供されたコンストラクト内で動作するようにする必要があります。また、これまでクラスで学んだことに限定されています。つまり、リスト マップと配列はオプションではありません。列挙型は、X、O、および EMPTY の 3 つの値を保持します。次に、ゲーム ボード上の 9 つの位置を表す 9 つの変数があります。

    public enum Marker
{
    EMPTY,
    X,
    O
};

private static Marker position1 = Marker.EMPTY;
private static Marker position2 = Marker.EMPTY;
private static Marker position3 = Marker.EMPTY;
private static Marker position4 = Marker.EMPTY;
private static Marker position5 = Marker.EMPTY;
private static Marker position6 = Marker.EMPTY;
private static Marker position7 = Marker.EMPTY;
private static Marker position8 = Marker.EMPTY;
private static Marker position9 = Marker.EMPTY;

private static Marker turn = Marker.X;

同点かどうかをチェックするメソッドに取り組んでいます。したがって、位置変数を循環させて、それぞれが != Marker.EMPTY であることをテストする必要があります。私は巨大な条件付きステートメントを書こうとしていましたが、うまくいくと確信していますが、もっと良い方法が必要です。約30分の検索の後、ここにいます。どんな助けでも大歓迎です。

4

3 に答える 3

0

どのような種類のコレクションも本当に使用できない場合は、ブール演算子を使用することをお勧めします。つまり、次のようなものです。どのポジションも ではない場合、ボードはいっぱいなMarker.EMPTYので、単に戻ることができますposition1 != Marker.EMPTY && position2 != Marker.EMPTY && ...;if/else if/.../elseそれほどきれいではありませんが、大きなブロックよりもはるかに簡潔です。

private static boolean isBoardFull() {
  return position1 != Marker.EMPTY &&
         position2 != Marker.EMPTY &&
         position3 != Marker.EMPTY &&
         position4 != Marker.EMPTY &&
         position5 != Marker.EMPTY &&
         position6 != Marker.EMPTY &&
         position7 != Marker.EMPTY &&
         position8 != Marker.EMPTY &&
         position9 != Marker.EMPTY ;
}

これを「SOME ポジションが空でない場合、ボードはいっぱいです」と書くこともできます。

private static boolean isBoardFull() {
  return !( position1 == Marker.EMPTY ||
            position2 == Marker.EMPTY ||
            position3 == Marker.EMPTY ||
            position4 == Marker.EMPTY ||
            position5 == Marker.EMPTY ||
            position6 == Marker.EMPTY ||
            position7 == Marker.EMPTY ||
            position8 == Marker.EMPTY ||
            position9 == Marker.EMPTY );
}

他のものが利用可能であれば、より適切なオプションがいくつかあります。たとえばfor、位置を含む配列に対してループを使用できますか? (実際には、配列、または Iterable を実装するものを使用できます。) たとえば、まだ 9 つの変数が必要な場合:

private static Marker position1 = Marker.EMPTY;
private static Marker position2 = Marker.EMPTY;
private static Marker position3 = Marker.EMPTY;
private static Marker position4 = Marker.EMPTY;
private static Marker position5 = Marker.EMPTY;
private static Marker position6 = Marker.EMPTY;
private static Marker position7 = Marker.EMPTY;
private static Marker position8 = Marker.EMPTY;
private static Marker position9 = Marker.EMPTY;
private static Marker positions[] = new Marker[] { position1, position2, position3,
                                                   position4, position5, position6,
                                                   position7, position8, position9 };

private static boolean isBoardFull() {
  for ( Marker position : positions ) {
    if ( position == Marker.EMPTY ) {
      return false;
    }
  }
  return true;
}

ただし、理想的には、9 つ​​の変数を持たず、事前に位置の数を知る必要のないものが必要であり、配列 (または他の Iterable、おそらく順序付けられたコレクション) だけで作業します。 :

private static Marker positions[9];
static { 
  for ( int i=0; i < positions.length; i++ ) {
    positions[i] = Marker.EMPTY;
  }
}

さらに良いことに、リストなどのコレクションを使用できる場合は、反復を記述する必要さえなく、Collection.containsを使用するだけです。

private static List<Marker> positions = /* ... */;

private static boolean isBoardFull() {
  return !positions.contains( Marker.EMPTY );
}
于 2013-11-06T03:09:06.040 に答える
0

9 つの Marker オブジェクトの配列、または 3 x 3 Marker オブジェクトの 2 次元配列がある場合、それらをループすることができます。

それ以外の場合は、リフレクションを使用してマーカー型のすべての変数を見つけることができますが、これはおそらくクラスの範囲外です。

于 2013-11-06T03:10:24.350 に答える
0

9 つの個別の位置変数を使用しないでください。サイズ 9 の配列を 1 つ持つ。

private Marker positions = new Marker[9]; 

...

次に、それらを使用する前に-

Arrays.fill(positions,Marker.EMPTY);

...

以降

for (Marker position : positions) {
   ...
}
于 2013-11-06T03:13:27.210 に答える