2016-04-01 5 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("---"); 
     } 
    } 
} 
} 

Wenn ich versuche, um zu prüfen, ob es drei in einer Reihe ist, ist es eine ArrayOutOfBoundsException auf diesen Linien wirft.Java TicTacToe ArrayOutOfBounds

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

Ich weiß nicht, warum es gibt eine Ausnahme auslösen würde man bedenkt, dass ich dort drei bin gerade hinzufügen.

+0

Haben Sie den Code in Ihrem IDE-Debugger durchgegangen? Das ist der Ort, um anzufangen. –

Antwort

0

Das Problem ist in diesem for Schleife:

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

Wenn Sie zu r = 3 bekommen, r<3 && c<3 ist noch false und Sie versuchen, br[r][c] zuzugreifen, weshalb Sie ein außerhalb der Grenzen Exception.

Ich schlage vor, dass Sie verschachtelte Schleifen anstelle von if Anweisung zum Zurücksetzen verwenden. Aber wenn Sie wirklich diesen Weg gehen wollen, dann ist dies ein mögliches Konstrukt:

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++; 

In Verfahren, checkWin. Es gibt eine for-Schleife. In dem Sie Zeilen von 0 bis 3 wiederholen.

Wenn die Schleifen abgeschlossen sind, geht der Wert auf 3. r ++ funktioniert 3 mal so ist der Wert 2 und der 4. Zeitwert wird 3 und die Bedingung schlägt fehl. In nächster Anweisung Sie überprüfen, ob als

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

In diesen Sie gleichen r-Wert verwenden, die derzeit 3 ​​ist, so gibt es kein Element an der Position von 3,0. Daher gibt es ArrayIndexOutOfBoundException.