我应该使用全局变量吗?如果没有,我该如何解决?

时间:2013-09-29 14:43:41

标签: java global-variables

我刚刚开始学习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游戏。

6 个答案:

答案 0 :(得分:0)

您需要为它们提供值。例如:

int realRow = 0; 
int realColumn = 0;

如果将变量声明为类成员,则它们的默认值为0。例如,此类的成员fiels将具有默认值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
}

答案 1 :(得分: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;

但我不推荐它,因为如果你在分配任何实际值之前使用变量,编译器就无法发出警告。

答案 2 :(得分:0)

如果userRowuserColumn的唯一有效值为(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);
  }
}

答案 3 :(得分: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(或其他一些选定值)必须是realRow 的可接受值。

如果不是这样,您应该考虑在default:中抛出异常。

或者,如果您确信userRow始终为0,1或2(或者您很高兴默认为其中一个案例),则可以将其中一个案例设为默认值:

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

同样适用于realColumn

答案 4 :(得分:0)

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

此方法可以返回状态 - 游戏赢了,游戏未完成,非法移动,如果你还没有验证过。

答案 5 :(得分:0)

它不是变量范围的问题。你只搜索1 2的情况3.如果有不同的值?你必须添加一个默认情况。