java - 我的扫雷器 dot java 出了什么问题

标签 java arrays minesweeper

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

[ ][ ][ ]

[ ][x][ ]

[ ][ ][ ]

并计算有多少炸弹,并将该数字存储在“并行数组”中,然后显示在屏幕上。

现在我可以使用 4 个随机生成的炸弹创建字段,如下代码所示: 公共(public)类扫雷器{

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: 公共(public)静态无效 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 专家都会对此不屑一顾。

关于java - 我的扫雷器 dot java 出了什么问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28781766/

相关文章:

javascript - 如何通过索引数组重新排列数组(证明)?

JavaFX 覆盖和揭示按钮字段中的按钮文本

javascript - 扫雷的 JQuery 网格递归(单击相邻图 block )

java - 如何从逗号分隔的数据中解析空标记?

java - Servlet上下文和Spring应用上下文的本质区别

java - 从指定基数到 BigInteger 的高效转换

javascript - for循环中的异步函数调用

java - J2SE 中的手机监控器

C++ 使 char 数组在输入时识别空格

swing - 如何加速落后的 Swing 扫雷板?