//////////////////////////////////////////
// NimProc.h
// Copyright (c) 01/10/2022 by BCCSkelton
//////////////////////////////////////////

/////////////////////////////////
//主ウィンドウCMyWndの関数の定義
//ウィンドウメッセージ関数
/////////////////////////////////
bool CMyWnd::OnCreate(WPARAM wParam, LPARAM lParam) {

	//コモンコントロールの初期化
	InitCommonControls();

	//ツールバー登録−Init(hWnd, hIinstance, ID, (以下省略可）Style)
	TBar.Init(m_hWnd, m_hInstance, TOOLBAR);
	//ツールバーボタン用カスタムビットマップ追加
	TBar.AddBmp(m_hInstance, MAKEINTRESOURCE(IDI_TOOLBAR), 10);
	//ツールバーボタン追加
	TBBUTTON tbb[14];
	ZeroMemory(tbb, sizeof(tbb));
	tbb[0].iBitmap = TBar.m_id + 0;
	tbb[0].fsState = TBSTATE_ENABLED;
	tbb[0].fsStyle = TBSTYLE_BUTTON;
	tbb[0].idCommand = IDM_RANDOM;
	tbb[1].iBitmap = TBar.m_id + 1;
	tbb[1].fsState = TBSTATE_ENABLED;
	tbb[1].fsStyle = TBSTYLE_BUTTON;
	tbb[1].idCommand = IDM_EVAL;
	tbb[2].iBitmap = TBar.m_id + 2;
	tbb[2].fsState = TBSTATE_ENABLED;
	tbb[2].fsStyle = TBSTYLE_BUTTON;
	tbb[2].idCommand = IDM_EXP;
	tbb[3].fsStyle = TBSTYLE_SEP;	//セパレーター
	tbb[4].iBitmap = TBar.m_id + 3;
	tbb[4].fsState = TBSTATE_ENABLED;
	tbb[4].fsStyle = TBSTYLE_BUTTON;
	tbb[4].idCommand = IDM_RVF;
	tbb[5].iBitmap = TBar.m_id + 4;
	tbb[5].fsState = TBSTATE_ENABLED;
	tbb[5].fsStyle = TBSTYLE_BUTTON;
	tbb[5].idCommand = IDM_RVE;
	tbb[6].iBitmap = TBar.m_id + 5;
	tbb[6].fsState = TBSTATE_ENABLED;
	tbb[6].fsStyle = TBSTYLE_BUTTON;
	tbb[6].idCommand = IDM_FVE;
	tbb[7].fsStyle = TBSTYLE_SEP;	//セパレーター
	tbb[8].iBitmap = TBar.m_id + 6;
	tbb[8].fsState = TBSTATE_ENABLED;
	tbb[8].fsStyle = TBSTYLE_BUTTON;
	tbb[8].idCommand = IDM_EXIT;
	tbb[9].fsStyle = TBSTYLE_SEP;	//セパレーター
	tbb[10].iBitmap = TBar.m_id + 7;
	tbb[10].fsState = TBSTATE_ENABLED;
	tbb[10].fsStyle = TBSTYLE_BUTTON;
	tbb[10].idCommand = IDM_INFO;
	tbb[11].fsStyle = TBSTYLE_SEP;	//セパレーター
	tbb[12].iBitmap = TBar.m_id + 8;
	tbb[12].fsState = TBSTATE_ENABLED;
	tbb[12].fsStyle = TBSTYLE_BUTTON;
	tbb[12].idCommand = IDM_ABOUT;
	tbb[13].iBitmap = TBar.m_id + 9;
	tbb[13].fsState = TBSTATE_ENABLED;
	tbb[13].fsStyle = TBSTYLE_BUTTON;
	tbb[13].idCommand = IDM_VERSION;
	TBar.AddButtons(14, tbb);

	//ステータスバー登録−Init(hWnd, hIinstance, ID, (以下省略可）Style)
	SBar.Init(m_hWnd, m_hInstance, STATUSBAR);
	//ステータスバー区画設定
	int sec[2] = {70, -1};
	SBar.SetSection(2, sec);
	//ステータスバー文字列設定
	SBar.SetText(0, "Nim Ver 1,.0");
	SBar.SetText(1, "最初にヘルプを読んでください");

	//仮想ウィンドウの初期化
	m_cvs.SetCanvas(m_hWnd);
	//背景を明るい緑で塗潰し描画
	m_cvs.Color(4);
	m_cvs.BrSelection(1);
	m_cvs.Clear();

	//描画用ビットマップの読み込み
	g_hCoin = (HBITMAP)LoadImage(m_hInstance, MAKEINTRESOURCE(IDI_COIN), IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE);
	g_hBlanc = (HBITMAP)LoadImage(m_hInstance, MAKEINTRESOURCE(IDI_BLANC), IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE);

	//ヘルプファイルパス、名（""で囲む）
	g_HelpFile = "\"";
	g_HelpFile = g_HelpFile + g_arg.Path();
	g_HelpFile = g_HelpFile + "\\NimHelp.chm\"";

	//メンバー変数の初期化
	m_Games = 0;		//通算ゲーム数
	m_1st = 0;			//先手の勝数
	m_2nd = 0;			//後手の勝数
	GameInit();			//m_Nim、m_You、、m_Type、m_Times、m_Result、m_Noの初期化

	return TRUE;
}

bool CMyWnd::OnLButtonDown(WPARAM wParam, LPARAM lParam) {

	//PC対人間対戦の場合は試合を進め、PC対PCの場合は一時中止する
	if(m_Type > 0) {
		if(m_Type < 4)
			PCvsMan();
		else
			MessageBox(m_hWnd, "一時中止します", "一時中止", MB_OK | MB_ICONEXCLAMATION);
	}
	return TRUE;
}

bool CMyWnd::OnRButtonDown(WPARAM wParam, LPARAM lParam) {

	//PC対人間対戦の場合は試合を進め、PC対PCの場合は一時中止する
	if(m_Type > 0) {
		if(m_Type < 4)
			PCvsMan();
		else
			MessageBox(m_hWnd, "一時中止します", "一時中止", MB_OK | MB_ICONEXCLAMATION);
	}
	return TRUE;
}

bool CMyWnd::OnNotify(WPARAM wParam, LPARAM lParam) {

	//ツールバーからのツールチップ情報取得
	switch (((LPNMHDR)lParam)->code) {
		case TTN_NEEDTEXT:
			static LPTOOLTIPTEXT lptip;
			lptip = (LPTOOLTIPTEXT)lParam;
			switch (lptip->hdr.idFrom) {
				case IDM_RANDOM:
					lptip->lpszText = "対「乱 数男";
					break;
				case IDM_EVAL:
					lptip->lpszText = "対「関 数子」";
					break;
				case IDM_EXP:
					lptip->lpszText = "対 「経 験太」";
					break;
				case IDM_RVF:
					lptip->lpszText = "乱vs関";
					break;
				case IDM_RVE:
					lptip->lpszText = "乱vs経";
					break;
				case IDM_FVE:
					lptip->lpszText = "関vs経";
					break;
				case IDM_EXIT:
					lptip->lpszText = "終了";
					break;
				case IDM_INFO:
					lptip->lpszText = "対戦情報";
					break;
				case IDM_ABOUT:
					lptip->lpszText = "Nimについて";
					break;
				case IDM_VERSION:
					lptip->lpszText = "バージョン情報";
					break;
			}
	}
	return TRUE;
}

bool CMyWnd::OnSize(WPARAM wParam, LPARAM lParam) {

	//クライアントエリアサイズの保存と1スパンの計算
	m_Width = LOWORD(lParam);		//ウインドウ幅
	m_Height = HIWORD(lParam);		//ウインドウ高さ
	if(m_Width > m_Height)
		m_Span = m_Height / 7;		//1コマ幅、高さ
	else
		m_Span = m_Width / 7;		//1コマ幅、高さ
	//ツールバーとステータスバーを調整
	TBar.AutoSize();
	SBar.AutoSize();
	//コインの描画
	ShowCoins();
	return TRUE;
}

bool CMyWnd::OnMinMax(WPARAM wParam, LPARAM lParam) {

	//典型的なウィンドウのサイズ制限処理
	MINMAXINFO *pmmi;
	pmmi = (MINMAXINFO*)lParam;
	pmmi->ptMinTrackSize.x = 380;	//クライアントエリア364 + 16
	pmmi->ptMinTrackSize.y = 425;	//クライアントエリア364 + 61
	return FALSE;					//処理はDefWndProcに任す
}

bool CMyWnd::OnPaint(WPARAM wParam, LPARAM lParam) {

	PAINTSTRUCT paint;
	m_cvs.OnPaint(BeginPaint(m_hWnd, &paint));
	EndPaint(m_hWnd, &paint);
	return TRUE;
}

bool CMyWnd::OnClose(WPARAM wParam, LPARAM lParam) {

	if(MessageBox(m_hWnd, "終了しますか", "終了確認",
					MB_YESNO | MB_ICONINFORMATION) == IDYES)  {
		//ビットマップの解放
		DeleteObject((HGDIOBJ)g_hCoin);
		DeleteObject((HGDIOBJ)g_hBlanc);
		//処理をするとDestroyWindow、PostQuitMessageが呼ばれる
		return TRUE;
	}
	else
		//そうでなければウィンドウではDefWindowProc関数をreturn、ダイアログではreturn FALSEとなる。
		return FALSE;
}

/////////////////////////////////
//主ウィンドウCMyWndの関数の定義
//メニュー項目、コントロール関数
/////////////////////////////////
bool CMyWnd::OnRandom() {

	m_Type = 1;		//人間対乱数
	if(MessageBox(m_hWnd, "先手にしますか？", "先手・後手確認", MB_YESNO | MB_ICONQUESTION) == IDYES)
		m_You = FIRST;
	else
		m_You = SECOND;
	//メニュー、ツールバーの有効化
	ChangeMenuStatus(FALSE);
	//手の打ち方を表示
	MessageBox(m_hWnd, "手を打つにはマウスをクリックしてください", "手の打ち方", MB_OK | MB_ICONINFORMATION);
	//ステータスバーの表示
	SBar.SetText(1, "人間対乱数");
	SBar.SendMsg(SB_SETTIPTEXT, 1, (LPARAM)"人間対乱数");	//ToolTipをつける
	//PC対人間対戦
	PCvsMan();
	return TRUE;
}

bool CMyWnd::OnEval() {

	m_Type = 2;		//人間対関数
	if(MessageBox(m_hWnd, "先手にしますか？", "先手・後手確認", MB_YESNO | MB_ICONQUESTION) == IDYES)
		m_You = FIRST;
	else
		m_You = SECOND;
	//メニュー、ツールバーの有効化
	ChangeMenuStatus(FALSE);
	//手の打ち方を表示
	MessageBox(m_hWnd, "手を打つにはマウスをクリックしてください", "手の打ち方", MB_OK | MB_ICONINFORMATION);
	//ステータスバーの表示
	SBar.SetText(1, "人間対関数");
	SBar.SendMsg(SB_SETTIPTEXT, 1, (LPARAM)"人間対関数");	//ToolTipをつける
	//PC対人間対戦
	PCvsMan();
	return TRUE;
}

bool CMyWnd::OnExp() {

	m_Type = 3;		//人間対経験値
	if(MessageBox(m_hWnd, "先手にしますか？", "先手・後手確認", MB_YESNO | MB_ICONQUESTION) == IDYES)
		m_You = FIRST;
	else
		m_You = SECOND;
	//メニュー、ツールバーの有効化
	ChangeMenuStatus(FALSE);
	//手の打ち方を表示
	MessageBox(m_hWnd, "手を打つにはマウスをクリックしてください", "手の打ち方", MB_OK | MB_ICONINFORMATION);
	//ステータスバーの表示
	SBar.SetText(1, "人間対経験値");
	SBar.SendMsg(SB_SETTIPTEXT, 1, (LPARAM)"人間対経験値");	//ToolTipをつける
	//PC対人間対戦
	PCvsMan();
	return TRUE;
}

bool CMyWnd::OnRvf() {

	m_Type = 4;		//乱数対関数
	m_No = inputdlg.DoModal(m_hWnd, "IDD_INPUT", inputdlgProc);
	//メニュー、ツールバーの有効化
	ChangeMenuStatus(FALSE);
	//ステータスバーの表示
	SBar.SetText(1, "乱数対関数");
	SBar.SendMsg(SB_SETTIPTEXT, 1, (LPARAM)"乱数対関数");	//ToolTipをつける
	//PC対PC対戦
	PCvsPC();
	return TRUE;
}

bool CMyWnd::OnRve() {

	m_Type = 5;		//乱数対経験値
	m_No = inputdlg.DoModal(m_hWnd, "IDD_INPUT", inputdlgProc);
	//メニュー、ツールバーの有効化
	ChangeMenuStatus(FALSE);
	//ステータスバーの表示
	SBar.SetText(1, "乱数対経験値");
	SBar.SendMsg(SB_SETTIPTEXT, 1, (LPARAM)"乱数対経験値");	//ToolTipをつける
	//PC対PC対戦
	PCvsPC();
	return TRUE;
}

bool CMyWnd::OnFve() {

	m_Type = 6;		//関数対経験値
	m_No = inputdlg.DoModal(m_hWnd, "IDD_INPUT", inputdlgProc);
	//メニュー、ツールバーの有効化
	ChangeMenuStatus(FALSE);
	//ステータスバーの表示
	SBar.SetText(1, "関数対経験値");
	SBar.SendMsg(SB_SETTIPTEXT, 1, (LPARAM)"関数対経験値");	//ToolTipをつける
	//PC対PC対戦
	PCvsPC();
	return TRUE;
}

bool CMyWnd::OnExit() {

	SendMsg(WM_CLOSE, 0, 0);
	return TRUE;
}

bool CMyWnd::OnInfo() {

	infodlg.DoModal(m_hWnd, "IDD_INFO", infodlgProc);
	return TRUE;
}

bool CMyWnd::OnAbout() {

	CSTR cmd = "hh ";
	cmd = cmd + g_HelpFile;
	WinExec(cmd.ToChar(), SW_SHOWNORMAL);

	return TRUE;
}

bool CMyWnd::OnVersion() {

	versiondlg.DoModal(m_hWnd, "IDD_VERSION", versiondlgProc);
	return TRUE;
}

///////////////////
//ユーザー定義関数
///////////////////
//ウィンドウにコインを表示する
void CMyWnd::ShowCoins() {

	//Nimのm_Coins[]のコピー配列を取得する
	int* p = m_Nim.GetCoins();
	//コインとブランクのビットマップをコンパチDCに読み込む
	HDC hDC1 = CreateCompatibleDC(m_cvs.hDC());
	SelectObject(hDC1 , g_hCoin);	//コイン
	HDC hDC2 = CreateCompatibleDC(m_cvs.hDC());
	SelectObject(hDC2 , g_hBlanc);	//ブランク
	//一旦ウィンドウ画面を消す
	m_cvs.Clear();
	//ビットマップの表示（原寸64 x 64をm_Span x m_Spanにする）
	for(int i = 0; i < 5; i++) {
		for(int j = 0; j < 5; j++) {
			if(p[j] >= (5 - i)) 
				StretchBlt(m_cvs.hDC(),
							m_Span + m_Span * j,
							m_Span + m_Span * i,
							m_Span, m_Span, 
							hDC1,
							0, 0, 64, 64, SRCCOPY);
			else
				StretchBlt(m_cvs.hDC(),
							m_Span + m_Span * j,
							m_Span + m_Span * i,
							m_Span, m_Span, 
							hDC2,
							0, 0, 64, 64, SRCCOPY);
		}
	}
	DeleteDC(hDC1);	
	DeleteDC(hDC2);
	InvalidateRect(m_hWnd, NULL, TRUE);	
}

//ゲーム初期化関数
void CMyWnd::GameInit() {

	m_Nim.Init();			//CNIM mNimの初期化
	m_You = 0;				//m_You（先手-1、後手-2）の初期化
	m_Type = 0;				//各種対戦のID
	m_No = 0;				//連続対戦のゲーム数
}

//PC対人間対戦
void CMyWnd::PCvsMan() {

	bool Surrender = FALSE;
	for(int i = 0; i < 2; i++) {
		int *p = m_Nim.GetCoins();		//pにコイン数の配列へのポインターを渡す
		if(m_Nim.GetNextPlayer() == m_You) {
			int no, col;
			no = takecoinsdlg.DoModal(m_hWnd, "IDD_TAKECOINS", takecoinsdlgProc);
			col = (no & 0xF00) >> 8;
			no &= 0xF;
			m_Nim.TakeCoin(col - 1, no);//先手の人間の手
			ShowCoins();				//コイン状況の表示
		}
		else {
			if(m_Type == 1) {
				if(m_Nim.RandomTake()) {//乱数を使ったPCの手
					ShowCoins();		//コイン状況の表示
				}
				else {					//投了（打てない）
					MessageBox(m_hWnd, "投了です", "PCの負け", MB_OK);
					Surrender = TRUE;
				}
			}
			else if(m_Type == 2) {
				if(m_Nim.EvalTake()) {	//評価関数を使ったPCの手
					ShowCoins();		//コイン状況の表示
				}
				else {					//投了（打てない）
					MessageBox(m_hWnd, "投了です", "PCの負け", MB_OK);
					Surrender = TRUE;
				}
			}
			else if(m_Type == 3) {
				if(m_Nim.ExpTake()) {	//経験DBを使ったPCの手
					ShowCoins();		//コイン状況の表示
				}
				else {					//投了（打てない）
					MessageBox(m_hWnd, "投了です", "PCの負け", MB_OK);
					Surrender = TRUE;
				}
			}
		}
		//ゲーム終了か？（終了−TRUE、継続−FALSE）
		if(Surrender || m_Nim.IsGameOver())
			WhenOver();					//ゲーム終了処理
	}
}

//PC対PC対戦
void CMyWnd::PCvsPC() {

	while(m_No > 0) {
		m_Nim.Init();			//CNIM mNimの初期化
		while(!m_Nim.IsGameOver()) {
			if(m_Type == 4) {
				if(!m_Nim.RandomTake()) {	//投了（打てない）
					SBar.SetText(1, "投了−先手PCの負け");
					break;
				}
				if(!m_Nim.EvalTake()) {		//投了（打てない）
					SBar.SetText(1, "投了−後手PCの負け");
					break;
				}
			}
			else if(m_Type == 5) {
				if(!m_Nim.RandomTake()) {	//投了（打てない）
					SBar.SetText(1, "投了−先手PCの負け");
					break;
				}
				if(!m_Nim.ExpTake()) {		//投了（打てない）
					SBar.SetText(1, "投了−後手PCの負け");
					break;
				}
			}
			else if(m_Type == 6) {
				if(!m_Nim.EvalTake()) {		//投了（打てない）
					SBar.SetText(1, "投了−先手PCの負け");
					break;
				}
				if(!m_Nim.ExpTake()) {		//投了（打てない）
					SBar.SetText(1, "投了−後手PCの負け");
					break;
				}
			}
		}
		WhenOver();		//ゲーム終了処理
		--m_No;
	}
	MessageBox(m_hWnd, "対戦が終了しました。\r\n今回の勝敗通算結果は「対戦情報」"\
						"でご確認ください。", "対戦が終了しました",
						MB_OK | MB_ICONEXCLAMATION);
	//ゲーム初期化
	GameInit();
	ShowCoins();
	//メニュー、ツールバーの有効化
	ChangeMenuStatus(TRUE);
}

//ゲーム終了処理
void CMyWnd::WhenOver() {
	
	m_Games++;
	switch(m_Nim.GetNextPlayer()) {		//先手勝利(2)、後手勝利(1)
	case 1:
		m_2nd++;
		SBar.SetText(1, "後手の勝ち");
		SBar.SendMsg(SB_SETTIPTEXT, 1, (LPARAM)"後手の勝ち");	//ToolTipをつける
		if(!m_No)
			MessageBox(m_hWnd, "後手の勝ち", "勝敗結果", MB_OK | MB_ICONEXCLAMATION);
		break;
	case 2:
		m_1st++;
		SBar.SetText(1, "先手の勝ち");
		SBar.SendMsg(SB_SETTIPTEXT, 1, (LPARAM)"先手の勝ち");	//ToolTipをつける
		if(!m_No)
			MessageBox(m_hWnd, "先手の勝ち", "勝敗結果", MB_OK | MB_ICONEXCLAMATION);
		break;
	}          
	if(!m_No) {
		//ゲーム初期化
		GameInit();
		ShowCoins();
		//メニュー、ツールバーの有効化
		ChangeMenuStatus(TRUE);
	}
}

//メニュー、ツールバーの有無効化
void CMyWnd::ChangeMenuStatus(bool EnableFlag) {

	//メニューハンドルの取得
	HMENU hMenu = GetSubMenu(GetMenu(m_hWnd), 0);
	//メニューバー
	EnableMenuItem(hMenu, 0, MF_BYPOSITION | (EnableFlag ? MF_ENABLED : MF_GRAYED));
	EnableMenuItem(hMenu, 1, MF_BYPOSITION | (EnableFlag ? MF_ENABLED : MF_GRAYED));
	EnableMenuItem(hMenu, 2, MF_BYPOSITION | (EnableFlag ? MF_ENABLED : MF_GRAYED));
	EnableMenuItem(hMenu, 4, MF_BYPOSITION | (EnableFlag ? MF_ENABLED : MF_GRAYED));
	EnableMenuItem(hMenu, 5, MF_BYPOSITION | (EnableFlag ? MF_ENABLED : MF_GRAYED));
	EnableMenuItem(hMenu, 6, MF_BYPOSITION | (EnableFlag ? MF_ENABLED : MF_GRAYED));
	DrawMenuBar(GetHandle());		//Re-draw
	//ツールバー(MAKELONGマクロは16bit整数2つをunsigned 32bit整数にする)
	SendMessage(TBar.GetHandle(), TB_ENABLEBUTTON, IDM_RANDOM, MAKELONG(EnableFlag, 0));
	SendMessage(TBar.GetHandle(), TB_ENABLEBUTTON, IDM_EVAL, MAKELONG(EnableFlag, 0));
	SendMessage(TBar.GetHandle(), TB_ENABLEBUTTON, IDM_EXP, MAKELONG(EnableFlag, 0));
	SendMessage(TBar.GetHandle(), TB_ENABLEBUTTON, IDM_RVF, MAKELONG(EnableFlag, 0));
	SendMessage(TBar.GetHandle(), TB_ENABLEBUTTON, IDM_RVE, MAKELONG(EnableFlag, 0));
	SendMessage(TBar.GetHandle(), TB_ENABLEBUTTON, IDM_FVE, MAKELONG(EnableFlag, 0));
}

///////////////////////////////
//ユーザーダイアログの関数定義
//コントロール関数
///////////////////////////////
////////////////////////
//TAKECOINSDLGダイアログ
////////////////////////
bool TAKECOINSDLG::OnInit(WPARAM wParam, LPARAM lParam) {

	char num[2] = {'0', NULL};
	int* p = Nim.m_Nim.GetCoins();	//Nimのm_Coins[]のコピー配列を取得する
	for(int i = 5; i > 0; i--) {
		if(p[i - 1] > 0) {
			num[0] = '0' + i;
			SendItemMsg(IDC_COL, CB_INSERTSTRING, 0, (LPARAM)num);
		}
	}
	return TRUE;
}

bool TAKECOINSDLG::OnCol(WPARAM wParam, LPARAM lParam) {

	if(HIWORD(wParam) != CBN_SELCHANGE)	//列の選択以外の場合
		return FALSE;
	//列が選択された場合
	int no = SendItemMsg(IDC_COINS, CB_GETCOUNT, 0, 0);
	//IDC_COINSの文字列をクリアー
	for(int i = 0; i < no; i++)
		SendItemMsg(IDC_COINS, CB_DELETESTRING, 0, 0);
	//数字登録用変数
	char num[2] = {'0', NULL};
	//Nimのm_Coins[]のコピー配列を取得
	int* p = Nim.m_Nim.GetCoins();
	//列コンボボックスから選択列の番号を取得
	no = SendItemMsg(IDC_COL, CB_GETCURSEL, 0, 0);
	//選択列の数字文字列を取得
	SendItemMsg(IDC_COL, CB_GETLBTEXT, no, (LPARAM)num);
	//列配列添字に変換
	no = num[0] - '1';
	//列配列の個数を文字列に変換し、IDC_COINSに登録
	for(int i = 0; i < p[no]; i++) {
		num[0] = '0' + (p[no] - i);
		SendItemMsg(IDC_COINS, CB_INSERTSTRING, 0, (LPARAM)num);
	}
	return TRUE;
}

bool TAKECOINSDLG::OnIdok() {

	//数字登録用変数
	char num[2] = {'0', NULL};
	//列コンボボックスの値を取得
	int no = SendItemMsg(IDC_COL, CB_GETCURSEL, 0, 0);
	if(no == CB_ERR) {
		MessageBox(m_hWnd, "列が選択されていません", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
	SendItemMsg(IDC_COL, CB_GETLBTEXT, no, (LPARAM)num);
	int col = num[0] - '0';
	//コインコンボボックスの値を取得
	no = SendItemMsg(IDC_COINS, CB_GETCURSEL, 0, 0);
	if(no == CB_ERR) {
		MessageBox(m_hWnd, "コイン数が選択されていません", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
	SendItemMsg(IDC_COINS, CB_GETLBTEXT, no, (LPARAM)num);
	no = num[0] - '0';
	//下2バイトで列、コイン個数を返す
	no = col * 0x100 + no;
	EndModal(no);
	return TRUE;
}

bool TAKECOINSDLG::OnIdcancel() {

	int col = SendItemMsg(IDC_COL, CB_GETCURSEL, 0, 0);
	if(col == CB_ERR) {
		MessageBox(m_hWnd, "列が選択されていません", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
	int num = SendItemMsg(IDC_COINS, CB_GETCURSEL, 0, 0);
	if(num == CB_ERR) {
		MessageBox(m_hWnd, "コイン数が選択されていません", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
	EndModal(FALSE);
	return TRUE;
}

////////////////////
//INPUTDLGダイアログ
////////////////////
bool INPUTDLG::OnInit(WPARAM wParam, LPARAM lParam) {

	SendItemMsg(IDC_GAMES, CB_INSERTSTRING, 0, (LPARAM)"100");
	SendItemMsg(IDC_GAMES, CB_INSERTSTRING, 1, (LPARAM)"500");
	SendItemMsg(IDC_GAMES, CB_INSERTSTRING, 2, (LPARAM)"1000");
	SendItemMsg(IDC_GAMES, CB_INSERTSTRING, 3, (LPARAM)"5000");
	return TRUE;
}

bool INPUTDLG::OnIdok() {

	int n = SendItemMsg(IDC_GAMES, CB_GETCURSEL, 0, 0);
	if(n == CB_ERR) {
		MessageBox(m_hWnd, "回数が選択されていません", "エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
	switch(n) {
	case 0:
		n = 100;
		break;
	case 1:
		n = 500;
		break;
	case 2:
		n = 1000;
		break;
	case 3:
		n = 5000;
		break;
	}
	EndModal(n);
	return TRUE;
}

bool INPUTDLG::OnIdcancel() {

	EndModal(FALSE);
	return TRUE;
}

///////////////////
//INFODLGダイアログ
///////////////////
bool INFODLG::OnInit(WPARAM wParam, LPARAM lParam) {

	//Nimについての情報開示
	CSTR num(Nim.m_Nim.DBSize());
	SendItemMsg(IDC_EDIT1, WM_SETTEXT, 0, (LPARAM)num.ToChar());
	num = Nim.m_Games;
	SendItemMsg(IDC_EDIT2, WM_SETTEXT, 0, (LPARAM)num.ToChar());
	num = Nim.m_1st;
	SendItemMsg(IDC_EDIT3, WM_SETTEXT, 0, (LPARAM)num.ToChar());
	num = Nim.m_2nd;
	SendItemMsg(IDC_EDIT4, WM_SETTEXT, 0, (LPARAM)num.ToChar());
	return TRUE;
}

bool INFODLG::OnIdok() {

	EndModal(TRUE);
	return TRUE;
}

bool INFODLG::OnIdcancel() {

	EndModal(FALSE);
	return TRUE;
}

//////////////////////
//VERSIONDLGダイアログ
//////////////////////
bool VERSIONDLG::OnIdok() {

	EndModal(TRUE);
	return TRUE;
}

bool VERSIONDLG::OnIdcancel() {

	EndModal(FALSE);
	return TRUE;
}
