0

I have been working on a tic tac toe game for a couple of days. And I just realize that I needed to do a GUI for it. With the following code, would it be fairly easy to add a GUI to this? and if so, what would be the best way to approach it.?

Thank you for you help.

import java.util.Scanner;


public class TicTacToe
{
  public static Scanner kb = new Scanner(System.in);
  final static int EMPTY = 0;     // internal code for empty square
  final static int USER = 1;      // internal code for user's squares
  final static int COMPUTER = 2;  // internal code for computer's squares
  final static int SIZE = 4;      // board grid is 4x4

  static int[][] board;           // data array for internal game board

/*
  The main() method introduces the game and says good-bye.  The actual work
  of playing the game is done by the playGame() method.  Later, main() can
  be changed to play more than one game each time the program is run.  This
  sample program has no way to end a game early.
*/
  public static void main(String[] args)
  {
	
	
    System.out.println("\nWelcome to Tic-Tac-Toe!");
    playGame();
    System.out.println("\nThank you for playing Tic-Tac-Toe.");
  }

// -------------------------------------------------------------------------
// For Java applications, put the main() method first, then put the other
// methods in alphabetical order.
// -------------------------------------------------------------------------

/*
  The clearBoard() method fills the game board with empty squares.
*/
  static void clearBoard()
  {
    int col, row;

    board = new int[SIZE][SIZE];
    for (row = 0; row < SIZE; row ++)
      for (col = 0; col < SIZE; col ++)
        board[row][col] = EMPTY;
  }

/*
  The computerMoves() method makes a move for the computer.  The computer's
  strategy in this example program is very poor: the computer picks an empty
  square at random!  There should be at least one empty square, because the
  endGame() method checks if the board is full.
*/
  static void computerMoves()
  {
    int col, row;
    int count;                    // number of empty squares
    int square;                   // index of random empty square

    // Count the number of empty squares.

    count = 0;
    for (row = 0; row < SIZE; row ++)
      for (col = 0; col < SIZE; col ++)
        if (board[row][col] == EMPTY)
          count ++;
    if (count == 0)
    {
      System.out.println("mistake in computerMoves() method");
      return;
    }

    // Pick one of the empty squares at random.  We are actually picking the
    // index (ordinal position) of the empty square, not the exact row and
    // column numbers.

    square = (int) (Math.random() * count);

    // Now go back and find the empty square.  This loop is not efficient,
    // since it repeats the work of the first loop, and it rescans the
    // entire board, even if the randomly chosen square is found early in
    // the loop.

    count = 0;
    for (row = 0; row < SIZE; row ++)
      for (col = 0; col < SIZE; col ++)
        if (board[row][col] == EMPTY)
        {
          if (count == square)
          {
            board[row][col] = COMPUTER;
            System.out.println("\nMy move is row " + (row+1) + " column "
              + (col+1) + ".");
          }
          count ++;
        }
  }

/*
  The displayBoard() method displays the game board by converting the
  internal representation (integers) into formatted text.
*/
  static void displayBoard()
  {
    int col, row;

    System.out.println();         // blank line before printing board

    // display top of board with column numbers

    System.out.print(" ");        // column numbers
    for (col = 0; col < SIZE; col ++)
      System.out.print(" " + (col+1));
    System.out.println();

    System.out.print(" ");        // top line in board
    for (col = 0; col < SIZE; col ++)
      System.out.print("+-");
    System.out.println("+");

    // Each row has two lines of output: board squares and a dividing line.

    for (row = 0; row < SIZE; row ++)
    {
      // display line with board squares

      System.out.print((row+1) + "|");
      for (col = 0; col < SIZE; col ++)
      {
        if (board[row][col] == EMPTY)
          System.out.print(" ");
        else if (board[row][col] == USER)
          System.out.print("X");
        else if (board[row][col] == COMPUTER)
          System.out.print("O");
        else
          System.out.print("mistake in displayBoard() method");
        System.out.print("|");
      }
      System.out.println();     // start new line

      // display dividing line between board rows

      System.out.print(" ");
      for (col = 0; col < SIZE; col ++)
        System.out.print("+-");
      System.out.println("+");
    }
  }

/*
  The endGame() method checks if a player has won or if all the board
  squares are now occupied.  This method returns true if the game is
  finished, and false if the game can be continued.
*/
  static boolean endGame()
  {
    int col, row;                 // column, row
    int count;                    // number of squares with same player
    int winner;                   // who wins the game (if anyone)

    winner = EMPTY;               // nobody has won yet

    // Check all rows to see if same player has occupied every square.

    for (row = 0; row < SIZE; row ++)
    {
      count = 0;
      if (board[row][0] != EMPTY)
        for (col = 0; col < SIZE; col ++)
          if (board[row][0] == board[row][col])
            count ++;
      if (count == SIZE)
        winner = board[row][0];
    }

    // Check all columns to see if same player has occupied every square.

    for (col = 0; col < SIZE; col ++)
    {
      count = 0;
      if (board[0][col] != EMPTY)
        for (row = 0; row < SIZE; row ++)
          if (board[0][col] == board[row][col])
            count ++;
      if (count == SIZE)
        winner = board[0][col];
    }

    // Check diagonal from top-left to bottom-right.

    count = 0;
    if (board[0][0] != EMPTY)
      for (row = 0; row < SIZE; row ++)
        if (board[0][0] == board[row][row])
          count ++;
    if (count == SIZE)
      winner = board[0][0];

    // Check diagonal from top-right to bottom-left.

    count = 0;
    if (board[0][SIZE-1] != EMPTY)
      for (row = 0; row < SIZE; row ++)
        if (board[0][SIZE-1] == board[row][SIZE-row-1])
          count ++;
    if (count == SIZE)
      winner = board[0][SIZE-1];

    // Did we find a winner?

    if (winner != EMPTY)
    {
      if (winner == USER)
        System.out.println("\nCongratulations!  You win!");
      else if (winner == COMPUTER)
        System.out.println("\nSorry, the computer wins this game.");
      else
        System.out.println("mistake in endGame() method");
      return true;                // return from endGame() method
    }

    // There was no winner.  Now check if the game board is full.

    count = 0;                    // number of empty squares
    for (row = 0; row < SIZE; row ++)
      for (col = 0; col < SIZE; col ++)
        if (board[row][col] == EMPTY)
          count ++;
    if (count == 0)
    {
      System.out.println("\nSorry, this game is tied.  Better luck next time!");
      return true;                // return from endGame() method
    }

    // Nobody won.  Nobody tied.  There is still a game to be played.

    return false;
  }

/*
  The playGame() method controls the playing of a single game.
*/
  static void playGame()
  {
    boolean end;                  // true when game is finished

    clearBoard();                 // start with an empty board
    end = false;                  // play until we can't play anymore

    while (!end)
    {
      displayBoard();             // show user the game board
      userMoves();                // ask user for a move
      displayBoard();             // show updated game board
      end = endGame();            // check if game is finished
      if (!end)
      {
        computerMoves();          // computer makes a move
        end = endGame();          // check if game is finished
        if (end)
          displayBoard();         // show final board if computer wins
      }
    }
  }

/*
  The userMoves() method asks the user (person) for his or her move using
  the keyboard.  We ask for a row number and a column number.  Java starts
  numbering rows and columns from zero; people prefer to start from one.
*/
  static void userMoves()
  {
    boolean asking;               // true until we get valid input
    int col, row;

    asking = true;
    while (asking)
    {
      System.out.println("\nWhat is your move?  Please type a row number\n"
        + "from 1 to " + SIZE + " and a column number from 1 to " + SIZE
        + ".");
      row = kb.nextInt();
      col = kb.nextInt();
      if ((row < 1) || (row > SIZE) || (col < 1) || (col > SIZE))
      {
        System.out.println("Sorry, row " + row + " or column " + col
          + " must be from 1 to " + SIZE + ".");
      }
      else
      {
        row --;                   // first Java row is numbered zero
        col --;                   // first Java column is numbered zero
        if (board[row][col] != EMPTY)
        {
          System.out.println("Sorry, that board square is occupied.");
          displayBoard();         // show user the game board (again)
        }
        else
        {
          board[row][col] = USER;
          asking = false;         // we are finished the user's input
        }
      }
    }
  }

} // end of class
2
Contributors
1
Reply
5
Views
7 Years
Discussion Span
Last Post by NormR1
0

A way:
First you need a JFrame to present a window.
A JPanel to draw the board on. Override the paintComponent class and do the drawing there
A JPanel to display status such as whose move and winner or draw notifications.
A switch for player to ask to play as X or O
A mouse listener to detect where the player wants to play.

Here's a javascript game I made a while back:
http://normsstuff.zxq.net/Games/TicTacToe.html

Edited by NormR1: n/a

This topic has been dead for over six months. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.