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);
}
}
}
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.