2017-06-14 3 views
0

私は掃除機の空のセルを明らかにするアルゴリズムを理解できません。 revealCellsは、セルを取って、周囲のセルをチェックし、それが鉱山のセルを見つけるまで表示しますが、何らかの理由でarrayindexoutofbounds例外が発生し続けます。セルは、ボード内のセルの2D配列です。私はすべての状態をチェックしていないことを知っている、私は残りの部分を追加する前に、それがまったく動作するかどうかをテストする必要があった。私は掃除機の再帰アルゴリズムを理解することができません

驚くことではありません
public void revealCells(Cell cell){ 
    row = cell.getRow(); 
    column = cell.getCol(); 

    if (row < 0 || row > cells.length - 1|| column < 0 || column > cells.length - 1) return; 

    else if(cell instanceof MineCell) return;  

    else if(cell.getMineCount() == 0 && !(cell.isRevealed())){ 
     cell.reveal(); 
     revealCells(cells[row+1][column]); 
     revealCells(cells[row][column+1]); 
     revealCells(cells[row-1][column]); 
     revealCells(cells[row][column-1]); 
     revealCells(cells[row+1][column+1]); 
     revealCells(cells[row-1][column-1]); 
    } 
    else{ 
     return; 
    } 
} 
+0

'cells'は、2次元配列であるが、それは正方形であります、すなわち同じ幅と高さですか?そうでなければ、なぜ 'cells.length - 1'と同じ値に対して' row'と 'column'の両方をチェックしていますか? ---サイドノート:6つの再帰呼び出ししかありませんが、8つの隣接セルがあります。 – Andreas

+0

あなたの最初の状態を見てください.1つの場所でセル[0] .length-1であってはいけません。 –

答えて

1

:Javaは最初cells[row+1][column]を取得することを意味します

revealCells(cells[row+1][column]); 

:あなたのような再帰呼び出しを行います。今あなたは境界チェックをしていません。このメソッドのバインドされたチェックはおそらくむしろあまり役に立ちません。なぜなら、既にセルを取得しているので、有効な座標であることがわかります。

私の意見で

、あなたがより良い座標、代わりの細胞で機能するようにシステムを再設計して、境界チェックの後、細胞をフェッチ:

public void revealCells(int row, int column) { 
    if (row < 0 || row >= cells.length|| column < 0 || column >= cells[0].length) 
     return; 

    Cell cell = cells[row][column]; // now we are safe, so fetch the cell 
    if(cell instanceof MineCell) 
     return; 

    else if(cell.getMineCount() == 0 && !(cell.isRevealed())){ 
     cell.reveal(); 
     // call recursive with coordinates, not cells 
     revealCells(row-1,column-1); 
     revealCells(row-1,column); 
     revealCells(row-1,column+1); 
     revealCells(row,column-1); 
     revealCells(row,column+1); 
     revealCells(row+1,column-1); 
     revealCells(row+1,column); 
     revealCells(row+1,column+1); 
    } 
}
+1

コード内でマークアップを行うことができないか分かりませんでした。それに、あなたはまだ対角の2つの隣人を失っています。 –

+0

@tobias_k:それを指摘してくれてありがとう。一定。 –

+1

助けてくれてありがとう! – Jack

関連する問題