Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

I can\'t get the code to return a draw if neither player wins and I can\'t get i

ID: 3641382 • Letter: I

Question

I can't get the code to return a draw if neither player wins and I can't get it to ask if the players want to continue after a draw and then get it to continue with a fresh grid.





import java.util.Scanner;

public class TicTac
{
//Constants

public final static int HEIGHT = 3;

public final static int WIDTH = 3;

public final static boolean CONTINUE = true;

public final static boolean END = false;

public final static String PLAYER1 = "O";

public final static String PLAYER2= "X";

//Atributes

public String[][] grid;

public boolean status;

public String player;

//Constructors
public TicTac()
{
player = PLAYER1;
status = CONTINUE;
grid = new String[HEIGHT][WIDTH];
for(int i = 0; i < HEIGHT; i++)
{
for(int j = 0; j < WIDTH; j++)
{
grid[i][j] = "-" ;
}
}
}

public boolean isEmpty(int pY, int pX)
{
if(grid [pY][pX].equals("-"))
{
return true;
}

return false;
}

public boolean placeMove(String player, int pX, int pY)
{
if(isEmpty(pY, pX))
{
grid[pY][pX] = player;
return true;
}
return false;
}

public String getGrid(){

String grid1 = "|" + grid[0][0] + "|" + grid[0][1] + "|" + grid[0][2] + "|" +" ";
String grid2 = "|" + grid[1][0] + "|" + grid[1][1] + "|" + grid[1][2] + "|" +" ";
String grid3 = "|" + grid[2][0] + "|" + grid[2][1] + "|" + grid[2][2] + "|" +" ";

return grid1 + grid2 + grid3;
}

public void changePlayer()
{
if (player.equals(PLAYER1))
{
player = PLAYER2;
}
else
{
player = PLAYER1;
}
}

public void hasWon()
{
if( grid[0][0].equals( grid[0][1]) && grid[0][2].equals(grid[0][0]) && grid[0][0].equals("O"))
{ System.out.println("O player has won");
status = END;
}
else if( grid[0][0].equals( grid[0][1]) && grid[0][2].equals(grid[0][0]) && grid[0][0].equals("X"))
{ System.out.println("X player has won");
status = END;
}
else if( grid[1][0].equals( grid[1][1]) && grid[1][2].equals(grid[1][0]) && grid[1][0].equals("O"))
{System.out.println("O player has won");
status = END;
}
else if( grid[1][0].equals( grid[1][1]) && grid[1][2].equals(grid[1][0]) && grid[1][0].equals("X"))
{System.out.println("X player has won");
status = END;
}
else if( grid[2][0].equals( grid[2][1]) && grid[2][2].equals(grid[2][0]) && grid[2][0].equals("O"))
{System.out.println("O player has won");
status = END;
}
else if( grid[2][0].equals( grid[2][1]) && grid[2][2].equals(grid[2][0]) && grid[2][0].equals("X"))
{System.out.println("X player has won");
status = END;
}
else if( grid[0][0].equals( grid[1][1]) && grid[2][2].equals(grid[0][0]) && grid[0][0].equals("O"))
{System.out.println("O player has won");
status = END;
}
else if( grid[0][0].equals( grid[1][1]) && grid[2][2].equals(grid[0][0]) && grid[0][0].equals("X"))
{
status = END;
}
else if( grid[0][2].equals( grid[1][1]) && grid[2][0].equals(grid[0][2]) && grid[0][2].equals("O") )
{System.out.println("O player has won");
status = END;
}
else if( grid[0][2].equals( grid[1][1]) && grid[2][0].equals(grid[0][2]) && grid[0][2].equals("X") )
{
status = END;
}
else if( grid[0][0].equals( grid[1][0]) && grid[2][0].equals(grid[0][0]) && grid[0][0].equals("O"))
{ System.out.println("O player has won");
status = END;
}
else if( grid[0][0].equals( grid[1][0]) && grid[2][0].equals(grid[0][0]) && grid[0][0].equals("X"))
{ System.out.println("X player has won");
status = END;
}
else if( grid[0][1].equals( grid[1][1]) && grid[2][2].equals(grid[0][1]) && grid[0][1].equals("O"))
{System.out.println("O player has won");
status = END;
}
else if( grid[0][1].equals( grid[1][1]) && grid[2][2].equals(grid[0][1]) && grid[0][1].equals("X"))
{System.out.println("X player has won");
status = END;
}
else if( grid[0][2].equals( grid[1][2]) && grid[2][2].equals(grid[0][2]) && grid[0][2].equals("O"))
{System.out.println("O player has won");
status = END;
}
else if( grid[0][2].equals( grid[1][2]) && grid[2][2].equals(grid[0][2]) && grid[0][2].equals("X"))
{System.out.println("X player has won");
status = END;
}

}


public static void main (String [] args)
{
TicTac tt = new TicTac();
Scanner keyboard = new Scanner(System.in);
int py = -1;
int px = -1;



while(tt.status)
{
if(tt.player.equals(PLAYER1))
{
System.out.println("Enter a row (1,2, or 3) for player O:");
py = keyboard.nextInt() - 1;
System.out.println("Enter a column (1,2, or 3) for player O:");
px = keyboard.nextInt() - 1;
}
else if(tt.player.equals(PLAYER2))
{
System.out.println("Enter a row (1,2, or 3) for player X:");
py = keyboard.nextInt() - 1;
System.out.println("Enter a row (1,2, or 3) for player X::");
px = keyboard.nextInt() - 1;

}
while(!tt.placeMove(tt.player, px, py))
{
if(tt.player.equals(PLAYER1))
{
System.out.println("Enter a row (1,2, or 3) for player O:");
py = keyboard.nextInt() - 1;
System.out.println("Enter a column (1,2, or 3) for player O:");
px = keyboard.nextInt() - 1;
}
else if(tt.player.equals(PLAYER2))
{
System.out.println("Enter a row (1,2, or 3) for player X:");
py = keyboard.nextInt() - 1;
System.out.println("Enter a row (1,2, or 3) for player X:");
px = keyboard.nextInt() - 1;
}


tt.placeMove(tt.player, px, py);
System.out.print(tt.getGrid());
tt.hasWon();
tt.changePlayer();
}

System.out.print(tt.getGrid());
tt.hasWon();
tt.changePlayer();
}

}
}

Explanation / Answer

++DO ALWAYS make class variables/fileds/attributes PRIVATE, access them by getters/setters

++'pY' 'pX' is confusing. Use the name 'row' and 'col' instead

++You don't have to check all 8 cases every time. Only 2-4 cases for each move (depend on the move's position itself) => REDO the hasWon method to checkStatus(int row, int col)

++Use an extra int freeSlots = HEIGHT * WIDTH; to determine when the game ends in draw

++Whenever assigning a move, do these extra work:

----decrement freeSlots

----check game status

----change player if status is not END

++The main class only need these methods:

----getGrid (to display the grid)

----placeMove (to interact with (human) players)

----getPlayer (to know whose turn is it)

----getStatus (to know when the game ends)

----hasWinner (to know if there is a winner of game draws)

++Make other methods PRIVATE (not accessible by non-class member)

import java.util.Scanner;

public class TicTac
{
    //Constants
    private final static int HEIGHT = 3;
    private final static int WIDTH = 3;
    private final static boolean CONTINUE = true;
    private final static boolean END = false;
    private final static char PLAYER1 = 'O';
    private final static char PLAYER2 = 'X';
    private final static char NONPLAYER = '-';

    //Atributes
    private char[][] grid;
    private boolean status;
    private char player;
    private boolean hasWinner;
    private int freeSlots;

    //Constructors
    public TicTac() {
        player = PLAYER1;
        status = CONTINUE;
        hasWinner = false;
        freeSlots = HEIGHT * WIDTH;
        grid = new char[HEIGHT][WIDTH];
        for(int i = 0; i < HEIGHT; i++)
            for(int j = 0; j < WIDTH; j++)
                grid[i][j] = NONPLAYER;
    }
  
    //Getters
    public boolean getStatus() { return status; }
    //
    public char getPlayer() { return player; }
    //
    public boolean hasWinner() { return hasWinner; }

    //Public methods
    public boolean placeMove(int row, int col)
    {
        if(isEmpty(row, col)) {
            grid[row][col] = player;
            freeSlots--;
            checkStatus(row, col);
            if (status == CONTINUE) changePlayer();
            return true;
        }
        return false;
    }
    //
    public String getGrid() {
        return "|" + grid[0][0] + "|" + grid[0][1] + "|" + grid[0][2] + "| "
             + "|" + grid[1][0] + "|" + grid[1][1] + "|" + grid[1][2] + "| "
             + "|" + grid[2][0] + "|" + grid[2][1] + "|" + grid[2][2] + "| ";
    }
  
    //Private methods
    private boolean isEmpty(int row, int col)
    {
        if (col > 2 || col < 0 || row > 2 || row < 0)
            return false;
        if (grid[row][col] == NONPLAYER)
            return true;
        return false;
    }
    //
    private void changePlayer() {
        player = player == PLAYER1 ? PLAYER2 : PLAYER1;
    }
    //
    private void checkStatus(int row, int col) {
        if (freeSlots == 0)
            status = END;
        //Row
        if (grid[row][0] == grid[row][1] && grid[row][0] == grid[row][2]) {
            hasWinner = true;
            status = END;
        }
        //Col
        else if (grid[0][col] == grid[1][col] && grid[0][col] == grid[2][col]){
            hasWinner = true;
            status = END;
        }
        //Diag
        else if (row == col) {
            if (grid[0][0] == grid[1][1] && grid[0][0] == grid[2][2]) {
                hasWinner = true;
                status = END;
            }
        }
        //Diag /
        else if ((col % 2 == 0 && row % 2 == 0) || (col == 1 && row == 1)) {
            if (grid[0][2] == grid[1][1] && grid[0][2] == grid[2][0]) {
                hasWinner = true;
                status = END;
            }
        }
    }
  
    //
    //END of TicTac
    //
  

    public static void main (String [] args) {
        Scanner keyboard = new Scanner(System.in);
        char response = 'y';
        TicTac tt;
        int row;
        int col;

        while (Character.toUpperCase(response) == 'Y') {
            tt = new TicTac();
            row = col = -1;
          
            while(tt.getStatus()) {
                while(!tt.placeMove(row, col)) {
                    System.out.print("Enter a row (1,2, or 3) for player "
                            + tt.getPlayer() + ": ");
                    row = keyboard.nextInt() - 1;
                    System.out.print("Enter a column (1,2, or 3) for player "
                            + tt.getPlayer() + ": ");
                    col = keyboard.nextInt() - 1;
                }
                System.out.print(tt.getGrid());
            }
          
            if (tt.hasWinner())
                System.out.println(tt.getPlayer() + " player has won");
            else
                System.out.println("Game draws");
          
            System.out.print(" Do you want to play a new game?(y/n) ");
            response = keyboard.next().charAt(0);
        }
    }
}

Hire Me For All Your Tutoring Needs
Integrity-first tutoring: clear explanations, guidance, and feedback.
Drop an Email at
drjack9650@gmail.com
Chat Now And Get Quote