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 条件にありますが、既に配置された爆弾との衝突がますます頻繁になるため、アルゴリズムも最適ではありません。極端な場合、ボード上の 1 つのポジションを除くすべてのポジションを埋めなければならない場合、フリー スポットに到達するまでに何度もリロールしなければならない場合があります。

空き位置のみを含むセットからスロットを描画することをお勧めします。

    // 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 に答える