2016-04-01 7 views
-3
import java.util.*; 
public class TicTacToe { 
public static char X = 'X'; 
public static char O = 'O'; 
public static char S = ' '; 
public static char[][] board = new char[3][3]; 
public static boolean isFull = false, win = false; 
public static void main(String[] args) { 
    Scanner in = new Scanner(System.in); 

    int c,r; 
    for(r=0;r<board.length;r++){ 
     for(c=0;c<board[r].length;c++) 
      board[r][c] = ' ';    
    } 
    System.out.println("Player 1: X"); 
    System.out.println("Player 2: O"); 
    printBoard(board); 
    for(int i = 0; i <9 && win==false;i++){ 

     if(i%2==0){ 
      do { 
       System.out.print("Player 1: Enter your next move:(r,c) "); 
       r = in.nextInt(); 
       c = in.nextInt(); 
       if(r>board.length || c>board.length || r<0 || c<0) 
        System.out.println("Error, try again "); 
       if(board[r][c]==X || board[r][c]==O){ 
        isFull=true; 
        System.out.println("This square is already taken, Player 1, try again"); 
       } 
       if(board[r][c]==S){ 
        isFull=false; 
        board[r][c] = X; 
        checkWin(board); 
        printBoard(board); 
       } 
      }while(isFull); 

     } 
     else{ 
      do{ 
       System.out.print("Enter your next move:(r,c) "); 
       r = in.nextInt(); 
       c = in.nextInt(); 
       if(r>board.length || c>board.length || r<0 || c<0) 
        System.out.println("Error, try again "); 
       if(board[r][c]==X || board[r][c]==O){ 
        isFull=true; 
        System.out.println("This square is already taken, Player 2, try again"); 
       } 
       if(board[r][c]==S){ 
        isFull=false; 
        board[r][c] = O; 
        checkWin(board); 
        printBoard(board); 
       } 
      }while(isFull); 
     } 
     if(win) 
      System.out.print("We have a winner"); 
    } 
} 
public static boolean checkWin(char[][] b){ 
    int r = 0,c = 0,countX = 0,countO = 0; 
    for(char i = board[r][c];r<3 && c<3;r++) 
     System.out.println(r); 
     if(board[r][c]==X) 
      countX++; 
     if(board[r][c]==O) 
      countO++; 
     if(countX==3 || countO==3) 
      return win = true; 
     if(countX<3 && countO<3 && r<3){ 
      countX = 0; 
      countO = 0; 
      r = 0; 
      c++; 
     } 
    return win = false; 
} 
public static void printBoard(char[][] b){ 
    int r = 0,c = 0; 
    System.out.println(); 
    for(r=0;r<b.length;r++){ 
     for(c=0;c<b[r].length-1;c++) 
      System.out.print(" " + b[r][c] + " |"); 
     System.out.println(" "+b[r][c]); 
     if(r<b.length-1){ 
      for(c=0;c < b[r].length-1;c++) 
       System.out.print("---+"); 
      System.out.println("---"); 
     } 
    } 
} 
} 

行が3つあるかどうかを確認しようとすると、これらの行にArrayOutOfBoundsExceptionがスローされます。Java TicTacToe ArrayOutOfBounds

if(board[r][c]==X) 
    countX++; 
if(board[r][c]==O) 
    countO++; 

私はそこに例外を投げる理由はわかりませんが、私はそこに3つを追加していると考えています。

+0

IDEデバッガでコードをステップしましたか?それが始まる場所です。 –

答えて

0

問題は、このforループである:

for(char i = board[r][c] ; r<3 && c<3 ; r++) 

あなたがr = 3されたら、r<3 && c<3falseはまだあるとあなたが境界例外のうちを取得する理由である、br[r][c]にアクセスしてみてください。

ifステートメントをリセットする代わりに、ネストされたループを使用することをお勧めします。方法、checkWinで

for(char i = board[r][c] ; c<3 ; r++) { 
    ... 
    if(r == 2) { 
     r=0; 
     c++; 
    } 
} 
0
int r = 0, c = 0, countX = 0, countO = 0; 
for (char i = board[r][c]; r < 3 && c < 3; r++) 
    System.out.println(r); 

if (board[r][c] == X) 
    countX++; 

:あなたは本当にそのルートを移動する場合でも、これが可能な構造です。 forループがあります。

ループが完了すると、行の値は3になります。 r ++は3回動作し、値は2と4番目の値は3になり、条件は失敗します。この中

if (board[r][c] == X) 

として現在3で同じr値を使用しているので、3,0の位置に要素がない場合はチェックしている次のステートメントで 。したがって、ArrayIndexOutOfBoundExceptionが返されます。

関連する問題