CBombApp,移除打印與狀態欄支持。CUSTOMER:3 靜態文本 + 3 編輯框(行、列、雷數),對應類 CCustomerSORT:9 靜態文本顯示排行榜,對應類 CSortINPUT:1 靜態文本 + 1 編輯框(輸入姓名),對應類 CInputclass Bomb {
public:
int isbomb; // 初始是否為雷
bool issel; // 是否已處理且周圍有雷
bool isdone; // 遞歸處理標記
int num; // 周圍雷數
bool findbomb; // 玩家標記為雷(不一定真有雷)
};
重載 CMainFrame::PreCreateWindow 設置窗口樣式與固定尺寸:
cs.style = WS_OVERLAPPED | WS_SYSMENU | WS_BORDER | WS_MINIMIZEBOX;
cs.cy = 10 * 15 + 6; // 高度:10行×15像素 + 邊框/標題/控制區
cs.cx = 10 * 15 + 60; // 寬度:10列×15像素 + 附加值
固定窗體大小,隱含固定初始 10×10 雷區與上部控制區。
CBombView 繼承 CView,承擔繪製與交互:
Bomb m_bomb[30][30]; // 最大雷區
CString m_CurrentTime; // 顯示時間
CTime m_BeginTime; // 開始時間
BOOL m_TimerBegin; // 定時器狀態
int m_iBombNum, m_iRow, m_iColumn; // 雷數、行、列
int m_iBombFound; // 標記雷數
CBitmapButton m_bitButton; // 控制區位圖按鈕
int m_CurrentLevel; // 當前級別
BOOL m_bIsColor; // 彩色/單色標記
CBitmap m_bmBomb[12]; // 12個小位圖
int m_iGameOver; // 0進行中 1勝利 2失敗
ID_GAME_BEGIN 實現點擊重新開始。WM_LBUTTONDOWN 啟動定時器,記錄開始時間;OnTimer 計算時間差並用數字位圖繪製;遊戲結束關閉定時器。m_iGameOver=2。Calculate 統計周圍雷數,Invalidate 觸發重繪(不重畫背景防閃爍)。findbomb 標記,更新剩餘雷數;判斷是否全部排清 → 是則彈出 INPUT 對話框寫入註冊表,否則 Invalidate 重繪。| 函數 | 功能 |
|---|---|
OnGameBegin | 初始化時間、隨機佈雷(多次 rand())、按顏色裝載位圖、Invalidate 重繪 |
OnGameCustom | 彈出 CCustomer 對話框,獲取用戶設置,調整窗口大小(MoveWindow),重建按鈕位置,調用 OnGameBegin |
OnGameJunior/Middle/Senior | 類似 Custom,但用固定值:初級(20雷,8×8)、中級(40雷,13×13)、高級(99雷,20×25) |
OnGameColor | 切換彩色/單色位圖,重建按鈕,調用 OnGameBegin |
OnGameSort | 從註冊表讀取當前級別排名,彈出 SORT 對話框顯示 |
編譯修錯後 Build → Run,自製掃雷遊戲誕生!位圖可自繪風格,樂趣加倍。