CBombAppCCustomer:自訂對話框(行數、列數、雷數)CSort:排行榜顯示CInput:通關輸入姓名class Bomb {
public:
int isbomb; // 初始是否為雷
bool issel; // 是否已處理且周圍有雷
bool isdone; // 遞迴展開時是否已處理
int num; // 周圍雷數
bool findbomb; // 玩家標記為雷
};
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) {
cs.style = WS_OVERLAPPED | WS_SYSMENU | WS_BORDER | WS_MINIMIZEBOX;
cs.cy = 10*15 + 6; // 初始 10×10 格子 + 控制區
cs.cx = 10*15 + 60;
return CFrameWnd::PreCreateWindow(cs);
}
class CBombView : public CView {
Bomb m_bomb[30][30]; // 最大棋盤
CString m_CurrentTime;
CTime m_BeginTime;
BOOL m_TimerBegin;
int m_iBomNum, m_iRow, m_iColumn;
int m_iBombFound;
CBitmapButton m_bitButton; // 表情按鈕
int m_CurrentLevel;
BOOL m_bIsColor;
CBitmap m_bmBomb[12];
int m_iGameOver; // 0=進行中 1=勝利 2=失敗
};
CRect rcclient; GetClientRect(&rcclient);
CRect rect(rcclient.cx/2-8, 10, rcclient.cx/2+8, 20);
m_Button.Create("New", BS_DEFPUSHBUTTON|WS_VISIBLE|BS_OWNERDRAW, rect, this, ID_GAME_BEGIN);
m_Button.LoadBitmaps(IDB_FACE1, IDB_FACE2);
首次左鍵點擊啟動計時器,記錄開始時間;OnTimer 計算時間差並用數字位圖繪製;遊戲結束停止計時器。
m_iGameOver=2Calculate 計算周圍雷數、Invalidate 重繪(不重繪背景防閃爍)findbomb 標記、更新剩餘雷數CInput 輸入姓名、寫入登錄檔Invalidate 重繪依格子狀態(未知、數字、雷、標記、錯誤標記等)繪製對應位圖,需精心處理邊界條件。
計算周圍雷數並遞迴展開無雷區域,注意邊界條件防止無限遞迴耗盡資源。
OnGameBegin:初始化、隨機佈雷(rand())、載入位圖、重繪OnGameCustom:彈出自訂對話框、調整視窗大小、重建按鈕位置、重新開始OnGameJunior/Middle/Senior:固定參數(如 20雷/8×8、40雷/13×13、99雷/20×25)OnGameColor:切換彩色/單色模式、重載位圖OnGameSort:從登錄檔讀取排行榜顯示數百行程式碼完成功能完整的掃雷遊戲,可自訂圖形風格,體驗 MFC SDI 架構下的遊戲開發全流程。