0

プロジェクト用にシンプルな(標準の)掃海艇を作成する必要があります。2次元配列のランダム(または特定の)要素の周囲の要素を確認したいと思います。

私はそのような配列を持っているとしましょう

boolean board[5][5]

の周辺要素をチェックしたい

board[0][0]

私はそれを書いた:

    public int numberChecker(int h, int w) {
    int checker = 0;        
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            int he = h - 1 + i;
            int wi = w - 1 + i;    <---- this i should be j that was the issue
            if (board.getHeight() > he && he >= 0 
                               && wi >= 0 && board.getWidth() > wi) {
            if (boomChecker(he, wi)) {
                if (w != (wi) && h != (he)) {
                    checker++;
                }
                }
            }
        }
    }                                   

    return checker;
}

問題は、 「\」の方法しかチェックしないと思うことです(言葉で表現する方法がわかりません)

元:

(出力#はカバーされていない数字が周囲の地雷を意味することを意味します)

4-2を明らかにする

######
######
0#####
#0####
##0###     <-- unlocking this one
###0##

また

0-0を明らかにする

0#####
#0####
##0###
######     <-- there is a mine at check spot
######
######

コード自体は重要ではありません(自分自身を説明するのが少し複雑になったのはわかっています)

必要なのは、ループ(または何か)のチェックを取り巻く作業だけです。

前もって感謝します

問題は単純な愚かな間違いを解決しましたinthe= h --1 + i; int wi = w --1 + i; <---私はjに感謝する必要があります

4

3 に答える 3

3

私はあなたの間違いがこの2行にあると思います:

int he = h - 1 + i;
int wi = w - 1 + i;

高さと幅にiの値を追加します。したがって、3つの対角フィールドすべてを3回チェックするだけです。私はそれがすべきだと思います

int he = h - 1 + i;
int wi = w - 1 + j;

したがって、対角線だけでなく、9つの可能なフィールドすべてを実際に反復します。

お役に立てば幸いです。

于 2012-07-10T21:56:25.567 に答える
0

宿題の質問に答えるように答えを書きます

今、あなたが本当にすべきことは、あなたの配列の各セルについて、チェックする他の8つのセルがあるということです。だから次のようなもの:

count += board[i-1][j-1] ? 1 : 0;
count += board[i-1][j] ? 1 : 0;
count += board[i-1][j+1] ? 1 : 0;
count += board[i][j-1] ? 1 : 0;
etc.

配列の境界外の要素にアクセスできないようにするためのメカニズムを必ず含めてください。

?また、との:意味がわからない場合は、三項演算子を調べてください 。あらゆる状況で役立ちます。

于 2012-07-10T21:59:31.857 に答える
0

ちなみに、周囲の8つのセルのそれぞれを明示的にチェックする方がよい場合があります。JVMがループを自動的に展開する可能性は完全にありますが、明示的にチェックしない理由はわかりません。より速く、より理解しやすくなります。

boolean upleft = board[row-1][column-1];
boolean up = board[row-1][column];
boolean upright = board[row-1][column+1];
boolean left = board[row][column-1];
boolean right = board[row][column+1];
boolean downleft = board[row+1][column-1];
boolean dow  = board[row+1][column];
boolean downright = board[row+1][column+1];

もちろん、ボードの端にいるかどうかを境界チェックする必要がありますが、何が起こっているかについてはより理にかなっています。

于 2012-07-11T01:23:47.000 に答える