///////////////////////////////
// Console program for CMENACE
///////////////////////////////
#include	<conio.h>	//getch()使用の為
#include	<stdlib>	//srand()、rand()使用の為
#include	<iostream>	//cout、cin使用の為
#include	<windows.h>	//Win32使用の為

using namespace std;

#include	"CMENACE.h"

int PlayerInput(int&, char*);	//人間の打ち手入力関数（CUIのみ）

//メイン関数
int main(int argc, char **argv) {

	CMENACE menace;

	//BOARD構造体のサイズ確認
	cout << "BOARD構造体のサイズ = " << sizeof(BOARD)  << "バイト" << endl;
	//CBOARD変数のサイズ確認
	cout << "CBOARDのサイズ = " << sizeof(CBOARD)  << "バイト" << endl;
	//CMENACE変数のサイズ確認
	cout << "CMENACEのサイズ = " << sizeof(CMENACE)  << "バイト" << endl << endl;

	//データベースにデータを読み込む
	menace.BoardRead("MENACE.dat");
	//先手、後手、機械対戦の選択確認（結果はyou変数）
	cout << "先手（1）、後手（2）または機械対戦（3）を選択してください" <<endl;
	int you = 0;
	while(you < 1 || you > 3) {
		cin >> you;
	}
	//盤面の座標表示
	cout << "<<盤面座標>>\r\n-------\r\n|0|1|2|\r\n-------\r\n|3|4|5|\r\n-------\r\n|6|7|8|\r\n-------\r\n>>>>>><<<<<<" << endl;
	//対戦200回なので機械対戦がお勧め
	for(int i = 0; i < 200; i++) {
		menace.Init();
		//変数宣言
		int res = 0;	//未了0、先手勝利1、後手勝利2、引き分け3
		int times = 0;
		//対戦開始
		do {
			switch(you) {
			case 1:	//先手
				if(!(times % 2))	//先手打
					//CUI入力
					menace.MakeMove(PlayerInput(you, menace.GetBoard().m_Pos), you);
				else {			//後手打
					if(!menace.AutoMove(2)) {		//打つ手がない場合
						res = menace.WhoWon();		//後手が敗北
					}
				}
				menace.ShowBoard();
				break;
			case 2:	//後手
				if(!(times % 2)) {	//先手打
					if(!menace.AutoMove(1)) {		//打つ手がない場合
						res = menace.WhoWon();		//先手が敗北
					}
				}
				else			//後手打
					menace.MakeMove(PlayerInput(you, menace.GetBoard().m_Pos), you);
				menace.ShowBoard();
				break;
			case 3:	//機械対戦
				if(!(times % 2)) {	//先手打
					if(!menace.AutoMove(1)) {		//打つ手がない場合
						res = menace.WhoWon();		//先手が敗北
					}
				}
				else {			//後手打
					if(!menace.AutoMove(2)) {		//打つ手がない場合
						res = menace.WhoWon();		//後手が敗北
					}
				}
				break;
			}
			times++;
			if(!res && times > 4)
				res = menace.IsOver();
		} while(!res);
		cout << ">>>第" << i + 1 << "回対戦−";
		switch(res) {
		case 1:
			cout << "先手の勝ち−終了時盤面<<<" << endl;
			menace.Register();		//終了盤面の記録
			menace.ShowBoard();
			cout << "(menace.WhoWon() = " << menace.WhoWon() << ")" << endl << endl;
			cout << "後手の負け−終了一手前盤面<<<" << endl;
			menace.PushBack();		//終了一手前盤面
			menace.Register();		//終了一手前盤面の記録
			break;
		case 2:
			cout << "後手の勝ち−終了時盤面<<<" << endl;
			menace.Register();		//終了盤面の記録
			menace.ShowBoard();
			cout << "(menace.WhoWon() = " << menace.WhoWon() << ")" << endl << endl;
			cout << "先手の負け−終了一手前盤面<<<" << endl;
			menace.PushBack();		//終了一手前盤面
			menace.Register();		//終了一手前盤面の記録
			break;
		case 3:
			cout << "引き分け−終了時盤面<<<" << endl;
			break;
		case -1:
			cout << "先手の負け−終了時盤面<<<" << endl;
			menace.Register();		//終了盤面の記録
			break;
		case -2:
			cout << "後手の負け−終了時盤面<<<" << endl;
			menace.Register();		//終了盤面の記録
			break;
		}
		menace.ShowBoard();
		cout << "(menace.WhoWon() = " << menace.WhoWon() << ")" << endl << endl;
	}
	cout << "データベースのデータ数は" << menace.DBSize() << "です。" << endl;	
	menace.BoardWrite("MENACE.dat");
	//Pause
	getch();

	return 0;
}

//CUIのみ
int PlayerInput(int& you, char* pos) {

	switch(you) {
	case 1:
		cout << "先手";
		break;
	case 2:
		cout << "後手";
		break;
	default:
		return -1;
	}
	cout << "は打つ場所（0 - 8）を選んでください（'9'は機械対戦へ移行）" << endl;
	int move = -1;
	while(move < 0 || move > 8) {
		cin >> move;
		if(move == 9) {
			you = 3;
			for(int i = 0; i < 9; i++) {
				if(!pos[i])
					move = i;
			}
			return move;
		}
		if(pos[move]) {
			cout << "そこは既に打たれています" << endl;
			move = -1;
		}
	}
	return move;
}
