0

プログラミングチャレンジのWebサイト用にマインスイーパプログラムを作成しようとしていますが、2D配列の特定の要素がマインであるかどうかを検出し、周囲の領域をインクリメントするのに問題があります。これは、配列の隅にある地雷をチェックし、周囲の領域をインクリメントする私のコードです

  public void constructPointers(){
    int counter = 0;
    for(int i = 0; i<row;i++){
        for(int j = 0;j<colm;j++){
            if(minefield[i][j].equals("*")){
                if(i == 0 && j == 0){
                    int val = Integer.parseInt(minefield[i+1][j]);
                    val++;
                    minefield[i+1][j] = "" + val;

                    val = Integer.parseInt(minefield[i][j+1]);
                    val++;
                    minefield[i][j+1] = "" + val;
                    val = Integer.parseInt(minefield[i+1][j+1]);
                    val++;
                    minefield[i+1][j+1] = "" + val;
                }
                if(i == minefield.length -1 && j == 0){
                    int val = Integer.parseInt(minefield[i-1][j]);
                    val++;
                    minefield[i-1][j] = "" + val;
                    val = Integer.parseInt(minefield[i][j+1]);
                    val++;
                    minefield[i][j+1] = "" + val;
                    val = Integer.parseInt(minefield[i-1][j+1]);
                    val++;
                    minefield[i-1][j+1] = "" + val;
                }
                if(i == 0 && j == minefield[i].length - 1){
                    int val = Integer.parseInt(minefield[i+1][j]);
                    val++;
                    minefield[i+1][j] = "" + val;
                    val = Integer.parseInt(minefield[i][j-1]);
                    val++;
                    minefield[i][j-1] = "" + val;
                    val = Integer.parseInt(minefield[i+1][j-1]);
                    val++;
                    minefield[i+1][j-1] = "" + val;
                }
                if(i == minefield.length - 1 && j == minefield[i].length -1){
                    int val = Integer.parseInt(minefield[i-1][j-1]);
                    val++;
                    minefield[i-1][j-1] = "" + val;
                    val = Integer.parseInt(minefield[i-1][j]);
                    val++;
                    minefield[i-1][j] = "" + val;
                    val = Integer.parseInt(minefield[i][j-1]);
                    val++;
                    minefield[i][j-1] = "" + val;
                }
                if(i == 0){
                    int val = Integer.parseInt(minefield[i+1][j]);
                    val++;
                    minefield[i+1][j] = "" + val;
                    val = Integer.parseInt(minefield[i][j+1]);
                    val++;
                    minefield[i][j+1] = "" + val;
                    val = Integer.parseInt(minefield[i+1][j+1]);
                    val++;
                    minefield[i+1][j+1] = "" + val;
                }
            }

入力した場合:

*.*
...
*.*

このコードは次のように出力します。

* 2 *
2 4 2
* 2 *

私の質問は、コードを取得して隣接する地雷を「スキップ」し、周囲の領域をインクリメントするにはどうすればよいですか?入力した場合

*.*
*..
*.*

出力したい:

    * 3 *
    * 5 2
    * 3 *

編集:あなた方全員は素晴らしい答えを持っていました、しかしそれが私が私が言及しなかった他の多くの問題を解決したので私は一番上の答えを選びました。よろしくお願いします!

4

3 に答える 3

3

鉱山の更新ループに関する提案を提供するだけです。

// You are on a mine
if(minefield[i][j].equals("*")){

    // Now go around your current position
    for(int tempRow = i-1; tempRow <= i+1; tempRow++) {
        for(int tempCol = j-1; tempCol <= j+1; tempCol++) {
            // If a valid square and not a mine
            if(tempRow >= 0 && tempRow < row &&
                tempCol >= 0 && tempCol < colm &&
                !minefield[tempRow][tempCol].equals("*")) 
            {
                // Do your update stuff
                int val = Integer.parseInt(minefield[tempRow][tempCol]);
                val++;
                minefield[tempRow][tempCol] = "" + val;
            }
        }
    }
}

このループは、より大きなボードサイズにかなり簡単にスケールアップできます...

注:地雷ではない場合、地雷原は「0」に初期化されていると思います。そうしないと、最初のに問題が発生しparseIntます。

于 2013-03-27T03:57:41.350 に答える
0

すべてのセルを反復処理する方が簡単な場合があります。地雷ではないセルごとに、セルの周囲の地雷の数を数えます。つまり、各セルのカウントを一度に計算します。これは、隣接する地雷に対処する方法についてのあなたの質問を処理します。

于 2013-03-27T02:55:11.967 に答える
-2
if(minefield[i][j] == "*"){
    // do stuff
}

大したことはわかりません、うーん。

編集

正しくない-コメントで述べられているように:

if(minefield[i][j].equals("*")){
    // do stuff, they are equal.
}

psはあまり建設的な答えではありませんが、建設的なコメントのために残しました。

于 2013-03-27T02:40:55.383 に答える