package com.packtpub.storm.model;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
public class Board implements Serializable {
private static final long serialVersionUID = 1L;
public static final String EMPTY = " ";
public String[][] board = {{EMPTY, EMPTY, EMPTY}, {EMPTY, EMPTY, EMPTY}, {EMPTY, EMPTY, EMPTY}};
public Board() {
}
public Board(String key) {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
this.board[i][j] = "" + key.charAt(i * 3 + j);
}
}
}
public List<Board> nextBoards(String player) {
List<Board> boards = new ArrayList<Board>();
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (board[i][j].equals(EMPTY)) {
Board newBoard = this.clone();
newBoard.board[i][j] = player;
boards.add(newBoard);
}
}
}
return boards;
}
public boolean isEndState() {
return (nextBoards("X").size() == 0 || Math.abs(score("X")) > 1000);
}
public int score(String player) {
return scoreLines(player) - scoreLines(Player.next(player));
}
public int scoreLines(String player) {
int score = 0;
// Columns
score += scoreLine(board[0][0], board[1][0], board[2][0], player);
score += scoreLine(board[0][1], board[1][1], board[2][1], player);
score += scoreLine(board[0][2], board[1][2], board[2][2], player);
// Rows
score += scoreLine(board[0][0], board[0][1], board[0][2], player);
score += scoreLine(board[1][0], board[1][1], board[1][2], player);
score += scoreLine(board[2][0], board[2][1], board[2][2], player);
// Diagonals
score += scoreLine(board[0][0], board[1][1], board[2][2], player);
score += scoreLine(board[2][0], board[1][1], board[0][2], player);
return score;
}
public int scoreLine(String pos1, String pos2, String pos3, String player) {
int score = 0;
if (pos1.equals(player) && pos2.equals(player) && pos3.equals(player)) {
score = 10000;
} else if (pos1.equals(player) && pos2.equals(player) && pos3.equals(EMPTY) ||
pos1.equals(EMPTY) && pos2.equals(player) && pos3.equals(player)) {
score = 100;
} else {
if (pos1.equals(player) && pos2.equals(EMPTY) && pos3.equals(EMPTY) ||
pos1.equals(EMPTY) && pos2.equals(player) && pos3.equals(EMPTY) ||
pos1.equals(EMPTY) && pos2.equals(EMPTY) && pos3.equals(player)) {
score = 10;
}
}
return score;
}
public Board clone() {
Board clone = new Board();
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
clone.board[i][j] = this.board[i][j];
}
}
return clone;
}
public String toString() {
StringBuilder sb = new StringBuilder("\n---------\n");
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
sb.append("|").append(board[i][j]).append("|");
}
sb.append("\n---------\n");
}
return sb.toString();
}
public String toKey() {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
sb.append(board[i][j]);
}
}
return sb.toString();
}
}