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

当我尝试检查一行中是否有三个元素时,它会在这些行上引发ArrayOutOfBoundsException。Java TicTacToe ArrayOutOfBounds

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

我不知道为什么它会抛出一个异常,因为我只是在那里增加了三个。

+0

你是否已经完成了IDE调试器中的代码?那是开始的地方。 –

回答

0

的问题是在这for循环:

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

当你到r = 3r<3 && c<3仍然false和您尝试访问br[r][c],这就是为什么你会得到一个出界异常。

我建议您使用嵌套循环代替if语句来重置。但是,如果你真的想要走这条路,这是一个可能的构造:

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

在方法,checkWin。有一个for循环。其中您正在迭代0到3的行。

当循环完成时,行值变为3. r ++工作3次,因此值为2,第4次值变为3并且条件失败。 在下面的语句要检查是否为

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

在此使用的是相同的r值这是目前3,所以在3,0位置没有元素。因此它给了ArrayIndexOutOfBoundException。