检查扫雷器的 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))
例如。
我将所有单元格都存储在一个 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))
例如。