-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 语句中的变量的情况下解决这个问题一无所知。关于如何解决这个问题的任何想法?顺便说一句,这是一个简单的井字游戏。

4

6 回答 6

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 回答
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如果and的唯一有效值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为开关提供一个:

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

对于上述解决方案,0(或其他选择的值)必须是可接受的值realRowto have

如果这不是真的,您应该考虑抛出异常default:

或者,如果您确信它userRow始终为 0、1 或 2(或者您很乐意默认其中一种情况),您可以将其中一种情况设为默认值:

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

创建一个代表您的游戏板的类。它会有实例变量——它们的作用域是整个类,而不是类中的一个方法——代表板的当前状态。在该类中有一个更新游戏板的方法——它可以将移动的行和列以及它是 x 还是 o 作为参数。

这个方法可以返回一个状态——游戏赢了,游戏没有结束,非法移动,如果你还没有验证的话。

于 2013-09-29T14:48:17.677 回答
0

这不是变量范围的问题。您只搜索 1 2 3.如果有不同的值怎么办?您必须添加默认情况。

于 2013-09-29T14:54:03.583 回答