2016-03-21 6 views
-1

私はtic-tac-toeゲームを遵守しましたが、私の唯一の問題はゲームから勝者/ネクタイを決定できないことです。私は勝者を見つけるための具体的な方法がありますが、うまくいきません。私は間違って何をしていますか?ここでは、コードは次のようになります。Tic-Tac-Toeが勝者を確認する

import java.util.Scanner; 

public class TicTacToe { 

    public static final int X = 1; 
    public static final int Y = 2; 

    public static void main(String[] args) { 

     final int X = 1; 
     final int Y = 2; 

     int[][] board = {{0, 0, 0}, 
     {0, 0, 0}, 
     {0, 0, 0} 
     }; 

     int count = 0; 

     while (!checkWinner(board)) { 
      printBoard(board); 

      if (count % 2 == 0) { 
       System.out.println("X's turn"); 
       move(X, board); 
      } else { 
       System.out.println("Y's turn"); 
       move(Y, board); 
      } 

      System.out.println(); 
      count++; 
     } 

    } 

    public static boolean checkWinner(int[][] board) { 
     if (board[0][0] == board[1][0] && board[1][0] == board[2][0] && (board[0][0] == "X" || board[0][0] == "Y")) { 
      return true; 
     } else if (board[0][1] == board[1][1] && board[1][1] == board[2][1] && (board[0][1] == "X" || board[0][1] == "Y")) { 
      return true; 
     } else if (board[0][2] == board[1][2] && board[1][2] == board[2][2] && (board[0][2] == "X" || board[0][2] == "Y")) { 
      return true; 
     } else if (board[0][0] == board[0][1] && board[0][1] == board[0][2] && (board[0][0] == "X" || board[0][0] == "Y")) { 
      return true; 
     } else if (board[1][0] == board[1][1] && board[1][1] == board[1][2] && (board[1][0] == "X" || board[1][0] == "Y")) { 
      return true; 
     } else if (board[2][0] == board[2][1] && board[2][1] == board[2][2] && (board[2][0] == "X" || board[2][0] == "Y")) { 
      return true; 
     } else if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && (board[0][0] == "X" || board[0][0] == "Y")) { 
      return true; 
     } else if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && (board[2][0] == "X" || board[2][0] == "Y")) { 
      return true; 
     } else { 
      return false; 
     } 
    } 

    public static void printBoard(int[][] board) { 
     for (int i = 0; i < 3; i++) { 
      System.out.print("| "); 
      for (int j = 0; j < 3; j++) { 
       if (board[i][j] == TicTacToe.X) { 
        System.out.print("X"); 
       } else if (board[i][j] == TicTacToe.Y) { 
        System.out.print("Y"); 
       } else { 
        System.out.print("-"); 
       } 
       System.out.print(" | "); 
      } 
      System.out.println(); 
     } 
    } 

    public static void move(int player, int[][] board) { 
     Scanner myScan = new Scanner(System.in); 

     System.out.print("Row: "); 
     int x = myScan.nextInt(); 
     System.out.print("Column: "); 
     int y = myScan.nextInt(); 

     board[x][y] = player; 

    } 

} 

私は、これは私が必要とするすべてであるとして、このプログラムに別のメソッドを追加する必要はありません。

+0

基本的には、3x3の行列があるので、1つの開始点を指定すると、水平方向、垂直方向、斜め方向を確認する必要があります。良いことは、開始点は常に最初の行(およびチェック)おそらく[this](http://stackoverflow.com/questions/32960625/how-to-properly-checkdiagonalwin-in-connect-4/32961044#32961044)と[this](http:// stackoverflow。 com/questions/32770321/connect-4-check-for-a-win-algorithm/32771401#32771401) – MadProgrammer

答えて

3

あなたはボードがフルでないノー勝者場合にwhileループ内で条件を置き換える必要があります。

while(!checkWinner(board) && /*board is not full*/) { 
//... 
} 

if(checkWinner(board)) //→ there's a winner; 
else //it's a draw; 

私はその形式の作品が、あなたが、checkWinner方法を再検討することを示唆しているが、それはです非常に非効率的で、あなたはそれを実装するためのより簡単でより楽しい方法を見つけることができます。たとえば、次のようなものを悪用することができます:

int n = board[0][0] * board[0][1] * board[0][2]; 
n == 0; → has vacant cells 
n == 1; → player 1 won 
n == 8; → player 2 won 
+0

さらに効率的です。ちょうど楽しみのために。 'n == 0'勝者なし、' n == 1'プレーヤー勝利、 'n == 0'勝者なし、' n == 1'勝利者、 n == 2 'プレーヤー2が勝ちます。明示的なコーディングは良いコーディングであり、最適化が必要な場所のみを最適化するので、一般的にはこれをお勧めしません。しかし、それがなぜ動作するのかを理解するための出発点のコーダーには良いチャレンジです。 – gbtimmon

0

コードはエラーなしでコンパイルされますか?

これはどのように機能するのでしょうか? ボード[1] [0] == "X"

ボードは整数の配列です! 「互換性のないオペランドの型intとString」が表示されます。

+0

"X"から "X"に変更しました。 –

+0

これも間違っています... 'x'(一重引用符で囲んだもの)はStringではなくバイトとして解釈されます。 –

0

配列の型は整数ですが、関数内で "X"や "Y"などの文字列と比較します。 == "X"を== TicTacToe.Xと置き換える必要があります... checkWinner()関数内のすべてのif文で... == TicTacToe.Yを使用して== "Y" 。

関連する問題