package com.matheusjardimb;
import java.util.Date;
import com.matheusjardimb.PlayerFactory.Player;
public class Match {
public static final int TIMEOUT = -2;
public static final int ERROR = -1;
public static final int NO_MATCH = 0;
public static final int X = 1;
public static final int O = 2;
public static final int YES = 1;
public static final int NO = 0;
public static final int WINNER = 2;
public static final int LOOSER = 3;
public static final int DRAW = 4;
public static final int OK = 1;
public static final int OCCUPIED_POSITION = 0;
public static final int NONE = 0;
private Player playerX;
private Date playerXStart;
private Player playerO;
private Date playerOStart;
private int[][] board = new int[3][3];
private int lastPlayer = Match.O;
public Match() {
}
public Player getX() {
return playerX;
}
public void setX(Player playerX) {
this.playerX = playerX;
this.playerXStart = new Date();
}
public Player getO() {
return playerO;
}
public void setO(Player playerO) {
this.playerO = playerO;
this.playerOStart = new Date();
}
public boolean hasO() {
return this.playerO != null;
}
public boolean hasX() {
return this.playerX != null;
}
public Date getXStart() {
return playerXStart;
}
public Date getOStart() {
return playerOStart;
}
public String getBoardToString() {
String res = "";
for (int line = 0; line < board.length; line++) {
for (int column = 0; column < board.length; column++) {
if (board[line][column] == Match.X) {
res += "X";
} else if (board[line][column] == Match.O) {
res += "O";
} else {
res += ".";
}
}
}
return res;
}
public int getLastPlayer() {
return lastPlayer;
}
public int getWinner() {
if (checkLines() == Match.O || checkColumns() == Match.O || checkDiagonals() == Match.O) {
return Match.O;
}
if (checkLines() == Match.X || checkColumns() == Match.X || checkDiagonals() == Match.X) {
return Match.X;
}
if (allChecked()) {
return Match.DRAW;
}
return Match.NONE;
}
private boolean allChecked() {
int i = 0;
for (int line = 0; line < board.length; line++) {
for (int column = 0; column < board.length; column++) {
if (board[line][column] != Match.NONE) {
i++;
}
}
}
return i == 9;
}
private int checkLines() {
for (int line = 0; line < board.length; line++) {
if (board[line][0] == X && board[line][1] == X && board[line][2] == X)
return X;
if (board[line][0] == O && board[line][1] == O && board[line][2] == O)
return O;
}
return NONE;
}
private int checkColumns() {
for (int column = 0; column < board.length; column++) {
if (board[0][column] == X && board[1][column] == X && board[2][column] == X )
return X;
if (board[0][column] == O && board[1][column] == O && board[2][column]== O)
return O;
}
return NONE;
}
private int checkDiagonals() {
if (board[0][0] == O && board[1][1] == O && board[2][2] == O)
return O;
if (board[0][0] == X && board[1][1] == X && board[2][2]== X)
return 1;
if (board[0][2] == O && board[1][1] == O && board[2][0]== O)
return O;
if (board[0][2] == X && board[1][1] == X && board[2][0]== X)
return X;
return NONE;
}
public int setPosition(Player p, Integer pos) {
if (getWinner() != Match.NONE) {
System.out.println("getWinner() != Match.NONE");
return Match.ERROR;
}
if (!isTurn(p)) {
System.out.println("!isTurn(p)");
return Match.ERROR;
}
int c = pos % 3;
int l = pos / 3;
if (l > 2 || c > 2) {
System.out.println("l > 2 || c > 2");
return ERROR;
}
if (board[l][c] != NONE) {
return OCCUPIED_POSITION;
}
int mark = p.equals(getO()) ? O : X;
board[l][c] = mark;
if (lastPlayer == X){
lastPlayer = O;
}else{
lastPlayer = X;
}
return OK;
}
public boolean isTurn(Player p) {
if (p.equals(getO()) && getLastPlayer() == O)
return false;
if (p.equals(getX()) && getLastPlayer() == X)
return false;
return true;
}
}