1

現在、グリッドセルの周囲のすべてのセルのデータをチェックしようとしています。上、左、下、右、およびすべての対角線。側面と角を個別にコーディングする必要がないように、例外スローを使用するにはどうすればよいですか?

これは現在私が持っているものです。isIsAlive() は、セルが「アクティブ」かどうかを確認するだけです。セルの隣接セルには、そのセルの周囲のすべてのアクティブ セルが含まれます。

    public void calcNeighbors() throws ArrayIndexOutOfBoundsException{

    int x =0;

    int y =0;
    int neighbors = 0;



    while(x < 9){
        while(y < 9){

            if(generation[x+1][y+1].isIsAlive()){
                neighbors++;

            }
             if(generation[x+1][y].isIsAlive()){
                neighbors++;
            }
              if(generation[x+1][y-1].isIsAlive()){
                neighbors++;
            }
               if(generation[x][y-1].isIsAlive()){
                neighbors++;
            }
                if(generation[x-1][y-1].isIsAlive()){
                neighbors++;
            }
                 if(generation[x-1][y].isIsAlive()){
                neighbors++;
            }
                 if(generation[x-1][y+1].isIsAlive()){
                neighbors++;
            }
                 if(generation[x][y+1].isIsAlive()){
                neighbors++;
            }
            y++;
        }
        x++;
        neighbors = 0;
    }
}
4

3 に答える 3

4

if ブロックのリストは (率直に言って) 醜く、危険です。代わりにネストされた for ループを使用しますが、エッジを考慮して for ループの上限と下限を計算します。

for (int x = 0; x < MAX_X; x++) {
  for (int y = 0; y < MAX_Y; y++) {

    int minRow = Math.max(0, x - 1);
    int maxRow = Math.min(MAX_X - 1, x + 1);
    int minCol = Math.max(0, y - 1);
    int maxCol = Math.min(MAX_Y - 1, y + 1);

    for (int row = minRow; row <= maxRow; row++) {
      for (int col = minCol; col <= maxCol; col++) {
         if (row != x || col != y) {
           if(generation[row][col].isIsAlive()){
             neighbors[x, y]++;
           }
         }
      }
    }
  }
}
于 2013-08-26T23:46:58.327 に答える
3

仮想の隣人が範囲外になる場合は、独自の例外をスローしないでください。ArrayIndexOutOfBoundsExceptionJava はとにかくスローします。

配列にアクセスする前に境界を確認する必要があります。xまたはが範囲外の場合は、配列にアクセスしないでくださいy

于 2013-08-26T23:47:02.257 に答える