2016-11-30 7 views
0

私は斜めに(左上から右下に)勝ったかどうかを確認しようとしています。グリッドの左上部分は(0,0)です。最後に配置されたタイルに基づいてプレーヤーが勝ったかどうかは確認しません。代わりに、私は誰かが斜めに勝ったかどうかを確認するためにグリッド上のすべてのスポットをチェックしています。これは私が思いついたものです。4つの対角線で勝利

public class TestWin { 
private int count_piece; 
private char[][] board; 

public void myBoard(char[][] x){ 
    this.board = x; 
    //vertWin(); 
    //horizontalWin(); 
    diagDownWin(); 
} 

public boolean diagDownWin(){ 
    for(int row = 0; row < board.length; row++){ 
     for(int col = 0; col < board[0].length; col++){ 
      if(board[row][col] == board[row+1][col+1]){ 
       count_piece++; 
       if(count_piece >= 4){ 
        System.out.println("You win"); 
        return true; 
       } 
      }else{ 
       count_piece = 0; 
      } 
     } 
    } 
    System.out.println("No win"); 
    return false; 
} 
public static void main(String[] args) { 

    char[][] myGrid = { 
      { 'X', 'O', 'O', 'O'}, 
      { 'X', 'X', 'O', 'O'}, 
      { 'O', 'X', 'X', 'O'}, 
      { 'O', 'O', 'X', 'X'}, 
      { 'O', 'O', 'O', 'O'} 
    }; 

    TestWin m1 = new TestWin(); 

    m1.myBoard(myGrid); 

} 

}

私は左上から右下に移動しチェックしていdiagonal--から勝つために2つの方法がありますので。私は1つを下ると、1以上の(行+ 1とCOL +1)したいが、私は私が書くのライン上の境界エラーのうち、配列に実行します。

if(board[row][col] == board[row+1][col+1]) 

私が到達したときので、この問題が発生したと仮定します最後の行と最後の列私はboard.lengthとボード[0] .length大きい1つを追加しています

私はこのエラーを避けるために何ができますか?

+0

さて、単純な解決策は小切手を追加することでしょうか? 'if((row + 1)

+0

@JoeC配列は0からインデックスされ、そのポストの答えの記法に従っていることを理解しています。 – Construct0r

答えて

0

私はあなたが、手動で「エッジで値を確認する必要があるかもしれません

for(int row = 0; row < board.length-1; row++){ 
    for(int col = 0; col < board[0].length-1; col++){ 

に行、列ループの境界を変更し、その後

   if(count_piece >= 3){ 

に成功条件を変更します"その後。

あなたのループで
+0

これを試してみましたが、.lengthは1から数えます。行の数が何であれ、配列の添字は0であるため、これは役に立ちません。 – Construct0r

+0

なぜそれが重要かわかりません。 0からlength-1まで反復すると、反復はインデックス2で停止し、インデックス3で停止するのではなく、インデックス3をチェックし、定義されていないインデックス4にオーバーフローします。 –

1

、唯一が正当は、ダウンと右四イン行(そう、あなたの例グリッドの位置の左上の位置とすることができる位置の数を反復(0, 0)および(0, 1))。次に、その点から4行1列が発生したかどうかを評価します。

for(int row = 0; row < grid .length - 3; row++){ 
    for(int col = 0; col < grid [row].length - 3; col++){ 
     if((grid [row][col] == grid [row+1][col+1]) && 
       (grid [row+1][col+1] == grid [row+2][col+2]) && 
       (grid [row+2][col+2] == grid [row+3][col+3])){ 
      System.out.println("Someone won down-right!"); 
     } 
    } 
} 

これは比較的単純な力ですが、単純な目的に役立ちます。

提案された例ではなく、行の列、行の順に反復しないので、count_pieceは期待どおりに機能しません。あなたが反復を主張する場合:

for(int row = 0; row < grid .length - 3; row++){ 
    for(int col = 0; col < grid [row].length - 3; col++){ 
     int solution = true; 
     for (int index = 0; index <= 2; ++index) { 
      int rowIndex = row + index; 
      int colIndex = col + index; 
      if (grid [rowIndex][colIndex] != grid [rowIndex+1][colIndex+1]) { 
       solution = false; 
       break; 
      } 
     } 
     if (solution) { 
      System.out.println("Someone won down-right!"); 
     } 
    } 
} 

と思われます。

+0

斜めに繰り返すにはどうしたらいいですか?そして(0,0)だけでなく、グリッド内のどこにでもありますか? – Construct0r

+0

私はそのようにはしません。私はこれに答える答えを更新しました。 – Ironcache

+0

ここには、前例の[example](http://ideone.com/CfzmWS)があります。 – Ironcache

関連する問題