Board

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>();
		}

		// mainBordのコピー
		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;

		// inventoryのコピー
		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();

		// mainBoardの場合
		if (place < 12) {
			int row = place / 3;
			int column = place % 3;

			selectedPieceID = mainBoard[row][column].getID();
			// inventoryの場合
		} 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();
		// placeが動ける先かのチェックが必要

		// コマを取る動作
		int row = place / 3;
		int column = place % 3;

		if (mainBoard[row][column] != null) {
			take(mainBoard[row][column]);
		}

		// 移動元がmainBoard
		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;
				}
			}

		}
		// 移動元がinventory
		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];

		// mainBoard
		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;
		}

		// inventory
		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;
	}
}