检查扫雷的 java ArrayList 中的相邻单元格

Checking adjacent cells in a java ArrayList for minesweeper

提问人:Jds Wolf 提问时间:5/12/2021 更新时间:5/12/2021 访问量:176

问:

我将所有单元格都存储在 ArrayList 中,我想检查它们周围有多少个地雷(地雷是具有非空地雷 png 的单元格)。我想检查相对于每个单元格的位置 -1、+1、-9、+9、-10、+10、-11、+11,并将 1 添加到单元格对象内的计数器中。问题是我出界了,不知道如何避免它。

for (Cell cell: cells){
        if ((cells.get(cells.indexOf(cell) - 1).mine != null)&&((cells.indexOf(cell) - 1) >= 0)) {
            cell.setMine_number(cell.getMine_number() + 1);
        }
        if ((cells.get(cells.indexOf(cell) + 1).mine != null)&&((cells.indexOf(cell) + 1) < 100)) {
            cell.setMine_number(cell.getMine_number() + 1);
        }
        if ((cells.get(cells.indexOf(cell) - 10).mine != null)&&((cells.indexOf(cell) - 10) >= 0)) {
            cell.setMine_number(cell.getMine_number() + 1);
        }
        if ((cells.get(cells.indexOf(cell) + 10).mine != null)&&((cells.indexOf(cell) + 10) < 100)) {
            cell.setMine_number(cell.getMine_number() + 1);
        }
        if ((cells.get(cells.indexOf(cell) - 11).mine != null)&&((cells.indexOf(cell) - 11) >= 0)) {
            cell.setMine_number(cell.getMine_number() + 1);
        }
        if ((cells.get(cells.indexOf(cell) + 11).mine != null)&&((cells.indexOf(cell) + 11) < 100)) {
            cell.setMine_number(cell.getMine_number() + 1);
        }
        if ((cells.get(cells.indexOf(cell) - 9).mine != null)&&((cells.indexOf(cell) - 9) >= 0)) {
            cell.setMine_number(cell.getMine_number() + 1);
        }
        if ((cells.get(cells.indexOf(cell) + 9).mine != null)&&((cells.indexOf(cell) + 9) < 100)) {
            cell.setMine_number(cell.getMine_number() + 1);
        }
    }

忽略意大利面条代码,我总是在工作时重构。

Java 列表数组 索引超出边界异常

评论

0赞 GhostCat 5/12/2021
忽略意大利面条代码......在这里提出问题时,这是一个非常糟糕的看法。你希望别人花时间帮助你解决问题,所以你把所有需要的时间都花在想出易于阅读的代码上。你看,为了帮助你,我们必须阅读/理解你的意见。
0赞 GhostCat 5/12/2021
并且不相关:阅读有关 java 命名约定的信息。不要在方法或变量名称中使用“_”。例如,而是调用方法 /。另请注意,您应该创建有用的抽象。为什么不简单地有一个方法,而不是做“set( get() + 1)”无数次?setMineCount()getMineCount()increaseMineCount()
0赞 Jds Wolf 5/12/2021
@GhostCat我不知道我不能蛇案例方法总是有疑问
0赞 GhostCat 5/12/2021
你可以做很多事情。他们中的许多人:你不应该这样做。

答:

0赞 GhostCat 5/12/2021 #1

我想检查位置 -1,...

不幸的是,这种想法行不通。

首先,您将“假定为 2 暗淡”列表的维度“硬编码”到这些数字中。如果将网格更改为 20x20 会怎样?那么 -10 就没有意义了。

然后:很明显,对于很多插槽,-10 或 +10 不起作用。

您可以创建一个简单的检查器方法,例如:

boolean isValidIndex(int cellIndex, int offset) {
  // not doing your homework for you, but rest assured
  // this method is easy to implement

然后,您可以像以下方式使用:

if (isValidIndex(cells.indexOf(cell), 9))

例如。