我刚刚开始学习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游戏。
答案 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)
如果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);
}
}
答案 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.如果有不同的值?你必须添加一个默认情况。