2017-01-11 48 views
2

好吧,所以我必須做一個隨機tictactoe檢查器,顯示何時x勝,何時o勝,何時有領帶。所以我遇到的問題是它不會顯示聯繫,有時會說當x或o沒有贏時,他們就贏了。我不知道要在代碼中改變什麼,因爲在我做對角線檢查之前,它會打印出關係。這裏是整個代碼,但我敢肯定,問題來自檢查板部分,使得xWin和oWin成爲現實,我無法找到它在做什麼的地方。隨機井字棋檢查問題

package test; 

import java.util.Scanner; 
import java.util.Random; 

public class TicTacToe { 
    public static void main(String[] args) { 
     System.out.println("Welcome to random Tic Tac Toe Checker. Let's see our randomly generated board."); 
     int dimension = 3; 
     char[][] board = new char[dimension][dimension]; 
     Random r = new Random(); 

     for (int i = 0; i < 3; i++) // filling board 
     { 
      for (int j = 0; j < 3; j++) { 
       int choice = r.nextInt(2); 
       if (choice == 0) { 
        board[i][j] = 'X'; 
       } else if (choice == 1) { 
        board[i][j] = 'O'; 
       } 
      } 
     } 
     for (int i = 0; i < 3; i++) // filling board 
     { 
      for (int j = 0; j < 3; j++) { 
       System.out.print(board[i][j]); 
      } 
      System.out.println(); 
     } 

     boolean xWin = false;// checking board, order horizontal,vertical,left 
           // and right diagonal 
     boolean oWin = false; 

     for (int i = 0; i < 3; i++) { 
      boolean lineWin = true; 
      for (int j = 0; j < 3; j++) { 
       if (board[i][j] != board[i][0]) { 
        lineWin = false; 

       } 
      } 
      if (lineWin == true) { 
       if (board[i][0] == 'X') { 
        xWin = false; 
       } 
       if (board[i][0] == 'O') { 
        oWin = false; 
       } 

      } 
     } 
     for (int j = 0; j < 3; j++) { 
      boolean lineWin = true; 
      for (int i = 0; i < 3; i++) { 
       if (board[i][j] != board[0][j]) { 
        lineWin = true; 

       } 
      } 
      if (lineWin == true) { 
       if (board[0][j] == 'X') { 
        xWin = true; 
       } 
       if (board[0][j] == 'O') { 
        oWin = true; 
       } 

      } 
     } 
     boolean lineWin = true; 
     for (int i = 0; i < 3; i++) { 
      if (board[0][0] != board[i][i]) { 
       lineWin = false; 
      } 
      if (lineWin == true) { 
       if (board[0][0] == 'X') { 
        xWin = true; 
       } 
       if (board[0][0] == 'O') { 
        oWin = true; 
       } 

      } 
     } 
     lineWin = true; 
     for (int i = 0; i < 3; i++) { 
      if (board[0][0] != board[i][2 - i]) { 
       lineWin = false; 
      } 
      if (lineWin == true) { 
       if (board[0][0] == 'X') { 
        xWin = true; 
       } 
       if (board[0][0] == 'O') { 
        oWin = true; 
       } 
      } 
     } 

     if (xWin == false && oWin == false)// printing winners 
     { 
      System.out.println("CAT!It's a tie no one wins"); 
     } 
     if (xWin == true) { 
      System.out.println("X wins!"); 
     } 

     if (oWin == true) { 
      System.out.println("O wins!"); 
     } 

    } 
} 
+0

考慮到這一點,如果你知道一個'line'不能再贏,你爲什麼會繼續檢查它?另外,如果你知道'X'或'O'已經贏了,爲什麼你會繼續檢查其他可能的勝利條件?像[分支語句](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/branch.html)(特別是'break'語句)可能會有所幫助 – MadProgrammer

+1

請您舉個例子,實施失敗? – Codor

+0

'如果(board [0] [0]!= board [i] [2-i])'在你的上次檢查中錯誤,它不是'[0] [0]',而是[0] [2] –

回答

2

我固定的布爾錯誤以及對角線邏輯:

import java.util.Random; 

public class TicTacToe { 
    private static final int DIMENSION = 3; 

    public static void main(String[] args) { 
    System.out.println("Welcome to random Tic Tac Toe Checker. Let's see our randomly generated board."); 
    char[][] board = new char[DIMENSION][DIMENSION]; 
    final Random r = new Random(); 

    for (int i = 0; i < DIMENSION; i++) { 
     for (int j = 0; j < DIMENSION; j++) { 
     int choice = r.nextInt(2); 
     if (choice == 0) { 
      board[i][j] = 'X'; 
     } else if (choice == 1) { 
      board[i][j] = 'O'; 
     } 
     } 
    } 
    for (int i = 0; i < DIMENSION; i++) { 
     for (int j = 0; j < DIMENSION; j++) { 
     System.out.print(board[i][j]); 
     } 
     System.out.println(); 
    } 


    boolean xWin = false; 
    boolean oWin = false; 

    for (int i = 0; i < DIMENSION; i++) { 
     boolean lineWin = true; 
     for (int j = 0; j < DIMENSION; j++) { 
     if (board[i][j] != board[i][0]) { 
      lineWin = false; 
     } 
     } 
     if (lineWin) { 
     if (board[i][0] == 'X') { 
      xWin = true; 
     } 
     if (board[i][0] == 'O') { 
      oWin = true; 
     } 

     } 
    } 
    for (int j = 0; j < DIMENSION; j++) { 
     boolean lineWin = true; 
     for (int i = 0; i < DIMENSION; i++) { 
     if (board[i][j] != board[0][j]) { 
      lineWin = false; 
     } 
     } 
     if (lineWin) { 
     if (board[0][j] == 'X') { 
      xWin = true; 
     } 
     if (board[0][j] == 'O') { 
      oWin = true; 
     } 

     } 
    } 
    boolean lineWin = true; 
    for (int i = 0; i < DIMENSION; i++) { 
     if (board[0][0] != board[i][i]) { 
     lineWin = false; 
     } 
    } 
    if (lineWin) {//this check should not be in the loop 
     if (board[0][0] == 'X') { 
     xWin = true; 
     } 
     if (board[0][0] == 'O') { 
     oWin = true; 
     } 

    } 
    lineWin = true; 
    for (int i = 0; i < DIMENSION; i++) { 
     if (board[DIMENSION - 1][0] != board[i][DIMENSION - 1 - i]) { 
     lineWin = false; 
     } 
    } 
    if (lineWin) {//this check should not be in the loop 
     if (board[DIMENSION - 1][0] == 'X') { 
     xWin = true; 
     } 
     if (board[DIMENSION - 1][0] == 'O') { 
     oWin = true; 
     } 
    } 
    if (xWin == true && oWin == true) {//printing winners 
     System.out.println("Both players won!"); 
    } 
    if (xWin == false && oWin == false) { 
     System.out.println("CAT!It's a tie no one wins"); 
    } 
    if (xWin == true) { 
     System.out.println("X wins!"); 
    } 

    if (oWin == true) { 
     System.out.println("O wins!"); 
    } 
    } 
} 

注意:您可以增加DIMENSION一會笑。

+0

你是男性之神 – themannn

0

在第一塊

if(lineWin == true) 
{ 
    if(board[i][0] == 'X') 
    { 
    xWin = false; 
    } 
    if(board[i][0] == 'O') 
    { 
    oWin = false; 
    } 
} 

應該如下被改變。

if(lineWin == true) 
{ 
    if(board[i][0] == 'X') 
    { 
    xWin = true; 
    } 
    if(board[i][0] == 'O') 
    { 
    oWin = true; 
    } 
} 

此外,如下在第二塊中,部分

if(board[i][j] != board[0][j]) 
{ 
    lineWin = true; 
} 

應該改變。

if(board[i][j] != board[0][j]) 
{ 
    lineWin = false; 
} 
+0

試過了,它仍然是打印,當它沒有贏得勝利,但仍然沒有記錄領帶 – themannn

0

我想在這個文件中的主要問題涉及圍在中間,特別是線34 - 66,你做同樣的字符的水平和垂直行的初始檢查。

for (int i = 0; i < 3; i++) { 
     boolean lineWin = true; 
     for (int j = 0; j < 3; j++) { 
      if (board[i][j] != board[i][0]) { 
       lineWin = false; 

      } 
     } 
     if (lineWin == true) { 
      if (board[i][0] == 'X') { 
       xWin = false; //THESE LINES SHOULD BE CHANGING THE WIN CONDITION TO TRUE 
      } 
      if (board[i][0] == 'O') { 
       oWin = false; //LISTED ABOVE 
      } 

     } 
    } 
    for (int j = 0; j < 3; j++) { 
     boolean lineWin = true; 
     for (int i = 0; i < 3; i++) { 
      if (board[i][j] != board[0][j]) { 
       lineWin = true; //THIS LINE SHOULD BE FALSE 

      } 
     } 
     if (lineWin == true) { 
      if (board[0][j] == 'X') { 
       xWin = true; 
      } 
      if (board[0][j] == 'O') { 
       oWin = true; 
      } 
     } 

我列舉了一些變化,將修改代碼,使其運行你想要的方式。看起來在錯誤的時間聲明布爾值爲truefalse時出現了一些錯誤,所以這應該能夠解決問題。

+0

我試過這些變化,它仍然沒有打印領帶,並打印了一個贏得了它沒有贏得的 – themannn