package model;
import java.util.ArrayList;
import java.util.List;
public class Board {
private AbstractPiece[][] mainBoard = new AbstractPiece[4][3];
private List<AbstractPiece>[] inventorys = new ArrayList[2];
private int selectedPieceID;
public Board() {
for (int i = 0; i < inventorys.length; i++) {
inventorys[i] = new ArrayList<AbstractPiece>();
}
mainBoard[3][1] = new Lion(0, true);
mainBoard[3][0] = new Elephant(1, true);
mainBoard[3][2] = new Giraffe(2, true);
mainBoard[2][1] = new Chick(3, true);
mainBoard[0][1] = new Lion(4, false);
mainBoard[0][2] = new Elephant(5, false);
mainBoard[0][0] = new Giraffe(6, false);
mainBoard[1][1] = new Chick(7, false);
}
public Board(Board board) {
mainBoard = board.getMainBoard();
inventorys = board.getInventorys();
AbstractPiece[][] setBoard = new AbstractPiece[4][3];
List<AbstractPiece>[] setInventorys = new ArrayList[2];
for (int i = 0; i < inventorys.length; i++) {
setInventorys[i] = new ArrayList<AbstractPiece>();
}
for (int i = 0; i < mainBoard.length; i++) {
for (int j = 0; j < mainBoard[i].length; j++) {
AbstractPiece targetPiece = mainBoard[i][j];
if (targetPiece != null) {
String name = targetPiece.getNAME();
if (name.equals("CHICK")) {
setBoard[i][j] = new Chick(targetPiece.getID(), targetPiece.isFirst());
} else if (name.equals("CHICKEN")) {
setBoard[i][j] = new Chicken(targetPiece.getID(), targetPiece.isFirst());
} else if (name.equals("ELEPHANT")) {
setBoard[i][j] = new Elephant(targetPiece.getID(), targetPiece.isFirst());
} else if (name.equals("GIRAFFE")) {
setBoard[i][j] = new Giraffe(targetPiece.getID(), targetPiece.isFirst());
} else if (name.equals("LION")) {
setBoard[i][j] = new Lion(targetPiece.getID(), targetPiece.isFirst());
}
}
}
}
this.mainBoard = setBoard;
for (int i = 0; i < inventorys.length; i++) {
for (int j = 0; j < inventorys[i].size(); j++) {
AbstractPiece targetPiece = inventorys[i].get(j);
String name = targetPiece.getNAME();
if (name.equals("CHICK")) {
setInventorys[i].add(new Chick(targetPiece.getID(), targetPiece.isFirst()));
} else if (name.equals("CHICKEN")) {
setInventorys[i].add(new Chicken(targetPiece.getID(), targetPiece.isFirst()));
} else if (name.equals("ELEPHANT")) {
setInventorys[i].add(new Elephant(targetPiece.getID(), targetPiece.isFirst()));
} else if (name.equals("GIRAFFE")) {
setInventorys[i].add(new Giraffe(targetPiece.getID(), targetPiece.isFirst()));
} else if (name.equals("LION")) {
setInventorys[i].add(new Lion(targetPiece.getID(), targetPiece.isFirst()));
}
}
}
this.inventorys = setInventorys;
}
public void select(Hand hand) {
int place = hand.getPlace();
if (place < 12) {
int row = place / 3;
int column = place % 3;
selectedPieceID = mainBoard[row][column].getID();
} else if (place < 18) {
selectedPieceID = inventorys[0].get(place - 12).getID();
} else {
selectedPieceID = inventorys[1].get(place - 18).getID();
}
}
public void move(Hand hand) {
int place = hand.getPlace();
int row = place / 3;
int column = place % 3;
if (mainBoard[row][column] != null) {
take(mainBoard[row][column]);
}
for (int i = 0; i < mainBoard.length; i++) {
for (int j = 0; j < mainBoard[i].length; j++) {
if (mainBoard[i][j] != null && mainBoard[i][j].getID() == selectedPieceID) {
mainBoard[row][column] = mainBoard[i][j];
mainBoard[i][j] = null;
return;
}
}
}
int inventoryIndex = hand.isFirst() ? 0 : 1;
List<AbstractPiece> inventory = inventorys[inventoryIndex];
for (int i = 0; i < inventory.size(); i++) {
if (inventory.get(i).getID() == selectedPieceID) {
mainBoard[row][column] = inventory.get(i);
inventory.remove(i);
return;
}
}
}
public void take(AbstractPiece piece) {
piece.setFirst(!piece.isFirst());
piece.invertMovableDirection();
if (piece.isFirst()) {
inventorys[0].add(piece);
} else {
inventorys[1].add(piece);
}
}
public boolean[][] getMobablePlace(AbstractPiece piece) {
boolean[][] out = new boolean[4][3];
int row = 0;
int column = 0;
boolean isMainBoard = false;
for (int i = 0; i < mainBoard.length; i++) {
for (int j = 0; j < mainBoard[i].length; j++) {
if (mainBoard[i][j] != null && mainBoard[i][j] == piece) {
row = i;
column = j;
isMainBoard = true;
}
}
}
if (isMainBoard) {
boolean[][] mobableDirection = piece.getMovableDirection();
for (int i = 0; i < mobableDirection.length; i++) {
for (int j = 0; j < mobableDirection[i].length; j++) {
try {
if (mainBoard[row - 1 + i][column - 1 + j] == null
|| mainBoard[row - 1 + i][column - 1 + j].isFirst != piece.isFirst) {
out[row - 1 + i][column - 1 + j] = mobableDirection[i][j];
}
} catch (ArrayIndexOutOfBoundsException e) {
}
}
}
return out;
}
for (int i = 0; i < mainBoard.length; i++) {
for (int j = 0; j < mainBoard[i].length; j++) {
if (mainBoard[i][j] == null) {
out[i][j] = true;
} else {
out[i][j] = false;
}
}
}
return out;
}
public void transformHiyoko(AbstractPiece piece) {
piece = new Chicken(piece.getID(), piece.isFirst());
if (!piece.isFirst()) {
piece.invertMovableDirection();
}
}
public AbstractPiece[][] getMainBoard() {
return mainBoard;
}
public List<AbstractPiece>[] getInventorys() {
return inventorys;
}
@Override
public String toString() {
String out = "";
for (int i = 0; i < mainBoard.length; i++) {
for (int j = 0; j < mainBoard[i].length; j++) {
if (mainBoard[i][j] == null) {
out += " ";
} else {
String name = mainBoard[i][j].getNAME();
if (name.equals("CHICK")) {
out += "c";
} else if (name.equals("CHICKEN")) {
out += "C";
} else if (name.equals("ELEPHANT")) {
out += "E";
} else if (name.equals("GIRAFFE")) {
out += "G";
} else if (name.equals("LION")) {
out += "L";
}
}
}
out += "\n";
}
out += "\n";
for (int i = 0; i < inventorys.length; i++) {
out += i;
out += ":";
for (int j = 0; j < inventorys[i].size(); j++) {
String name = inventorys[i].get(j).getNAME();
if (name.equals("CHICK")) {
out += "c";
} else if (name.equals("CHICKEN")) {
out += "C";
} else if (name.equals("ELEPHANT")) {
out += "E";
} else if (name.equals("GIRAFFE")) {
out += "G";
} else if (name.equals("LION")) {
out += "L";
}
}
out += "\n";
}
return out;
}
}