一维到二维,无限循环



这是我在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循环将继续运行,直到生成的单元位置已经没有地雷。
我相信这是你想做的。
请注意,生成地雷的算法不是最优的。有更好的方法。

相关内容

  • 没有找到相关文章

最新更新