package com.matheusjardimb;
import java.util.Date;
import com.matheusjardimb.PlayerFactory.Player;
public class Match {
public static final int TIMEOUT = -11;
public static final int ERROR = -10;
public static final int OCCUPIED_POSITION = -8;
public static final int OK = -7;
public static final int WINNER = -6;
public static final int LOOSER = -5;
public static final int NO_MATCH = -4;
public static final int YES = -3;
public static final int NO = -2;
public static final int X = -1;
public static final int NONE = 0;
public static final int O = 1;
public static final int DRAW = 2;
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 += " " + (line * 3 + column) + " ";
}
if (column == 0 || column == 1)
res += "|";
}
res += "\n";
}
return res + "\n";
}
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] + board[line][1] + board[line][2]) == -3)
return -1;
if ((board[line][0] + board[line][1] + board[line][2]) == 3)
return 1;
}
return 0;
}
private int checkColumns() {
for (int column = 0; column < board.length; column++) {
if ((board[0][column] + board[1][column] + board[2][column]) == -3)
return -1;
if ((board[0][column] + board[1][column] + board[2][column]) == 3)
return 1;
}
return 0;
}
private int checkDiagonals() {
if ((board[0][0] + board[1][1] + board[2][2]) == -3)
return -1;
if ((board[0][0] + board[1][1] + board[2][2]) == 3)
return 1;
if ((board[0][2] + board[1][1] + board[2][0]) == -3)
return -1;
if ((board[0][2] + board[1][1] + board[2][0]) == 3)
return 1;
return 0;
}
public int setPosition(Player p, Integer pos) {
if (getWinner() != 0) {
return Match.ERROR;
}
if (!isTurn(p)) {
return Match.ERROR;
}
int c = pos % 3;
int l = pos / 3;
if (l > 2 || c > 2) {
return ERROR;
}
if (board[l][c] != NONE) {
return ERROR;
}
int mark = p.equals(getO()) ? O : X;
board[l][c] = mark;
lastPlayer *= -1;
return 0;
}
public boolean isTurn(Player p) {
if (p.equals(getO()) && getLastPlayer() == O)
return false;
if (p.equals(getX()) && getLastPlayer() == X)
return false;
return true;
}
}