Question

I'm having problems getting my displayWinner method to work. I believe my calls aren't working in the way I think they should because I'm not very familiar with using multiple methods as this concept was only recently introduced.

The code is the following:

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 displayWinner method is at the bottom and the while loop in the main method is the one that plays the game and gives each player their turn.

Edit: My question would be how do I pass the flag from the checkForWinner method to the displayWinner method so that it can print out who the winner of the game is?

Was it helpful?

Solution

You are not updating flag declared in your main method. Change each of

checkForWinner(board);

to

flag = checkForWinner(board);

Without this flag will never change and you will never leave your while (flag != true) (which could be simplified to while(!flag)) loop which means you will never execute displayWinner(player, flag) method.

OTHER TIPS

You need to have the flag actually change you have checkWinner(board); when it should be flag = checkWinner(board); also you call the function twice (once at the beginning of the loop and once at the end) which there is no need for and you should take out the one at the beginning. Also your checkWinner(board) method won't work because it will return true if a row or column has the same char and at the beginning they all have the same char (' ') so it will register a win straight away, rather have it check whether a row or column matches one of the player chars.

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