本篇继续上篇的未完部分。上篇介绍了软件的设计,本篇主要介绍软件的实现。部分实现的方法可能有别于以前的文章,但殊途同归,多种方法均能达成目标,有疑问的可以参考以前的文章,比如说:要实现一个按钮的单击事件,以前的文章面对初学者,介绍的操作步骤是“在界面上双击该按钮来自动添加其单击事件,然后找到对应的事件响应函数来编写代码”,但本篇面向有一定基础的人员,将基于界面和逻辑解耦的思想,直接介绍为“在.h文件和.cpp文件中分别增加事件响应函数的定义和实现,然后将该函数绑定到某个按钮的某个事件上”。
3. 实现
(1)导入SDK
参考前几篇文章,打开源代码所在的目录,将SDK文件(AIWZQDll.dll、AIWZQDll.lib、Inter.h)拷贝到该目录下,然后在解决方案资源管理器中右击test项目,在右键菜单中选择“添加-->现有项” ,在弹出的对话框中选中Inter.h并点击“添加”按钮。最后,在testDlg.cpp文件的头部添加以下代码来引入SDK:
#include "Inter.h"
#pragma comment(lib, "AIWZQDll.lib")
注意:以前的案例使用的是SDK 1.1.2.0版本,而本次的项目使用的是1.1.3.0版本;1.1.2.0版本的神经网络在使用过程中会不断学习进化,而1.1.3.0版本则支持在使用过程中不进化,即使用过程中不再学习和训练。当然了,1.1.3.0版本同样是向下兼容1.1.2.0版本的。
(2)初始化神经网络
在testDlg.cpp中找到CtestDlg::OnInitDialog()函数,在其中添加以下代码来读取标准化的网络模型并用之初始化确定性神经网络:
if (!InitFromModelFile("model.mod")) //使用模型文件初始化
{
AfxMessageBox(_T("找不到网络模型,请确定考评用的标准模型存在且未经擅自修改"));
PostQuitMessage(0);
}
结果如下图所示:
此处的代码表示,如果找不到评测用的标准模型,则弹出对话框给予提示,并退出软件。不再像以前一样支持从空模型初始化之类的。
(3)初始化主窗口
在testDlg.cpp中找到CtestDlg::OnInitDialog()函数,在其中添加以下代码来启用“开始评测”按钮和禁用“开始新游戏”按钮:
GetDlgItem(IDC_BTN_START)->EnableWindow(true);
GetDlgItem(IDC_BTN_NEW)->EnableWindow(false);
同样的,在CtestDlg::OnInitDialog()函数中添加以下代码来初始化评估局数为10、剩余局数为10、胜率为0/10、思维深度和专注度为空:
GetDlgItem(IDC_NUM_TOTAL)->SetWindowTextW(_T("10"));
GetDlgItem(IDC_NUM_LEFT)->SetWindowTextW(_T("10"));
GetDlgItem(IDC_RATIO)->SetWindowTextW(_T("0/10"));
GetDlgItem(IDC_DEPTH)->SetWindowTextW(_T(""));
GetDlgItem(IDC_CONCERN)->SetWindowTextW(_T(""));
注:此处的评估局数、剩余局数、胜率是固定的字符串,后续将在添加相应的变量之后使用函数动态生成这些字符串。
在testDlg.h文件中为类CtestDlg添加以下代码,用于定义“评估等级”选择框及其当前所选项(等级)的索引:
CComboBox m_objLevel; //用于选择“评估等级”的下拉框
int m_nCurSel; //当前选中的等级索引
结果如下图所示:
然后在testDlg.cpp文件中找到CtestDlg::OnInitDialog()函数,添加以下代码来初始化“评估等级”选择框的内容:
m_objLevel.InsertString(0, _T("一级"));
m_objLevel.InsertString(1, _T("二级"));
m_objLevel.InsertString(2, _T("三级"));
m_objLevel.InsertString(3, _T("四级"));
m_objLevel.InsertString(4, _T("五级"));
m_objLevel.InsertString(5, _T("六级"));
m_objLevel.InsertString(6, _T("七级"));
m_objLevel.InsertString(7, _T("八级"));
m_objLevel.InsertString(8, _T("九级"));
m_objLevel.InsertString(9, _T("十级"));
m_nCurSel = 0;
m_objLevel.SetCurSel(m_nCurSel);
该代码表示:评估等级可以选一级至十级,初始时默认选择的是一级,即索引为0的列表项。结果如下图所示:
最后,在CtestDlg::DoDataExchange()函数中添加以下代码来将变量m_objLevel绑定到下拉框控件上:
DDX_Control(pDX, IDC_LEVEL, m_objLevel);
结果如下图所示:
至此,主界面的初始化已经完成,运行结果如下图所示:
此时,评估等级选择框支持手动输入和下拉选择两种操作,建议将其改为只支持下拉选择,可在界面设计中修改该控件的Type属性值为Drop List,如下图所示:
运行结果如下图所示:
主窗口初始化的可见部分完成之后,为了后续的介绍,我们在此先引入几个变量,并在该初始化函数中一并进行初始化。在testDlg.h文件中定义变量m_bLogged标志着当前是否已经有用户登录,定义变量m_bStarted标志着是否已经开始评测,定义变量m_bHumanPlay标志着当前是否该被测者落子,定义变量m_nNumTotal记录每次评测的总局数,定义变量m_nNumLeft记录本次评测还剩几局没完成,定义变量m_nNumWin记录到目前为止被测者获胜的局数,定义变量m_nDepth记录思维深度,定义变量m_fConcern记录专注度,定义结果如下图所示:
然后再testDlg.cpp文件的CtestDlg::OnInitDialog()函数中对这些变量进行初始化,如下图所示:
后续内容请继续关注下一篇