Java- Returns 使用多维数组时值不正确
Java- Returns incorrect values while working with multidimensional Arrays
我正在做扫雷游戏,一切看起来都很好,直到昨天早上:我遇到了一个我自己无法解决的问题。
情况是这样的:我有 2 个二维数组,其中一个我生成了扫雷字段,其中包含生成的所有值,其中 9 表示炸弹 , 0 表示免费 space。让我们称之为 field。它是一个整数数组。基本上它是 9x9 字段。它有 +1 行零作为代码正常工作的框架。否则它 returns OutOfBoundsError 当 运行 代码在下面列出时。
示例:
00000000000 0
00000019100 1
01110011100 2
02910000000 3
09321110000 4
02911910000 5
01111111110 6
01110112910 7
02920192110 8
02920111000 9
01110000000 10
00000000000 11
我的第二个数组是字符串数组user_field,它是空白的(所有null
字段都被.
替换),这里是输入命令用户将打开 .
个字段。
........... 1
........... 2
........... 3
........... 4
........... 5
........... 6
........... 7
........... 8
........... 9
........... 10
........... 11
........... 12
它必须从 字段 开始输出所有 0 以及它们周围的所有值。示例:
nnn 1
n0n 2
nnn 3
我用这段代码调用它:
for (int i = 1; i < field_h-2; i++) {
for (int j = 1; j < field_w-2; j++) {
if (user_field[i][j]==null) {
user_field[i][j]=".";
}
if(field[i][j]==0) {
for(int k = 0; k< 3; k++) {
for (int n = 0; n< 3; n++) {
user_field[i-1+k][j-1+n] = String.valueOf(field[i-1+k][j-1+n]);
//System.out.print(String.valueOf(field[i-1+k][j-1+n]));
}
}
}
System.out.print(user_field[i][j]);
}
System.out.println(" "+ (i));
}
但实际上,它输出(n-表示值,x-表示无。):
xxx 1
x0n 2
nnn 3
我不知道为什么会这样。有谁可以帮助我吗?我对Java没那么有经验,可能有什么不懂。
我将仅考虑第二行(即x0n
)来解释问题,但我的推理自然适用于上一行和下一行。
您的程序执行此操作:
原来user_field
是xxx
,field
是n0n
(假设是102
)。
你看field
的第一个元素。它是 1
,因此它不是 0
,因此您不要对 user_field
进行任何更改。然后你立即打印 user_field
的第一个元素,此时它仍然是 x
。到目前为止你打印了 x
.
您移动到 field
的第二个元素。它为零,因此您更新 user_field
的第一个和第三个元素。但是那时 你已经打印了 user_field
的第一个元素。现在field
是102
,user_field
是102
,但是你已经打印了x
。现在你打印 user_field
的第二个元素,所以你最终打印 x0
.
您移动到 field
的第三个元素。它不是 0
,因此您不做任何更改。你打印 user_field
的第三个元素,此时是 2
,所以你最终打印 x02
,而所需的输出是 102
.
要修复它,请将循环分成两部分。在第一个循环中计算 user_field
,并在第二个循环中打印它。大致如下:
for (int i = 1; i < field_h-2; i++) {
for (int j = 1; j < field_w-2; j++) {
if (user_field[i][j]==null) {
user_field[i][j]=".";
}
if(field[i][j]==0) {
for(int k = 0; k< 3; k++) {
for (int n = 0; n< 3; n++) {
user_field[i-1+k][j-1+n] = String.valueOf(field[i-1+k][j-1+n]);
//System.out.print(String.valueOf(field[i-1+k][j-1+n]));
}
}
}
}
}
for (int i = 1; i < field_h-2; i++) {
for (int j = 1; j < field_w-2; j++) {
System.out.print(user_field[i][j]);
}
System.out.println(" "+ (i));
}
我正在做扫雷游戏,一切看起来都很好,直到昨天早上:我遇到了一个我自己无法解决的问题。 情况是这样的:我有 2 个二维数组,其中一个我生成了扫雷字段,其中包含生成的所有值,其中 9 表示炸弹 , 0 表示免费 space。让我们称之为 field。它是一个整数数组。基本上它是 9x9 字段。它有 +1 行零作为代码正常工作的框架。否则它 returns OutOfBoundsError 当 运行 代码在下面列出时。 示例:
00000000000 0
00000019100 1
01110011100 2
02910000000 3
09321110000 4
02911910000 5
01111111110 6
01110112910 7
02920192110 8
02920111000 9
01110000000 10
00000000000 11
我的第二个数组是字符串数组user_field,它是空白的(所有null
字段都被.
替换),这里是输入命令用户将打开 .
个字段。
........... 1
........... 2
........... 3
........... 4
........... 5
........... 6
........... 7
........... 8
........... 9
........... 10
........... 11
........... 12
它必须从 字段 开始输出所有 0 以及它们周围的所有值。示例:
nnn 1
n0n 2
nnn 3
我用这段代码调用它:
for (int i = 1; i < field_h-2; i++) {
for (int j = 1; j < field_w-2; j++) {
if (user_field[i][j]==null) {
user_field[i][j]=".";
}
if(field[i][j]==0) {
for(int k = 0; k< 3; k++) {
for (int n = 0; n< 3; n++) {
user_field[i-1+k][j-1+n] = String.valueOf(field[i-1+k][j-1+n]);
//System.out.print(String.valueOf(field[i-1+k][j-1+n]));
}
}
}
System.out.print(user_field[i][j]);
}
System.out.println(" "+ (i));
}
但实际上,它输出(n-表示值,x-表示无。):
xxx 1
x0n 2
nnn 3
我不知道为什么会这样。有谁可以帮助我吗?我对Java没那么有经验,可能有什么不懂。
我将仅考虑第二行(即x0n
)来解释问题,但我的推理自然适用于上一行和下一行。
您的程序执行此操作:
原来
user_field
是xxx
,field
是n0n
(假设是102
)。你看
field
的第一个元素。它是1
,因此它不是0
,因此您不要对user_field
进行任何更改。然后你立即打印user_field
的第一个元素,此时它仍然是x
。到目前为止你打印了x
.您移动到
field
的第二个元素。它为零,因此您更新user_field
的第一个和第三个元素。但是那时 你已经打印了user_field
的第一个元素。现在field
是102
,user_field
是102
,但是你已经打印了x
。现在你打印user_field
的第二个元素,所以你最终打印x0
.您移动到
field
的第三个元素。它不是0
,因此您不做任何更改。你打印user_field
的第三个元素,此时是2
,所以你最终打印x02
,而所需的输出是102
.
要修复它,请将循环分成两部分。在第一个循环中计算 user_field
,并在第二个循环中打印它。大致如下:
for (int i = 1; i < field_h-2; i++) {
for (int j = 1; j < field_w-2; j++) {
if (user_field[i][j]==null) {
user_field[i][j]=".";
}
if(field[i][j]==0) {
for(int k = 0; k< 3; k++) {
for (int n = 0; n< 3; n++) {
user_field[i-1+k][j-1+n] = String.valueOf(field[i-1+k][j-1+n]);
//System.out.print(String.valueOf(field[i-1+k][j-1+n]));
}
}
}
}
}
for (int i = 1; i < field_h-2; i++) {
for (int j = 1; j < field_w-2; j++) {
System.out.print(user_field[i][j]);
}
System.out.println(" "+ (i));
}