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)来解释问题,但我的推理自然适用于上一行和下一行。

您的程序执行此操作:

  1. 原来user_fieldxxxfieldn0n(假设是102)。

  2. 你看field的第一个元素。它是 1,因此它不是 0,因此您不要对 user_field 进行任何更改。然后你立即打印 user_field 的第一个元素,此时它仍然是 x。到目前为止你打印了 x.

  3. 您移动到 ​​field 的第二个元素。它为零,因此您更新 user_field 的第一个和第三个元素。但是那时 你已经打印了 user_field 的第一个元素。现在field102user_field102,但是你已经打印了x。现在你打印 user_field 的第二个元素,所以你最终打印 x0.

  4. 您移动到 ​​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));
    }