嗨,所以我正在构建一个用Java创建经典扫雷游戏的程序,并且几乎所有东西都已关闭但是我无法弄清楚如何检查矿井周围的平方并写入数字(即如果有的话) ,旁边有两个,三个地雷)。我只包括它所使用的方法,但如果有必要,我可以发布其余的程序。我的方法应该是什么?谢谢!
private void countAdjacentMines()
{
for (int i = 0; i < mineField.length; i++)
{
for (int j = 0; j < mineField.length; j++)
{
if (!(mineField[i][j].getIsMine()))
{
mineField[i-1][j-1];
mineField[i-1][j];
mineField[i-1][j+1];
mineField[i][j-1];
mineField[i][j+1];
mineField[i+1][j-1];
mineField[i+1][j];
mineField[i+1][j+1];
mineField[i][j].setAdjacentMines(0);
}
} // end for loop rows
} // end for loop columns
} // end countAdjacentMines
答案 0 :(得分:3)
对于该“列表”中的每个项目,执行以下操作:
if ((i-1) >= 0 && (j-1) >= 0 && mineField[i-1][j-1].getIsMine()) {
numAdjacentMines++;
}
编写辅助函数来完成所有这些操作可能是值得的,然后你只需要调用它8次。
答案 1 :(得分:3)
你走在正确的轨道上。你应该保留一个计数器,它代表为.getIsMine()返回true的相邻地雷的数量。
if (!(mineField[i][j].getIsMine()))
{
counter = 0;
if (i-1 >= 0)
{
if (j-1 >=0 && mineField[i-1][j-1].getIsMine()) counter++;
if (mineField[i-1][j].getIsMine()) counter++;
if (j+1 < mineField.length && mineField[i-1][j+1].getIsMine()) counter++;
}
if (j-1 >=0 && mineField[i][j-1].getIsMine()) counter++;
if (j+1 < mineField.length && mineField[i][j+1].getIsMine()) counter++;
if (i+1 < mineField.length)
{
if (j-1 >=0 && mineField[i+1][j-1].getIsMine()) counter++;
if (mineField[i+1][j].getIsMine()) counter++;
if (j+1 < mineField.length && mineField[i+1][j+1].getIsMine()) counter++;
}
mineField[i][j].setAdjacentMines(counter);
}
您还需要检查所有这些值(i-1,j-1,i + 1,j + 1)是否超出数组的范围(i-1> -1,等)
编辑::我想我已经涵盖了所有的检查。
答案 2 :(得分:3)
这样的事情:
private void countAdjacentMines()
{
for (int i = 0; i < mineField.length; i++)
{
for (int j = 0; j < mineField.length; j++)
{
if (!(mineField[i][j].getIsMine()))
{
int count = 0;
for (int p = i - 1; p <= i + 1; p++)
{
for (int q = j - 1; q <= j + 1; q++)
{
if (0 <= p && p < mineField.length && 0 <= q && q < mineField.length)
{
if (mineField[p][q].getIsMine())
++count;
}
}
}
mineField[i][j].setAdjacentMines(count);
}
} // end for loop rows
} // end for loop columns
} // end countAdjacentMines
答案 3 :(得分:1)
我不确定你要做什么。这句话mineField[i-1][j-1];
和类似的声明只是访问数据并且不做任何事情。
我假设数组存储的内容包含一个布尔值,告诉你该空间中是否有一个地雷。如果这是真的,只需创建一个计数器并将这些语句更改为if(mineField[i-1][j-1].hasMine()) counter++;
。然后将最后一个语句更改为mineField[i][j].setAdjacentMines(counter);
。
答案 4 :(得分:0)
int sum = 0;
sum += mineField[i-1][j-1].getIsMine() ? 1 : 0;
sum += mineField[i-1][j].getIsMine() ? 1 : 0;
sum += mineField[i-1][j+1].getIsMine() ? 1 : 0;
sum += mineField[i][j-1].getIsMine() ? 1 : 0;
sum += mineField[i][j+1].getIsMine() ? 1 : 0;
sum += mineField[i+1][j-1].getIsMine() ? 1 : 0;
sum += mineField[i+1][j].getIsMine() ? 1 : 0;
sum += mineField[i+1][j+1].getIsMine() ? 1 : 0;
mineField[i][j].setAdjacentMines(sum);
这可以计算出有多少是地雷并正确使用它。创建一个循环来执行此计算可能更干净,因为对于每个相邻字段它是相同的。
答案 5 :(得分:0)
尝试类似:
private static int countAdjacentMines(int x, int y) {
int adjacentMines = 0;
for(int i = -1; i <= 1; i++) {
if((x + i < 0) || (x + i >= width)) {
continue;
}
for(int j = -1; j <= 1; j++) {
if((y + j < 0) || (y + j >= height)) {
continue;
}
if(mineField[x + i][y + j].getIsMine()) {
adjacentMines++;
}
}
}
return adjacentMines;
}
这应该计算(x,y)处块附近的地雷数量。