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

Checking adjacent cells in a java ArrayList for minesweeper

我将所有单元格都存储在一个 ArrayList 中,我想检查它们周围有多少地雷(地雷是带有 not null mine 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);
        }
    }

忽略意大利面条代码我总是在事情正常时重构。

I thought of checking the positions -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))

例如。