2016-06-28 5 views
0

私のTicTacToeプログラムでは、私のcheckTieメソッドが機能せず、結果としてアウト・オブ・バウンド配列となりました。プログラムが動作せず、境界外の配列になります

このコードを実行するとボードが印刷され、誰かが勝ち、または3つが残ってからゲームが終了するまで、ゲームが実行されます。

私はそれが私のcheckTie forループと関係があると思うが、なぜそれが起こるのかわからない。また、タイが発生した場合、何も起こらないか、範囲外の配列が発生します。

import java.util.Scanner; 

public class TicTac { 

    public static int row, col; 
    public static Scanner scan = new Scanner(System.in); 
    public static char[][] board = new char[3][3]; 
    public static char turn = 'X'; 

    public static void main(String[] args) { 
     for (int i = 0; i < 3; i++) { 
      for (int j = 0; j < 3; j++) { 
       board[i][j] = '_'; 
      } 
     } 

     Play(); 

    } 

    public static boolean Play() { 
     boolean playing = true; 
     PrintBoard(); 
     while (playing) { 
      System.out.println(); 
      System.out.print("Please enter row: "); 
      row = scan.nextInt() - 1; 
      System.out.print("Please enter column: "); 
      col = scan.nextInt() - 1; 
      board[row][col] = turn; 
      if (GameOver(row, col)) { 
       playing = false; 
       System.out.println("Game Over! Player " + turn + " wins!"); 

       **I feel like this code below is where the problem is** 

       if (checkTie(board)) { 
        System.out.println("Tie Game!"); 
        return true; 
       } 

      } 
      PrintBoard(); 
      if (turn == 'X') 
       turn = '0'; 
      else 
       turn = 'X'; 
     } 
     return false; 
    } 

    public static void PrintBoard() { 

     for (int i = 0; i < 3; i++) { 
      System.out.println(); 
      for (int j = 0; j < 3; j++) { 
       if (j == 0) 
        System.out.print("| "); 
       System.out.print(board[i][j] + " | "); 
      } 
     } 
     System.out.println(); 
    } 

    public static boolean GameOver(int rMove, int cMove) { 
     // Check if perpendicular victory 
     if (board[0][cMove] == board[1][cMove] && board[0][cMove] == board[2][cMove]) 
      return true; 
     if (board[rMove][0] == board[rMove][1] && board[rMove][0] == board[rMove][2]) 
      return true; 
     // Check Diagonal Victory 
     if (board[0][2] == board[1][1] && board[0][0] == board[2][2] && board[1][1] != '_') 
      return true; 
     if (board[0][2] == board[1][1] && board[0][2] == board[2][0] && board[1][1] != '_') 
      return true; 

     return false; 

    } 

これは、ゲームの結果が同点であるかどうかを確認する方法です。

public static boolean checkTie(char[][] board) { 
     int spacesLeft = 0; 
     for (int i = 0; i < 3; i++) { 
      for (int j = 0; j < 3; j++) { 
       if (board[i][j] == '_') { 
        spacesLeft++; 
       } 
      } 
     } 

     if (spacesLeft == 0) { 
      return true; 
     } else { 
      return false; 
     } 

    } 

} 
+0

プログラムをクラッシュさせるために使用している正確な入力を教えてください。このコードは、あなたが描いている振る舞いを表しているわけではありません。いずれにしても、Javaはあなたに失敗した*正確な行を教えてくれますので、そこでの調査を開始します。 – paxdiablo

+0

IndexOutOfBoundsExceptionが発生している場合は、詳細なスタックトレースが表示されます。スタックトレースが発生した場所は正確ではありません。 –

+0

ああ、申し訳ありませんが、私はOutOfBoundsExceptionを修正しました。試合はcheckTieメソッドを実行せず、終了しません。 –

答えて

0

私はあなたがgameOverリターンがfalse'. As things stand, checkTie is only ever called afterゲームオーバーは '`trueを返した' ときcheckTieを行うためのものだと思います。

関連する問題