int _tmain(int argc, _TCHAR* argv[])
{
	//Definition
	clock_t start, finish;			//Timer Setup
	double totaltime;				//Timer Setup
	srand((unsigned)time(NULL));	//Srand 
	Info();							//Show Game Infomation
	ChessBoard CB;					//Create a new chess board;

	//Time Test
	/*
	start = clock();
	
	

	finish = clock();
	totaltime = (double)(finish - start) / CLOCKS_PER_SEC;
	cout << "\nThis Turn cost [" << totaltime << "] Seconds!" << endl;
	
	
	CB.GameMove(NewMove(0, 1, RED), false);
	CB.GameMove(NewMove(2, 1, RED), false);
	CB.GameMove(NewMove(0, 3, RED), false);
	CB.GameMove(NewMove(2, 3, RED), false);
	CB.GameMove(NewMove(0, 5, RED), false);
	CB.GameMove(NewMove(2, 5, RED), false);
	CB.GameMove(NewMove(0, 7, RED), false);
	CB.GameMove(NewMove(2, 7, RED), false);
	CB.GameMove(NewMove(0, 9, RED), false);
	CB.GameMove(NewMove(1, 10, RED), false);
	CB.GameMove(NewMove(3, 10, RED), false);
	CB.GameMove(NewMove(5, 10, RED), false);
	CB.GameMove(NewMove(7, 10, RED), false);
	CB.GameMove(NewMove(9, 10, RED), false);
	CB.GameMove(NewMove(5, 8, RED), false);
	CB.GameMove(NewMove(7, 8, RED), false);
	CB.GameMove(NewMove(9, 8, RED), false);
	CB.GameMove(NewMove(4, 3, RED), false);
	CB.GameMove(NewMove(4, 5, RED), false);
	CB.GameMove(NewMove(4, 7, RED), false);
	CB.GameMove(NewMove(3, 0, RED), false);
	CB.GameMove(NewMove(5, 0, RED), false);
	CB.GameMove(NewMove(7, 0, RED), false);
	CB.GameMove(NewMove(9, 0, RED), false);
	CB.GameMove(NewMove(5, 2, RED), false);
	CB.GameMove(NewMove(7, 2, RED), false);
	CB.GameMove(NewMove(10, 1, RED), false);
	CB.GameMove(NewMove(10, 3, RED), false);
	CB.GameMove(NewMove(10, 5, RED), false);
	CB.GameMove(NewMove(10, 7, RED), false);
	CB.GameMove(NewMove(8, 3, RED), false);
	CB.GameMove(NewMove(8, 5, RED), false);
	CB.GameMove(NewMove(6, 5, RED), false);
	ChessBoardSolver HH(CB,RED);
	HH.DefineChainInfo();
	HH.ShowBoardInfo();
	*/


	//Choose Model
	int model;
	cin >> model;
	if (model == 0)
		Cprintf("Open Default Model\n\n", 8);
	else if (model == 1)
		Model_AI_Game();
	else if (model == 2)
		Model_Define_Chain();
	else if (model == 3)
		Model_ChessBoardArray_Winner_Test();
	else
		Model_Define_ChessBoardArray(CB);


	for (;;)
	{
		//check winner at first(because the game may start from a state which exist a winner)
		int W = CB.Winner();
		if (W == RED)
		{
			cout << "Red Win" << endl;
			CB.PrintCB();
			system("pause");
			break;
		}
		if (W == BLUE)
		{
			cout << "Blue Win。" << endl;
			CB.PrintCB();
			system("pause");
			break;
		}

		//take turns to move
		CB.PrintCB();
		cout << "\n【0】Human  【1】AI" << endl;
		int com;
		for (;;)
		{
			int inputnumber;
			cin >> inputnumber;
			if (inputnumber == 0 || inputnumber == 1)
			{
				com = inputnumber;
				break;
			}
			Cprintf("WRONG ORDER, Please input again", 8);
		}
		if (com == 0)
		{
			system("cls");
			CB.PrintCB();
			for (;;)
			{
				cout << "\nInput LocATION and PLAYER,such as \"2 1 1\"" << endl;
				int locx, locy, owner;
				scanf_s("%d %d %d", &locx, &locy, &owner);
				if ((owner == 1 || owner == 2) && locx >= 0 && locx <= (LEN - 1) && locy >= 0 && locy <= (LEN - 1))//limit the range of input
				{
					if (owner == 2)
						owner = -1;
					if ((OddNum(locx) && EvenNum(locy)) || (EvenNum(locx) && OddNum(locy)))//'x' and 'y' should be a odd number and a even number
					{
						Move m = NewMove(locx, locy, owner);
						CB.GameMove(m, true);
						break;
					}
					else
					{
						cout << "WRONG ORDER" << endl;
					}
				}
				Cprintf("WRONG ORDER, Please input again\n", 8);
			}
		}
		else if (com == 1)
		{
			cout << "Please Input Player (1/2)" << endl;
			for (;;)
			{
				int owner;
				cin >> owner;
				if (owner == RED || owner == 2)
				{
					if (owner == 2)
						owner = BLUE;
					start = clock();
					//GameTurnMove(CB, owner, true);//AI Move
					finish = clock();
					totaltime = (double)(finish - start) / CLOCKS_PER_SEC;
					cout << "\nThis Turn cost [" << totaltime << "] Seconds!" << endl;
					break;
				}
				Cprintf("WRONG ORDER, Please input again\n", 8);
			}
		}
	}