0

这是我在 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;
    }

但是,此代码会创建一个无限循环。我被卡住了,我想不出它为什么不起作用

4

3 回答 3

3

我想你的意思是:[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;
}
于 2012-12-28T23:06:36.610 回答
0

为什么你的代码会创建一个无限循环?最初,没有一个单元格具有 99 作为值,并且您的do_while条件是while (board[row][column] != 99);。所以循环将继续迭代,因为它永远不会遇到值为 99 的单元格。
你的do_while条件是错误的。应该是while (board[row][column] == 99);
解释:如果当前生成的随机单元格有地雷,即如果单元格值等于 99,则将重新生成行号和列号。do_while循环将继续运行,直到生成的单元格位置没有地雷.
我相信这是你想做的。
请注意,您生成地雷的算法不是最优的。有更好的方法来做到这一点。

于 2012-12-28T23:28:22.193 回答
0

从语法上讲,您的问题在 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;
    }
于 2012-12-28T23:39:26.867 回答