1、引言:
本软件将会实现视觉游戏和闪电心算游戏的开发,视觉游戏是辨别不同色块的或者是不同文字的色块,闪电心算将会模拟《最强大脑》的模式,一组数据短时间内加减乘除,判断答案正确。本程序仅由一人完成。
原文链接:https://xygeng.cn/post/194.html
2、编程思路:
视觉游戏:
1. 新建不同的按钮数组
2. 不断的改变按钮的颜色和一个随机不同的颜色
3. 对按钮事件的计算,辨别是否是计算机给出的按钮色块
4. 判断用户的正确
5. 增加模式,对时间计算和分数的计算
6. 增加文字模式
闪电心算:
1. 按照时间,位数,运算法则给出一组数组闪现
2. 用数组储存闪现随机出现的数字
3. 按照模式计算数组
4. 增加时间,位数,运算法则,组数的选择
5. 判断用户的答案是否正确
6. 重新开始游戏的初始化。
3、部分代码:
//1.新建3个mfc按钮
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_START, start_ColorGame);
DDX_Control(pDX, IDC_GOVER, over);
DDX_Control(pDX, IDC_START_NUM, Number_Game);
ON_BN_CLICKED(IDC_START, &CGameDlg::OnBnClickedStart_ColorGame)
ON_BN_CLICKED(IDC_GOVER, &CGameDlg::OnBnClickedGover)
ON_BN_CLICKED(IDC_START_NUM, &CGameDlg::OnBnClickedStartNum)
//2.对按钮图片化
start_ColorGame.m_bTransparent = TRUE;
start_ColorGame.m_bDontUseWinXPTheme = FALSE;
over.m_bTransparent = TRUE;
over.m_bDontUseWinXPTheme = FALSE;
start_ColorGame.SetImage(IDB_PNG6);
over.SetImage(IDB_PNG7);
Number_Game.SetImage(IDB_PNG11);
//3.设置背景在onpaint重载
//设置背景
CRect rc;
GetWindowRect(&rc);
CImage mImage;
if (mImage.Load(_T("resource\\1.jpg")) == S_OK)
{
//这里让图片绘制区域和窗口大小一致
mImage.Draw(GetDC()->GetSafeHdc(), CRect(0, 0, rc.Width(), rc.Height()));
}
//4.按钮事件监听
//视觉游戏
void CGameDlg::OnBnClickedStart_ColorGame()
{
// TODO: 在此添加控件通知处理程序代码
dlg = new GAMEUI;
dlg->Create(IDD_GAME_UI);//创建一个非模态对话框
dlg->ShowWindow(SW_SHOWNORMAL);//显示非模态对话框
PlaySound(_T("resource\\GALA.wav"), NULL, SND_FILENAME | SND_ASYNC);//背景音乐
}
//闪电心算
void CGameDlg::OnBnClickedStartNum()
{
// TODO: 在此添加控件通知处理程序代码
dlg2 = new NUMBER;
dlg2->Create(IDD_QS);//创建一个非模态对话框 IDD_DIALOG2是我创建的一对话框ID
dlg2->ShowWindow(SW_SHOWNORMAL);//显示非模态对话框
}
void CGameDlg::OnBnClickedGover()
{
// TODO: 在此添加控件通知处理程序代码
exit(0);
}
核心计时器代码:
//计时器
void NUMBER::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
switch (nIDEvent) {
case 30001:
if (0 == d_count)
{
KillTimer(30001);
num_show = NULL; answer = NULL;
MessageBox(_T("请输入答案"));
break;
}
else if (game == false) {
KillTimer(30001);
num_show = NULL; answer = NULL;
MessageBox(_T("重新开始"));
break;
}
num_show = rand() % (max - min + 1) + min;
number[i] = num_show; i++;
UpdateData(FALSE);
--d_count;
SetDlgItemInt(IDC_Number, num_show); //刷新时间栏
break;
}
CDialogEx::OnTimer(nIDEvent);
}
背景透明:
//背景透明
HBRUSH NUMBER::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: 在此更改 DC 的任何特性
// TODO: 如果默认的不是所需画笔,则返回另一个画笔
if (nCtlColor == CTLCOLOR_STATIC)
{
pDC->SetBkMode(TRANSPARENT);
return (HBRUSH)::GetStockObject(NULL_BRUSH);
}
return hbr;
}
4、效果呈现
5、工程完整代码。