/**
 * 三目並べの盤面を表すクラス
 */
public class Banmen{
	private int next[]={1,0};
	private Masu [][] masu;
	public Banmen(Masu [][] masu){
		this.masu = masu;
	}
	public void setCheck(int x,int y,int teban){
		masu[x][y].setZyoutai(teban);
	}
	/**
	 * 次のプレイヤーに手番を渡す処理
	 *
	 * @param aite_check true:チェックを入れる,false:外す
	 * @return 次のプレイヤーの番号
	 */
	public int nextPlayer(int turn){
		return next[turn];
	}
	/**
	 * ゲームの終了判定をする処理
	 *
	 * @return ゲームが終了したかの判定を返す
	 */
	public boolean endJudge(){
		if(allFull() || mainComplete()){
			return true;
		}
		return false;
	}
	/**
	 * そのマスにチェックを入れることができるかの処理
	 *
	 * @param x そのマスの縦の座標 @param y そのマスの横の座標
	 * @return ゲームが終了したかの判定を返す
	 */
	public boolean isPossiblePlace(int x,int y){
		if(masu[x][y].getZyoutai() == -1){
			return true;
		}
		return false;
	}
	/**
	 * すべてのマスにチェックが入っているかを判定する処理
	 *
	 * @return すべてのマスにチェックが入っているかの判定を返す
	 */
	public boolean allFull(){
		for(int i = 0;i < 3;i++){
			for(int j = 0;j < 3;j++){
				if(masu[i][j].getZyoutai() == -1){
					return false;
				}
			}
		}
		return true;
	}
	public boolean mainComplete(){
		for(int j = 0;j < 2;j++){
			if(subComplete(j)){
				return true;
			}
		}
		return false;
	}
	/**
	 * 縦・横・斜めの列がそろっているかどうかの判定処理
	 *
	 * @param j 該当するプレイヤーをさす 
	 * @return 縦・横・斜めの列がそろっているかどうかの判定を返す
	 */
	public boolean subComplete(int j){
		int su[] = {0,0,0,0,0,0,0,0};
		for(int i = 0;i < 3;i++){
			su[i] = tateCount(i,j);
		}
		for(int i = 0;i < 3;i++){
			su[i + 3] = yokoCount(i,j);
		}
		su[6] = leftSlashCount(j);
		su[7] = rightSlashCount(j);
		if(maxCount(su) == 3){
			return true;
		}
		return false;
	}
	/**
	 * 該当するプレーヤーの縦の列のチェック数を返す処理
	 *
	 * @param teban 該当するプレーヤーを指す
	 * @return 縦の列のチェック数を返す
	 */
	public int tateCount(int number,int teban){
		int count = 0;
		for(int i = 0;i < 3;i++){
			if(masu[i][number].getZyoutai() == teban){
				count++;
			}
		}
		return count;
	}
	/**
	 * 該当するプレーヤーの横の列のチェック数を返す処理
	 *
	 * @param teban 該当するプレーヤーを指す
	 * @return 横の列のチェック数を返す
	 */
	public int yokoCount(int number,int teban){
		int count = 0;
		for(int i = 0;i < 3;i++){
			if(masu[number][i].getZyoutai() == teban){
				count++;
			}
		}
		return count;
	}
	/**
	 * 該当するプレーヤーの左斜めの列のチェック数を返す処理
	 *
	 * @param teban 該当するプレーヤーを指す
	 * @return 左斜めの列のチェック数を返す
	 */
	public int leftSlashCount(int teban){
		int count = 0;
		for(int i = 0;i < 3;i++){
			if(masu[i][i].getZyoutai() == teban){
				count++;
			}
		}
		return count;
	}
	/**
	 * 該当するプレーヤーの右斜めの列のチェック数を返す処理
	 *
	 * @param teban 該当するプレーヤーを指す
	 * @return 右斜めの列のチェック数を返す
	 */
	public int rightSlashCount(int teban){
		int count = 0;
		for(int i = 0;i < 3;i++){
			if(masu[i][2 - i].getZyoutai() == teban){
				count++;
			}
		}
		return count;
	}
	/**
	 * 該当するプレイヤーの縦・横・斜めの各列のチェック数の中の最大値を返す処理
	 *
	 * @param int su[] 縦・横・斜めの各列のチェック数
	 * @return 縦・横・斜めの各列のチェック数の中の最大値を返す
	 */
	public int maxCount(int [] su){
		int max_count = 0;
		for(int i = 0;i < 8;i++){
			if(su[i] > max_count){
				max_count = su[i];
			}
		}
		return max_count;
	}
	/**
	 * 現在の盤面の状態を出力する処理
	 */
	public void outPut(){
		for(int i = 0; i < 3;i++){
			String w = "";
			for(int j = 0;j < 3;j++){
				w = w + moji(i,j);
			}
			System.out.println(w);
		}
	}
	/**
	 * マスの状況によって表示する文字列を作成する処理
	 *
	 * @param int i そのマスの縦の座標 @param j そのマスの横の座標
	 * @return マスの状況によって表示する文字列を返す
	 */
	public String moji(int i,int j){
		if(masu[i][j].getZyoutai() == 0){
			return "○";
		}else{
			if(masu[i][j].getZyoutai() == 1){
				return "×";
			}else{
				return "□";
			}
		}
	}
}
	