【问题标题】:minesweeper surrounding mines works half the time扫雷车周围的地雷工作一半的时间
【发布时间】:2017-01-01 21:01:38
【问题描述】:

我正在用 Java 编写扫雷克隆,我在计算周围炸弹数量的部分遇到了一些麻烦。出于某种原因,有些单元格检测到额外的炸弹,或者根本没有炸弹(奇怪的是,有些单元格工作正常)。有人可以帮忙吗?谢谢!

注意:key[][] 是一个 int[][] 数组,用于记录炸弹的位置,指定为 9。

0 代表一个空格

int count 表示每个单元格周围的 8 个单元格中的炸弹数量(这就是为什么我也有 8 个 try-catch 循环来解释边界单元格)

ps:很抱歉格式错误

编辑:我知道我的问题出在哪里(我给 i 打了两次电话)。关于如何使这段代码更简单、更高效的任何建议?

private void numberSet() {

    int count = 0;
    for (int i = 0; i < key.length; i++) {
        for (int a = 0; a < key[0].length; a++) {

            if (key[i][a] == 0) {

                try {
                    if (key[i + 1][a] == 9) {
                        count++;
                    }

                } catch (java.lang.ArrayIndexOutOfBoundsException e) {
                    continue;
                }
                try {
                    if (key[i - 1][a] == 9) {
                        count++;
                    }

                } catch (java.lang.ArrayIndexOutOfBoundsException e) {
                    continue;
                }
                try {
                    if (key[i][a + 1] == 9) {
                        count++;
                    }

                } catch (java.lang.ArrayIndexOutOfBoundsException e) {
                    continue;
                }
                try {
                    if (key[i][a - 1] == 9) {
                        count++;
                    }

                } catch (java.lang.ArrayIndexOutOfBoundsException e) {
                    continue;
                }
                try {
                    if (key[i + 1][a + 1] == 9) {
                        count++;
                    }

                } catch (java.lang.ArrayIndexOutOfBoundsException e) {
                    continue;
                }
                try {
                    if (key[i - 1][a + 1] == 9) {
                        count++;
                    }

                } catch (java.lang.ArrayIndexOutOfBoundsException e) {
                    continue;
                }
                try {
                    if (key[i + 1][a - 1] == 9) {
                        count++;
                    }

                } catch (java.lang.ArrayIndexOutOfBoundsException e) {
                    continue;
                }
                try {
                    if (key[i - 1][i - 1] == 9) {
                        count++;

                    }

                } catch (java.lang.ArrayIndexOutOfBoundsException e) {
                    continue;
                }
                key[i][a] = count;
            }
            count = 0;
        }
    }

}

【问题讨论】:

  • 我觉得你应该摆脱所有的 try/catch 块。它应该以这样的方式编码,即数组索引越界不会发生,如果它仍然发生 然后 你希望抛出一个异常,以便程序爆炸并且你知道你没有编写它正确。
  • 关于代码 sn-ps 的一个小提示:如果您还没有使用它,请给自己找一个合适的 IDE - 比如 IntelliJ jetbrains.com/idea/download - 并使用“重新格式化代码”将您的代码放入一个在将其粘贴到论坛或 StackOverflow 上之前保持良好状态。如果您的代码更易于阅读,人们就更有可能帮助您。
  • 喜欢先测试一下i或a是否为0?
  • 这是一半。您还需要确保它不会越过数组。就像网格边缘的单元格一样。如果您查看下面的代码,您会看到我是如何测试边缘的。

标签: java minesweeper


【解决方案1】:

我会认真考虑完全放弃你这样做的方式。当我刚开始写代码的时候,我也做了一个扫雷游戏,我做了你正在做的事情。经过几次修改,我能够将所有内容放入几个循环中。我试图在我的代码中添加足够的注释来告诉你每一行的作用。这段代码没有经过测试,所以说实话,它可能不会马上工作。但是,我浏览了几次,它似乎对我有用。我建议您使用此代码并尝试使其工作。试试看吧。

//For every Cell on the board
for (int i = 0; i < key.length; i++){
    for (int a = 0; a < key[0].length; a++){

        //If it Is not a mine
        if (key[i][a] == 0){ 
            int count = 0;

            //Position of cells around key[i][a] relative to key[i][a]
            for (int x = -1; x < 2; x++){  
                for (int y = -1; y < 2; y++){ 

                    //Storing x and y test points
                    int testX = i + x;//testX = i-1, i, and i+1
                    int testY = i + y;//testY = i-1, y, and y+1

                    //If the testX and testY values are within the range of the array
                    if ((testX >= 0 && testX < key[0].length) && testY >= 0 && testY < key.length){

                        //If there is a mine
                        if (key[testX][testY] == 9){
                            count++;
                        }
                    }
                }
            }

            key[i][a] = count;

            //count = 0; This is redundant. Line 7 count gets set to 0.
        }
    }
}

【讨论】:

  • 对了,如果你对上面的代码有任何疑问,欢迎提问
  • 似乎计数的增量没有到达循环的末尾
  • 你说得对,我的错。 @Brian Lee 我修复了那部分。仍然不能保证它会起作用。
  • 快速提问,但在二维数组中,int[i][a] 中的 i 是 COLUMN,对吗?
  • 并非在每个二维数组中。这真的取决于你的代码。我的代码确实假设“i”代表当前列。
【解决方案2】:

您似乎在滥用continue 语句,它会将执行移回for 循环,因此不会完成各种检查以增加count

catch 语句中,您应该什么都不做。

【讨论】:

  • 这是真的。如果您删除所有“继续”语句,您可能会没事的。
【解决方案3】:
if(key[i-1][i-1] == 9){

这看起来与你所有其他的不同,它们有 i 和 a。这个使用 i 两次。也许这是你的问题?

【讨论】:

  • 也许你应该使用for循环或其他东西,这样你就不会重复8次基本相同的事情。这就是发生这种错误的原因。
  • 哦,我没看到
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多