1

I am working on an assignment to create a tictactoe game using a multidimensional array, a separate class with methods to be invoked by the main class.

The array is 3 X 3 and is initialized to zero. When player 1 chooses a location on the board a 1 is put in that specific index. Then the prompt allows player 2 to make their selection. Each time a player takes their turn a method is invoked to check if the board is complete, if it is complete (filled with 1's and 2') then the game is called a draw. This method is not working as it should and it calls the game a draw sometimes on the second move. Here is my method i am using.

public boolean isBoardComplete()
{
 // sets complete to true
 boolean complete = true;
 //will change complete to false
 for (int i = 0; i < 3; i++)
 {
 for(int j =0; j < 3; j++)
 {
 if (_board[i][j] == 0)
 {
 complete = false;
 }
 }
 }
 return complete;
}
Mehrdad Afshari
423k92 gold badges862 silver badges796 bronze badges
asked Jun 22, 2009 at 14:45
4
  • All we can say from t his is that there is indeed a 0 in your array. Need to see the code that creates the array, code that calls isBoardComplete and any other code that writes to the array Commented Jun 22, 2009 at 14:53
  • Have you verified that the Array is correctly filled with 1's when a move is played ? Try printing the array in isBoardComplete() and verify that the array contains the right values. Commented Jun 22, 2009 at 14:54
  • 2
    I don't understand your isBoardComplete() it returns true when all 9 places have been filled, which is after 9 steps. If it is a tic-tac-toe game you should check for 3 of the same value in rows, columns and in the two diagonals. Commented Jun 22, 2009 at 14:59
  • How are you creating the array? and how are you filling the cells? Try printing the contents (or use a debugger) to see the contents of the array in case of error. Commented Jun 22, 2009 at 17:00

6 Answers 6

1

This code is not producing the problem. You need to make sure the board is initially filled with zeros before beginning the game. I would print out the board state to make sure this is the case. Otherwise, make sure you are using your boolean value correctly when you return it from this method.

answered Jun 22, 2009 at 14:51
2
  • ok here is my constructor where i initialize everything to zero. (according to me lol) public TTTBoard() { //initializes privat data _player = 0; // comstructs 3 x 3 array of int for the board _board = new int [3][3]; // Initializes all ellements to the array of 0; nested for loop for (int i = 0; i < 3; i++) { for (int j =0; j < 3; j++) { _board [i][j] = 0; } } } Commented Jun 22, 2009 at 14:53
  • Ok, looks good, in that case make sure you are using the boolean that you return from your isBoardComplete() method properly. Remember that returning false means continue playing. while (!isBoardComplete()){//keep playing } Commented Jun 22, 2009 at 15:05
1

try this:

 public boolean isBoardComplete()
 {
 //will change complete to false
 for (int i = 0; i < 3; i++)
 {
 for(int j =0; j < 3; j++)
 {
 if (_board[i][j] == 0)
 {
 return false;
 }
 }
 }
 return true;
 }
answered Jun 22, 2009 at 14:59
1
  • The code in the question is correct. The complete flag is only set to true out side of the first for loop so once it is set to false it cannot be reset to true. Your code will be a bit more efficient though as it does not needlessly continue processing after it has found a 0. Commented Jun 22, 2009 at 15:19
1

Looks like the problem is in the makeMove() method. Code is returning 'false' after making the move and from the code flow it is clear that the method should return 'true' for valid move.

Try this

 public boolean makeMove( int row, int col) { 
 row = row - 1; col = col - 1;
 // Checks to see if board location is occupied and a move can be made
 if (_board[row][col] == 0)
 {
 _board[row][col] = _player;
 return true;
 }
 return false;
 }
answered Jun 23, 2009 at 3:40
0
0

Is the array declared as an Integer array or an int array? This will make a difference if you are using the == and auto-unboxing (even though with small numbers they should be cached).

Other than that, I would say that your array is not properly initialized. Post up the code that calls this method, and the code that initializes your array. The problem most likely resides in one of those two places.

answered Jun 22, 2009 at 14:52
1
  • I declared it as private int _board[][]; in the constructore i created it as _board = new int [3][3]; Commented Jun 22, 2009 at 15:02
0

If you are using JAVA 5 or above ,you can use Arrays.deepEquals method.From the javadocs ,"this method is appropriate for use with nested arrays of arbitrary depth."

Example:-

 String[][] ticTacToe = { {"X", "O", "O"},
 {"O", "X", "X"},
 {"X", "O", "X"}};
 System.out.println(Arrays.deepToString(ticTacToe));
 String[][] ticTacToe2 = { {"O", "O", "X"},
 {"O", "X", "X"},
 {"X", "O", "X"}};
 String[][] ticTacToe3 = { {"X", "O", "O"},
 {"O", "X", "X"},
 {"X", "O", "X"}};
 if (Arrays.deepEquals(ticTacToe, ticTacToe2)) {
 System.out.println("Boards 1 and 2 are equal.");
 } else {
 System.out.println("Boards 1 and 2 are not equal.");
 }
 if (Arrays.deepEquals(ticTacToe, ticTacToe3)) {
 System.out.println("Boards 1 and 3 are equal.");
 } else {
 System.out.println("Boards 1 and 3 are not equal.");
 }
 }
answered Jun 22, 2009 at 15:09
1
  • 1
    This is true, but how does it relate to this question? Commented Jun 22, 2009 at 15:11
0

Here is my code. I have the main class (TicTacToeApplication) and the TTTboard class.

import java.util.Scanner;
public class TicTacToeApplication {
 public static void main(String[] args)
 {
 // declare variables including our TTT board
 TTTBoard myGame = new TTTBoard();
 Scanner input = new Scanner(System.in);
 int row;
 int col;
 while(myGame.determineWinner() == 0 && !myGame.isBoardComplete())
 {
 myGame.displayBoard();
 System.out.println("Player " + myGame.getCurrentPlayer());
 System.out.println("Make your move.");
 System.out.print("Row please (1-3):");
 row = input.nextInt();
 while(row < 1 || row > 3)
 {
 System.out.println("Invalid Row.");
 System.out.print("Try again (1-3):");
 row = input.nextInt();
 }
 System.out.print("Col please (1-3):");
 col = input.nextInt();
 while(col < 1 || col > 3)
 {
 System.out.println("Invalid Col.");
 System.out.print("Try again (1-3):");
 col = input.nextInt();
 }
 // while the move is invalid make them make another move
 while(!myGame.makeMove(row, col))
 {
 System.out.println("Invalid Move... Try Again.");
 System.out.print("Row please (1-3):");
 row = input.nextInt();
 // error trap for valid row
 while(row < 1 || row > 3)
 {
 System.out.println("Invalid Row.");
 System.out.print("Try again (1-3):");
 row = input.nextInt();
 }
 System.out.print("Col please (1-3):");
 col = input.nextInt();
 // error trap for valid col
 while(col < 1 || col > 3)
 {
 System.out.println("Invalid Col.");
 System.out.print("Try again (1-3):");
 col = input.nextInt();
 }
 }
 }
 // if we left the loop because the boards full and there's no winner
 // it must be a cats game
 if (myGame.determineWinner() == 0)
 {
 System.out.println("Sorry - Cat's Game");
 }
 else
 {
 System.out.print("The Winner is Player ");
 if (myGame.getCurrentPlayer() == 1)
 {
 System.out.println("2");
 }
 else
 {
 System.out.println("1");
 }
 }
 }
}

public class TTTBoard
{
 private int [][] _board;
 private int _player;
 public TTTBoard ()
 {
 _player = 0;
 _board = new int [3][3];
 for (int row = 0; row < 3; row++)
 { 
 for(int column = 0; column < 3; column++)
 {
 _board[row][column] = 0;
 }
 }
 }
 public boolean makeMove( int row, int col)
 {
 row = row - 1;
 col = col - 1;
 // Checks to see if board location is occupied and a move can be made
 if (_board[row][col] == 0)
 {
 _board[row][col] = _player;
 return false;
 }
 else
 {
 return true;
 }
 }
 public boolean isBoardComplete ()
 {
 for (int row = 0; row < 3; row++)
 {
 for (int column = 0; column <3; column++)
 {
 if (_board [row][column] == 0)
 {
 return false;
 }
 }
 }
 return true;
 }
 public int determineWinner ()
 {
 // First check rows and columns
 int winner = 0;
 // Check for winner in row 1
 if (_board[0][0] == _board[0][1] && _board[0][0] == _board[0][2] &&
 _board[0][0] != 0)
 {
 winner = _board[0][0];
 }
 // Check for winner in row 2
 if (_board[1][0] == _board[1][1] && _board[1][0] == _board[1][2] &&
 _board[1][0] != 0)
 {
 winner = _board[1][0];
 }
 // Check for winner in row 3
 if (_board[2][0] == _board[2][1] && _board[2][0] == _board[2][2] &&
 _board[2][0] != 0)
 {
 winner = _board[2][0];
 }
 // Check for winner in col 1
 if (_board[0][0] == _board[1][0] && _board[0][0] == _board[2][0] &&
 _board[0][0] != 0)
 {
 winner = _board[0][0];
 }
 // Check for winner in col 2
 if (_board[0][1] == _board[1][1] && _board[0][1] == _board[2][1] &&
 _board[0][1] != 0)
 {
 winner = _board[0][1];
 }
 // Check for winner in col 3
 if (_board[0][2] == _board[1][2] && _board[0][2] == _board[2][2] &&
 _board[0][2] != 0)
 {
 winner = _board[0][2];
 }
 // Check for winner in first diagonal
 if (_board[0][0] == _board[1][1] && _board[0][0] == _board[2][2] &&
 _board[0][0] != 0)
 {
 winner = _board[0][0];
 }
 // Check for winner in 2nd diagonal
 if (_board[2][0] == _board[1][1] && _board[2][0] == _board[0][2] &&
 _board[2][0] != 0)
 {
 winner = _board[2][0];
 }
 return winner;
 }
 public void displayBoard()
 {
 System.out.println();
 for (int r=0; r<_board.length; r++)
 {
 for (int c=0; c<_board[r].length; c++)
 {
 System.out.print(" " + _board[r][c]);
 }
 System.out.println("");
 }
 }
 public int getCurrentPlayer ()
 {
 if (_player == 0)
 {
 return _player = 1;
 }
 if (_player == 1)
 {
 return _player = 2;
 }
 else
 {
 return _player = 1;
 }
 }
}
Jason Plank
2,3325 gold badges32 silver badges40 bronze badges
answered Jun 22, 2009 at 22:24
0

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.