0

Java マインスイーパ ゲーム用にこのメソッドを作成しました。このメソッドは、一連の座標を囲むスポットをチェックし、近くにある爆弾の数を計算することになっています。

public void numberMines(){
    int count = 0;
    int x = 0;
    int y = 0;
    int xMin = x-1;
    int xMax = x+1;
    int yMin = y-1;
    int yMax = y+1; 
    if (x == 0){
        xMin = 0;
    }
    if (y == 0){
        yMin = 0;   //these restrictions take care of the spots in the edges
    }
    if (x == rows){
        xMax = rows;
    }
    if (y == columns){
        yMax = columns;
    }
    //first 2 loops go through every spot on the board
    for (x=0; x<rows; x++){
        for (y=0; y<columns; y++){
            //if the spot selected is not a bomb, for loops check spaces surrounding it
            if (mineBoard[x][y] != bomb){
                for (int i = xMin; i <=xMax; i++){
                    for (int j = yMin; j <=yMax; j++){
                        if (mineBoard[i][j] == bomb){
                            count++;
                        }
                    }
                }
            }

            if (count > 0){       //converts them characters
                mineBoard[x][y] = (char)(count + '0');
                count = 0;
            }
         }
    }
}

このメソッドを実行するたびに、3、2、1、または空が返されるため、周りにある爆弾の数がカウントされますが、何らかの理由で、最初の後に爆弾ではないすべてのスポットに対してループして同じものを返します1。どこを間違えたのか本当にわかりません、助けてください!

4

2 に答える 2

1

このコード ブロックを移動します。

int xMin = x-1;
int xMax = x+1;
int yMin = y-1;
int yMax = y+1; 
if (x == 0){
    xMin = 0;
}
if (y == 0){
    yMin = 0;   //these restrictions take care of the spots in the edges
}
if (x == rows){
    xMax = rows;
}
if (y == columns){
    yMax = columns;
}

for ループの内部:

for (x=0; x<rows; x++){
    for (y=0; y<columns; y++){
       //Insert code here <---

現時点では、x=0、y=0 について、これらの計算を 1 回行っているためです。


, , ループcountの直前に の設定を 0 に移動し、すべてのループが開始する前に 1 回も実行せず、結果を表示する条件内で再度設定すると、コードはおそらくきれいに見えるでしょう。ij


あなたのコメントに基づいて - あなたの有効なインデックスの範囲は から だと思います0..(rows-1)-0..(columns-1)したがって、fencepost エラーもあります。次の行を変更します。

if (x == rows-1){
    xMax = rows-1;
}
if (y == columns-1){
    yMax = columns-1;
}

ただし、このブロック全体をx/yループ内に置いてください。それらが外にある場合、範囲外のエラーは発生しません。これは、計算が行われないためでありxMax、最大値にある場合ですyMaxxy

于 2012-04-17T07:17:05.700 に答える
0

メソッドの先頭ですべての変数を宣言することは避け、使用する直前に宣言することをお勧めします。問題を解決するには、次のようなループで count、xMin、xMax、yMin、yMax を計算する必要があります。

public void numberMines(){
    //first 2 loops go through every spot on the board
    for (int x=0; x<rows; x++){
        for (int y=0; y<columns; y++){
            int count = 0;
            //if the spot selected is not a bomb, for loops check spaces surrounding it
            if (mineBoard[x][y] != bomb){
                for (int i = (x == 0 ? 0 : x-1); i <= (x == rows ? rows : x+1); i++){
                    for (int j = (y == 0 ? 0 : y-1); j <= (y == rows ? rows : y+1); j++){
                        if (mineBoard[i][j] == bomb){
                            count++;
                        }
                    }
                }
            }

            if (count > 0){       //converts them characters
                mineBoard[x][y] = (char)(count + '0');
            }
         }
    }
}

境界チェックをインライン化しましたが、これは必須ではありませんが、コードを短くしてここに示します。

于 2012-04-17T07:19:55.233 に答える