1、引言:
本軟件將會實現視覺遊戲和閃電心算遊戲的開發,視覺遊戲是辨別不同色塊的或者是不同文字的色塊,閃電心算將會模擬《最強大腦》的模式,一組數據短時間內加減乘除,判斷答案正確。本程序僅由一人完成。
原文鏈接:https://blog.xygeng.cn/post/220.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、工程完整代碼。