【課程設計】VC++可視化MFC小遊戲

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、效果呈現

 


1.png

 

 

1.png

 

 

5、工程完整代碼。

 

原文鏈接:https://blog.xygeng.cn/post/220.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章