-1

Java の学習を始めたばかりで、変数のスコープの処理に問題があります。

public static void updateBoard(String[][] gameBoard, int gameTurn, int[] coords) {
    int userRow = coords[0];
    int userColumn = coords[1];
    int realRow;
    int realColumn;

    // Convert user rows and columns to actual indexes in board-matrix
    switch (userRow) {
    case 0: realRow = 1; break;
    case 1: realRow = 3; break;
    case 2: realRow = 5; break;
    }

    switch (userColumn) {
    case 0: realColumn = 2; break;
    case 1: realColumn = 6; break;
    case 2: realColumn = 10; break;
    }

    if (gameTurn % 2 == 0) 
        java.util.Arrays.fill(gameBoard[realRow], realColumn, realColumn + 1, "X");
    else
        java.util.Arrays.fill(gameBoard[realRow], realColumn, realColumn + 1, "O");

そのため、if ステートメントの realRow 変数と realColumn 変数は初期化されません。グローバル変数についてはまだ学んでいません。switch ステートメント内の変数を使用せずにこれを解決する方法について、私は無知です。これを解決する方法についてのアイデアはありますか? ところで、これは単純な Tic-Tac-Toe ゲーム用です。

4

6 に答える 6

0

変数のスコープの問題ではありません。1 2 3 のケースのみを検索します。別の値がある場合はどうすればよいですか?デフォルトのケースを追加する必要があります。

于 2013-09-29T14:54:03.583 に答える
0

デフォルトのケースを switch ステートメントに追加して、誤った入力を取得した場合でも変数に常に値が与えられるようにします。例えば:

switch (userColumn) {
case 0: realColumn = 2; break;
case 1: realColumn = 6; break;
case 2: realColumn = 10; break;
default: realColumn = -1;
}

別の方法は、変数を次のように宣言するときにデフォルト値を与えることです

int realColumn = 0;

ただし、実際の値が割り当てられる前に変数を使用すると、コンパイラは警告を表示できないため、お勧めしません。

于 2013-09-29T14:47:30.513 に答える
0

userRowとの唯一の有効な値userColumnが (0,1,2) の場合、defaultそうでない場合に失敗するケースが必要です。

switch (userRow) {
case 0: realRow = 1; break;
case 1: realRow = 3; break;
case 2: realRow = 5; break;
default:
  throw new IllegalArgumentException(
      "userRow must be in [0-2], not " + userRow);
}

これで、初期化せずにrealRow最後まで到達することはないswitchので、後で使用できます。

行と列の変換コードをいつでも別のメソッドに移動して、何が初期化されたかを明確にすることができます

   int realRow = userRowToRealRow(userRow);

   ...

private static int userRowToRealRow(int userRow) {
  switch (userRow) {
    case 0: return 1;
    case 1: return 3;
    case 2: return 5;
    default:
      throw new IllegalArgumentException(
          "userRow must be in [0-2], not " + userRow);
  }
}
于 2013-09-29T14:48:02.587 に答える
0

問題は、userRowが 0、1、または 2 でrealRowない場合、初期化されないことです。

デフォルト値を指定する必要があります。

int realRow = 0;

またはdefault、スイッチに a を指定します。

switch (userRow) {
    case 0: realRow = 1; break;
    case 1: realRow = 3; break;
    case 2: realRow = 5; break;
    default: realRow = 0;
}

上記のソリューションでは、 0 (またはその他の選択された値)が の許容値でなければなりませrealRow

これが当てはまらない場合は、default:代わりに例外をスローすることを検討する必要があります。

userRowまたは、が常に 0、1、または 2 であると確信している場合(または、いずれかのケースをデフォルトにすることに満足している場合)、代わりにケースの 1 つをデフォルトにすることができます。

switch (userRow) {
    case 0: realRow = 1; break;
    case 1: realRow = 3; break;
    default: realRow = 5; // case 2
}

についても同様ですrealColumn

于 2013-09-29T14:48:09.870 に答える
0

ゲームボードを表すクラスを作成します。ボードの現在の状態を表すインスタンス変数 (スコープは、クラス内の 1 つのメソッドではなく、クラス全体です)を持ちます。そのクラスに、ゲーム ボードを更新するメソッドを用意します。パラメーターとして、移動の行と列、およびそれが x か o かを受け取ることができます。

このメソッドは状態を返す可能性があります -- ゲームに勝った、ゲームが終了していない、不正な動き (まだ検証していない場合)。

于 2013-09-29T14:48:17.677 に答える
0

両方に値を指定する必要があります。例えば:

int realRow = 0; 
int realColumn = 0;

変数をクラス メンバーとして宣言すると、デフォルト値は0. たとえば、このクラスのメンバー フィールドのデフォルト値は次の0とおりです。

public class MyClass {
    private int realRow;
    private int realColumn;
}

switchステートメントが変数に値を提供しない場合を考えてみましょう。この場合、変数を正しく初期化するために、default内でステートメントを使用する必要があります。switch

switch (userColumn) {
    case 0: realColumn = 2; break;
    case 1: realColumn = 6; break;
    case 2: realColumn = 10; break;
    default: realColumn = 0; //for example
}
于 2013-09-29T14:46:00.693 に答える