/** ゲーム盤 */
public class board {

	unit square[][];	//ユニットを配置する桝目。
	int size_x;	//盤の大きさ。
	int size_y;	//盤の大きさ。

	int national;	//勢力数。青軍と赤軍だけが戦うなら2。
	boolean defeatedKing[];

	int speed;	// ゲームのスピード。この数値が小さいほどゲーム速度は速く、多ければ遅い。0なら一時停止。

	public board(int size_x, int size_y) {

		speed = 0;
		national = 2;

		this.size_x = size_x;
		this.size_y = size_y;

		square = new unit[size_x][size_y];
		for (int x = 0; x < size_x; x++)
			for (int y = 0; y < size_y; y++)
				square[x][y] = null;

		defeatedKing = new boolean[national];
		for (int x = 0; x < national; x++)
			defeatedKing[x] = false;


	}

	/** ゲームスピードを変更する */
	public void setSpeed(int argSpeed) {
		if (0 == speed && 0 != argSpeed)
			startAllUnit();	// もし、いままでのスピードがゼロだったなら、停止していた盤上の全スレッドを再びrunさせる。
		speed = argSpeed;
	}
	public int getSpeed() { return speed; }

	/** 盤上の全スレッドをrunさせる。 */
	public void startAllUnit() {
		for (int x = 0; x < size_x; x++)
			for (int y = 0; y < size_y; y++)
				if (square[x][y] != null)
					((soldier)square[x][y]).start();
	}

	public int getSizeX() { return size_x; }
	public int getSizeY() { return size_y; }

	public unit getUnit(int x, int y) {
		if (0 <= x && x < size_x && 0 <= y && y < size_y)
			return square[x][y];
		else
			return null;
	}
	public void setUnit(int x, int y, unit unit) {
		if (0 <= x && x < size_x && 0 <= y && y < size_y)
			square[x][y] = unit;
	}
	public void removeUnit(int x, int y) {
		if (0 <= x && x < size_x && 0 <= y && y < size_y)
			square[x][y] = null;
	}

	/** source_x,source_yにあるユニットを、dest_x,dest_yの位置に移動させる。
		成功すれば真を返し、失敗すれば偽を返す。 */
	public boolean moveUnit(int source_x, int source_y, int dest_x, int dest_y) {

		if (0 <= source_x && source_x < size_x && 0 <= source_y && source_y < size_y &&
			0 <= dest_x && dest_x < size_x && 0 <= dest_y && dest_y < size_y ) {

			if (square[dest_x][dest_y] == null && square[source_x][source_y] != null) {
				setUnit(dest_x, dest_y, getUnit(source_x, source_y));
				removeUnit(source_x, source_y);
				return true;
			} else {
				return false;
			}
		}
		else
			return false;
	}

	public void setDefeatedKing(king argDefeatedKing) {
		if (argDefeatedKing.getNationality() < national) {
			defeatedKing[argDefeatedKing.getNationality()] = true;
			setSpeed(0);	// ゲームの停止。
		}
	}

}

