首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

用 Visual C++ 從零構建掃雷遊戲:完整架構與核心算法實現

     編輯:VC 教學

遊戲功能需求分析

核心玩法邏輯

  • 左鍵點擊未知區: 有雷 → 遊戲結束,顯示所有雷;無雷 → 顯示周圍雷數;周圍無雷 → 遞歸展開周圍 8 格直到遇到雷。
  • 右鍵點擊未知區: 標記/取消標記為雷,不驗證真偽。
  • 難度等級: 初級、中級、高級三級預設,支持自定義雷數與區域大小。
  • 界面元素: 左上:剩餘雷數(總雷數 - 標記數);中上:重新開始按鈕(顯示表情狀態);右上:計時器。
  • 勝利條件: 掃清所有非雷格 → 彈出輸入姓名對話框,按時間記入排行榜。

Visual C++ 關鍵技術實現

1. 應用向導創建基礎框架

  • 基於 SDI 創建 CBombApp,移除打印與狀態欄支持。
  • 資源編輯器修改菜單與加速鍵,對應 Windows 掃雷:開局、初/中/高級、自定義、顏色、英雄榜、退出、幫助。

2. 圖形資源準備

  • 繪製 13 個 16 色 10×10 位圖對應雷區各狀態,3 個 20×20 表情位圖,16 個單色位圖供換色,10 個黑底數字位圖(0-9)顯示時間/雷數。
  • 定制對話框資源:
    • CUSTOMER:3 靜態文本 + 3 編輯框(行、列、雷數),對應類 CCustomer
    • SORT:9 靜態文本顯示排行榜,對應類 CSort
    • INPUT:1 靜態文本 + 1 編輯框(輸入姓名),對應類 CInput

3. 核心數據結構:Bomb 類

class Bomb {
public:
    int isbomb;      // 初始是否為雷
    bool issel;      // 是否已處理且周圍有雷
    bool isdone;     // 遞歸處理標記
    int num;         // 周圍雷數
    bool findbomb;   // 玩家標記為雷(不一定真有雷)
};

4. 主框架窗口固定大小

重載 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 雷區與上部控制區。

5. 視圖類核心成員與邏輯

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失敗

關鍵函數實現要點:

  • OnCreate: 創建位圖按鈕(正常/按下狀態),ID 設為 ID_GAME_BEGIN 實現點擊重新開始。
  • 計時邏輯: 首次 WM_LBUTTONDOWN 啟動定時器,記錄開始時間;OnTimer 計算時間差並用數字位圖繪製;遊戲結束關閉定時器。
  • OnLButtonDown(核心):
    1. 判斷是否踩雷:是 → 關閉定時器、銷毀舊按鈕、創建「炸死」狀態按鈕、設置 m_iGameOver=2。
    2. 否 → 設置按鈕「笑臉」,調用 Calculate 統計周圍雷數,Invalidate 觸發重繪(不重畫背景防閃爍)。
  • OnRButtonDown: 切換 findbomb 標記,更新剩餘雷數;判斷是否全部排清 → 是則彈出 INPUT 對話框寫入註冊表,否則 Invalidate 重繪。
  • OnDraw: 每次點擊重繪雷區與控制區,邏輯複雜需精心設計。
  • Calculate: 遞歸計算周圍雷數,必須正確處理邊界條件 防止無限遞歸耗盡資源。

6. 菜單命令響應函數

函數功能
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,自製掃雷遊戲誕生!位圖可自繪風格,樂趣加倍。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved