Question

I'm having trouble figuring out how to display the winner of the game in this tic-tac-toe program.

 import java.util.*;
public class tic
{
    public static void main(String[] args) 
    {
        Scanner in = new Scanner(System.in);

        boolean flag=false;

        char[][] board = 
        {
        {' ', ' ', ' '},
        {' ', ' ', ' '},
        {' ', ' ', ' '}
        };

        boolean done = false;
        int player = 1;
        int row = 0;
        int col = 0;

        while (flag != true) 
        {
          checkForWinner(board);
          System.out.println("Enter the row and column for your next move");
          row = in.nextInt();
          col = in.nextInt();
          if (player == 1) 
          {
            board[row][col] = 'X';
            player = 2;
            checkForWinner(board);
           }
          else 
          { 
            board[row][col] = 'O';
            player = 1;
            checkForWinner(board);
          }
          printBoard(board);
          checkForWinner(board);
        }

        displayWinner(player, flag);  


    }
    public static void printBoard(char[][] board) 
    {
    for (int row = 0; row < 3; row++) 
    {
        for (int col = 0; col < 3; col++) 
        {
            System.out.print("|" + board[row][col] + "|");
        }
        System.out.println();
        System.out.println("-------");
    }
    }
    public static boolean checkForWinner(char[][] board)
   {
       // checkForWinner() method determines if a pattern of data stored
       // in the 2 D char array indicates the a player has won the game.

        boolean flag = false;
        boolean flag1 = false;
        boolean flag2 = false;
        boolean flag3 = false;
        boolean flag4 = false;

        // checks the contents of each row for matching data   
        for (int i = 0; i <= 2; i++)
        {
            if ((board[i][0] == board[i][1] && board[i][1] == board[i][2]) && board[i][2] != ' ') 
                flag1 = true;
        }

         // checks the contents of each column for matching data
        for (int j = 0; j <= 2; j++)
        {
            if ((board[0][j] == board[1][j] && board[1][j] == board[2][j]) && board[2][j] != ' ') 
                flag2 = true;
        }

        // checks the contents of one diagonal for matching data
        if ((board[0][0] == board[1][1] && board[1][1] == board[2][2]) && board[2][2] != ' ') 
                flag3 = true;

        // checks the contents of the other diagonal for matching data
        if ((board[0][2] == board[1][1] && board[1][1] == board[2][0]) && board[2][0] != ' ') 
                flag4 = true;

        // checks if any of the previous conditions evaluated to true        
        if (flag1 == true || flag2 == true || flag3 == true || flag4 == true)
            flag = true;

       // returns true if a winner was found; returns false is no winner     
       return flag;
   } // end of checkForWinner method
   public static void displayWinner(int player, boolean flag)
   {

    if (flag == true)
    {
        int currentplayer;
        currentplayer=player;
        System.out.println("The winner of the game is" +currentplayer);
    }


   }
}

The checkForWinner method was provided to us and can't be changed, from what i've seen it checks for all the possible win states without taking into account the player because of this i'm kind of lost as to how to start the method that would display the winner.

Any input as to what I could do with that method would be great.

Thank you for your attention.

Edit: Added the displayWinner method that I tried, which doesn't seem to work.

Was it helpful?

Solution

Call checkForWinner after each turn. Once you get back true, you know that whoever was the last one to move is the winner.

This is because you have checked the board before the last move, and there has been no winner at the time (otherwise, you would have exited the game earlier). Now that we have a winner, whoever made the last move must be the player who won.

Note that your current call of checkForWinner is useless, because you ignored the return value. Currently, the flag remains unassigned.

The call of displayWinner needs to take the winner number, not a flag.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top