【发布时间】:2015-02-28 20:53:40
【问题描述】:
我正在构建扫雷背后的逻辑,而不是实际游戏,我只是设置一个默认值为 0 的 4*4 mineField 数组,并在其中随机生成 4 个值为 1 的炸弹。我的问题是我的 checkBomb() 方法,它应该占用数组中的每个插槽并检查它的所有 8 个相邻插槽及其本身的值 1 ,就像这样
[ ][ ][ ]
[ ][x][ ]
[ ][ ][ ]
并计算那里有多少炸弹,这个数字存储在一个“平行数组”中,然后显示在屏幕上。
现在我可以使用以下代码创建包含 4 个随机生成的炸弹的字段: 公共类扫雷器 {
public static int[][] afterCheck=new int[4][4];
public static int[][] mineField=new int[4][4];
public static int bombNumber=4;
public static void setBombs()
{
//bombNumber variable will decide the number of loops
for(int i=0;i<bombNumber;)
{
int firstRandom=(int)(Math.random()*4);
int secondRandom=(int)(Math.random()*4);
if(mineField[firstRandom][secondRandom]== 0)
{
mineField[firstRandom][secondRandom]=1;
i++;
}
但至于 checkBomb() 方法,到目前为止,我已经提出了两个不同的代码,但没有一个有效。 代码1: 公共静态无效检查炸弹() {
for(int i=0;i<4;i++)
{
int counter=0;
try{
for(int y=0;y<4;y++)
{
if (mineField[i][y + 1] == 1)
counter++;
if (mineField[i][y - 1] == 1)
counter++;
if (mineField[i - 1][y] == 1)
counter++;
if (mineField[i - 1][y + 1] == 1)
counter++;
if (mineField[i - 1][y - 1] == 1)
counter++;
if (mineField[i + 1][y] == 1)
counter++;
if (mineField[i + 1][y + 1] == 1)
counter++;
if (mineField[i + 1][y - 1] == 1)
counter++;
afterCheck[i][y] = counter;
}
} catch(Exception e){}
}
}
第二个代码:
public static void checkBombs()
{
for(int i=0;i<4;i++)
{
int counter=0;
try{
for(int y=0;y<4;y++)
{
for(int a=i-1;a<i+1;a++)
{
for (int b=y-1;b<y+1;b++)
{
if(mineField[a][b]==1)
counter++;
}
}
*/
afterCheck[i][y] = counter;
}
} catch(Exception e){}
}
}
我需要一些帮助你们。
【问题讨论】:
-
停止捕获和忽略异常:它们会告诉您代码中的错误是什么以及在哪里,而您故意选择忽略它们。
-
我没有意识到这是不好的做法(如果这就是你的意思)......对我来说,我试图忽略通过检查边缘上的插槽生成的 .ArrayIndexOutOfBoundsException。
-
抛出异常时,您也会忽略所有随后检查的单元格,即使它们没有越界。
-
ArrayIndexOutOfBoundsException 表示您的代码中存在错误:您正在越过数组的边界。捕获异常并将其隐藏起来,就好像它没有被抛出一样不会修复错误。它只会使诊断变得更加困难。您所做的基本上与禁用汽车中的所有警告标志和声音,然后抱怨您不知道为什么它不再启动相同。所以现在你知道什么问题了。堆栈跟踪还告诉您哪里问题出在哪里。
-
@Tom 有两个数组:一个用于放置炸弹,另一个用于相邻炸弹计数。放置炸弹的那个实际上应该是一个
boolean数组。
标签: java arrays minesweeper