这是我在10x10扫雷游戏板中生成随机地雷的代码。
for (int j = 0; j < 10; j++) {
mine[j] = (int) (Math.random() * 100);
while (board[mine[j]] != 99)
board[mine[j]] = 99;
}
我想修改它,使其在2D int数组中工作:
for (int j = 0; j < 10; j++) {
do {
temp = (int) (Math.random() * 100);
row = temp / 10;
column = temp % 10;
} while (board[row][column] != 99);
board[row][column] = 99;
}
然而,这段代码创建了一个无限循环。我卡住了,我想不出为什么它不工作
我想你的意思是:[while
条件是错误的,为什么你要设置一个已经是99到99的字段]
for (int j = 0; j < 1; j++) {
do {
temp = (int) (Math.random() * 100);
row = temp / 10;
column = temp % 10;
} while (board[row][column] == 99);
board[row][column] = 99;
}
语法上你的问题是在while条件下,但你的算法也不是最优的,因为与已经放置的炸弹的碰撞将变得越来越频繁。在极端的情况下,你必须填满棋盘上的所有位置,除了一个位置,你可能需要重新滚动很多次才能找到一个空闲的位置。
最好从只包含空闲位置的集合中抽取槽。
// create an array of slots to draw ten slots from
int[] slots = new int[100];
for (int i = 0; i < slots.length; i++) {
slots[i] = i;
}
/*
* draw ten slots by placing them at the start of the array
* subsequent draws will draw from the tail of the array
*/
Random random = new Random();
for (int i = 0; i < 10; i++) {
// draw from one of the slots from the tail
int draw = random.nextInt(100 - i) + i;
// switch values at draw and i index
int temp = slots[draw];
slots[draw] = slots[i];
slots[i] = temp;
// use the draw to place a bomb on the board
board[(draw / 10)][(draw % 10)] = 99;
}
为什么你的代码创建了一个无限循环?最初没有一个单元格的值是99,您的do_while
条件是while (board[row][column] != 99);
。因此循环将继续迭代,因为它永远不会遇到值为99的单元格。
你的do_while
条件是错误的。应该是while (board[row][column] == 99);
解释:如果当前生成的随机单元格有矿,即如果单元格值等于99,则将重新生成行号和列号。do_while
循环将继续运行,直到生成的单元位置已经没有地雷。
我相信这是你想做的。
请注意,生成地雷的算法不是最优的。有更好的方法。