本篇继续上篇的未完部分。上篇介绍到了软件的实现,介绍完了“开始评测”按钮的实现,本篇继续介绍后续内容的编码。
(7)实现“开始新游戏”
在testDlg.h文件中添加以下代码来定义“开始新游戏”按钮的单击事件响应函数:
afx_msg void OnBnClickedBtnNew();
如下图所示:
然后在testDlg.cpp文件中添加如下的实现代码:
void CtestDlg::OnBnClickedBtnNew()
{
m_nNumLeft -= m_bStarted ? 1 : 0; //直接放弃当前未结束的局时减1,若当前局已结束则开始新局不再减1(因为在一局结束时已经减过了)
char strTemp[10] = { 0 };
sprintf(strTemp, "%d", m_nNumLeft);
SetDlgItemText(IDC_NUM_LEFT, CA2CT(strTemp)); //更新剩余局数
if (m_nNumLeft <= 1) //还剩最后一局
{
GetDlgItem(IDC_BTN_NEW)->EnableWindow(false);
}
StartNewGame();
Invalidate(TRUE);
m_bStarted = true;
m_bHumanPlay = true;
}
该代码表示,在点击“开始新游戏”按钮之后,先计算剩余局数并更新对应的界面显示;若是仅剩最后一局,则禁用“开始新游戏”按钮,毕竟后续已经没有可开始的局了;再之后调用SDK函数StartNewGame()来重置游戏数据并调用Invalidate(TRUE)来将数据刷新到界面上,这里主要刷新的时棋盘,即将棋盘清空;最后,设置m_bStarted为true以表示新局已经开始,可以落子了,同时设置m_bHumanPlay为true来让被测者(人)先落子。
在函数定义和实现均添加之后,在BEGIN_MESSAGE_MAP部分添加如下代码来将“开始新游戏”按钮的单击事件绑定到刚刚定义的事件响应函数上:
ON_BN_CLICKED(IDC_BTN_NEW, &CtestDlg::OnBnClickedBtnNew)
如下图所示:
至此,“开始新游戏”按钮的单击操作已经处理完成。
(8)更换“评估等级”
根据逻辑设计及前面的实现部分,若在评测过程中发现当前等级不适合自己,可以随时重新选择“评估等级”,这将结束本次评测,准备好重新开始评测。这意味着要处理选项变化消息。
在testDlg.h文件中添加以下代码来定义“评估等级”下拉框的选项变化事件响应函数:
afx_msg void OnCbnSelchangeLevel();
如下图所示:
然后在testDlg.cpp文件中添加如下的实现代码:
void CtestDlg::OnCbnSelchangeLevel()
{
int nCurSel = m_objLevel.GetCurSel();
if (nCurSel == m_nCurSel)
return;
if (m_bStarted && MessageBox(_T("确定要更换评测等级重新进行评测吗?这将会中止当前的操作"), _T("温馨提示"), MB_OKCANCEL) == IDCANCEL)
{
m_objLevel.SetCurSel(m_nCurSel);
return; //选择了取消更换
}
m_nCurSel = nCurSel;
SetLayers4Pred((m_nCurSel + 1) * 2); //第N等级:设置为使用2N层网络;即一级、二级、三级等依次使用两层、四层、六层等网络
char strTemp[10] = { 0 };
m_nNumLeft = m_nNumTotal;
sprintf(strTemp, "%d", m_nNumLeft);
SetDlgItemText(IDC_NUM_LEFT, CA2CT(strTemp)); //重置剩余局数
m_nNumWin = 0;
sprintf(strTemp, "%d/%d", m_nNumWin, m_nNumTotal);
SetDlgItemText(IDC_RATIO, CA2CT(strTemp)); //重置胜率
m_nDepth = -1;
m_fConcern = -1.;
SetDlgItemText(IDC_DEPTH, _T("")); //重置思维深度
SetDlgItemText(IDC_CONCERN, _T("")); //重置专注度
GetDlgItem(IDC_BTN_START)->EnableWindow(true); //启用“开始评测”按钮
GetDlgItem(IDC_BTN_NEW)->EnableWindow(false); //禁用“开始新游戏”按钮
m_bStarted = false;
}
该代码表示,当“评估等级”被重新选择之后,先判断新的等级是否和旧的相同,若相同(即没有改变等级),则直接退出,不做任何操作;否则的话,若当前正在进行评测,给出确认框,在用户取消更换等级之后将等级重置为旧的,并退出操作。对于确认过的等级更换,首先更改相关的等级变量并调用SDK的SetLayers4Pred()函数来设置神经网络层数,然后重置剩余局数、胜率、思维深度、专注度并刷新到界面上,之后启用“开始评测”按钮并禁用“开始新游戏”按钮来准备重新开始评测,相应的将m_bStarted置为false表示评测尚未开始。其中,各水平等级与确定性神经网络层深之间的关系使用的是简单的对应关系,各使用机构可在后续使用自己的研究成果或者相关研究人员研究出的对应关系进行替换。
在函数定义和实现均添加之后,在BEGIN_MESSAGE_MAP部分添加如下代码来将“评估等级”下拉框的选项更换事件绑定到刚刚定义的事件响应函数上:
ON_CBN_SELCHANGE(IDC_LEVEL, &CtestDlg::OnCbnSelchangeLevel)
如下图所示:
至此,“评估等级”下拉框的选项更换操作已经处理完成,即更换评估等级的操作已经实现完成。
到目前为止,大部分的逻辑控制已经完成,仅剩下落子操作相关的部分,即鼠标光标变化、鼠标点击落子、棋局状态判断、评测结束的计算等部分,这些内容请继续关注下一篇