我在建立扫雷器背后的逻辑,而不是在实际游戏中,我只是建立一个默认值为0的4 * 4 mineField数组,并在其中随机生成4个炸弹,值为1。我的问题是我的checkBomb()方法,它应该在数组中的每个插槽上取值,并检查所有8个相邻插槽及其自身的值1,就像这样

[ ][ ][ ]

[ ][x][ ]

[ ][ ][ ]


并计算其中有多少枚炸弹,并将此炸弹存储在“并行阵列”中,然后将其显示在屏幕上。

现在,我能够使用4个随机生成的炸弹来创建字段,如以下代码所示:
    公共类MineSweeper {

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:
   公共静态无效checkBombs()
    {

    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){}
    }



}


我需要一些帮助。

最佳答案

介绍一种可以安全处理木板边缘的方法:

int bombCount(int i, int j) {
  if (i < 0 || j < 0 || i >= mineField.length || j >= mineField[i].length)
    return 0;
  return mineField[i][j];
}


然后,您可以使用带有for循环的第二个版本,通过替换来总结附近的炸弹数量

mineField[i][j]




bombCount(i, j)


您还可以消除所有的if-ology,只需使用

counter += bombCount(i,j);


只是出于兴趣,这是一种“不好的做法”,但正确的等同于上述方法是

int bombCount(int i, int j) {
  try { return mineField[i][j]; }
  catch (ArrayIndexOutOfBoundsException _) { return 0; }
}


上面的代码和您的代码之间的区别在于,每次访问数组时都会分别捕获异常,而在遇到第一个异常情况时,您的方法会缩短其余评估的时间。

最后,作为一个附带说明,最近这些天,HotSpot已针对不良实践变体进行了优化,因此该习惯用法实际上不会对性能造成很大损害。大多数Java专家都不会相信它。

09-29 19:50