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

VC++ 掃雷遊戲完整實作教學(SDI 架構)

     編輯:關於VC++

核心遊戲邏輯

  • 左鍵點擊未知區:有雷→遊戲結束顯示所有雷;無雷→顯示周圍雷數,周圍無雷則遞迴展開
  • 右鍵點擊:標記/取消標記疑似雷區
  • 三級難度(初/中/高)+ 自訂雷數與棋盤大小
  • 頂部顯示:剩餘雷數、重新開始按鈕(含表情)、計時器
  • 通關記錄姓名計入排行榜(按時間排序)

技術實作細節

1. 專案建立

  • AppWizard 建立 SDI 應用程式 CBombApp
  • 移除列印/狀態列支援
  • 資源編輯器修改選單與加速鍵:開局、初級、中級、高級、自訂、顏色、英雄榜、退出、說明

2. 圖形資源

  • 13 種格子狀態 10×10 16色位圖
  • 3 種表情按鈕 20×20 位圖
  • 單色模式對應位圖
  • 0-9 數字位圖(黑底)

3. 對話框資源

  • CCustomer:自訂對話框(行數、列數、雷數)
  • CSort:排行榜顯示
  • CInput:通關輸入姓名

4. 核心類別設計

class Bomb {
public:
    int isbomb;      // 初始是否為雷
    bool issel;      // 是否已處理且周圍有雷
    bool isdone;     // 遞迴展開時是否已處理
    int num;         // 周圍雷數
    bool findbomb;   // 玩家標記為雷
};

5. 主框架視窗固定大小

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);
}

6. View 類別核心成員

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=失敗
};

7. 關鍵訊息處理

OnCreate:建立表情按鈕

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);

WM_TIMER:計時顯示

首次左鍵點擊啟動計時器,記錄開始時間;OnTimer 計算時間差並用數字位圖繪製;遊戲結束停止計時器。

WM_LBUTTONDOWN:左鍵邏輯

  • 點中雷→關閉計時器、切換按鈕為哭臉、m_iGameOver=2
  • 未中雷→按鈕切笑臉、呼叫 Calculate 計算周圍雷數、Invalidate 重繪(不重繪背景防閃爍)

WM_RBUTTONDOWN:右鍵標記

  • 切換 findbomb 標記、更新剩餘雷數
  • 全標記正確→彈出 CInput 輸入姓名、寫入登錄檔
  • 否則 Invalidate 重繪

OnDraw:複雜繪製邏輯

依格子狀態(未知、數字、雷、標記、錯誤標記等)繪製對應位圖,需精心處理邊界條件。

Calculate 遞迴展開

計算周圍雷數並遞迴展開無雷區域,注意邊界條件防止無限遞迴耗盡資源。

8. 選單命令處理

  • OnGameBegin:初始化、隨機佈雷(rand())、載入位圖、重繪
  • OnGameCustom:彈出自訂對話框、調整視窗大小、重建按鈕位置、重新開始
  • OnGameJunior/Middle/Senior:固定參數(如 20雷/8×8、40雷/13×13、99雷/20×25)
  • OnGameColor:切換彩色/單色模式、重載位圖
  • OnGameSort:從登錄檔讀取排行榜顯示

總結

數百行程式碼完成功能完整的掃雷遊戲,可自訂圖形風格,體驗 MFC SDI 架構下的遊戲開發全流程。

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