gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:26:02 24 4
gpt4 key购买 nike

我正在构建扫雷背后的逻辑,而不是实际的游戏,我只是设置一个默认值=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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com