我是论坛的新手,所以如果这不符合网站的标准,我想道歉,不过我对2D阵列扫雷程序有疑问。
我试图在地板上随机放置地雷,这是通过数组构建的。不幸的是,地雷被随机放在对角线上,而不是整个板上。我的MineField代码是:
public MineField(int w, int h, int m)
{
Random r = new Random();
mineField = new State[w][h];
surroundingMines = new int[w][h];
initialiseMineField = new int[w][h];
traceOn = true; //set to false before submitting
width = w;
height = h;
mineCount = m;
for (int i = 0; i < w; i++)
{
for (int j = 0; j < h; j++)
{
mineField[i][j] = State.COVERED;
}
}
for (int k = 0; k < m; k++)
{
int randomNumber = r.nextInt(m);
int a = randomNumber;
int b = randomNumber;
mineField[a][b] = State.MINED;
}
}
这给了我输出(每次随机,但只沿着对角线):
0 1 2 3 4
0| . . . . .
1| . * . . .
2| . . * . .
3| . . . * .
4| . . . . .
如何阻止它在那条对角线上行进,如何阻止地雷重叠?谢谢!
答案 0 :(得分:1)
为两个坐标生成两个随机数,而不是为两个坐标使用一个随机数。
for (int k = 0; k < m; k++)
{
mineField[r.nextInt(w)][r.nextInt(h)] = State.MINED;
}
两种可能的方法。
k
,直到您成功生成一个独特的矿。m
对作为地雷。以下是方法1的一些示例代码。
for (int k = 0; k < m; k++)
{
while (true) {
int a = r.nextInt(w);
int b = r.nextInt(h);
if (mineField[a][b] != State.MINED) { // We have discovered an un-mined location.
mineField[a][b] = State.MINED;
break; // get out of the while loop.
}
}
}
我将把方法2作为OP的练习。
答案 1 :(得分:0)
你正在设置一个&amp; b到相同的数字。例如,假设您的变量randomNumber = 1,然后设置&amp; b到randomNumber。然后你将地雷放在[1,1]等等,只在对角线上给你开采。这可以通过添加另一个randomNumber变量来解决,以便&amp; b都有自己独立的随机整数。