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

C# 掃雷遊戲完整實作:從核心邏輯到 GDI+ 高效渲染

     編輯:關於C語言

專案概述

作者花費一年多 C# 學習時間打造的掃雷遊戲,著重於核心演算法 (FloodFill)、GDI+ 雙緩衝渲染優化、狀態機設計與滑鼠事件處理技巧。

核心技術亮點

1. FloodFill 演算法實作

點擊空白格時遞迴/疊代展開周圍安全區域,需注意堆疊溢位與重複訪問檢查:

void FloodFill(int x, int y) {
    if (x < 0 || x >= Width || y < 0 || y >= Height) return;
    if (cells[x, y].State != CellState.Initial) return;
    
    cells[x, y].Unseal();
    if (cells[x, y].AdjacentMines == 0) {
        for (int dx = -1; dx <= 1; dx++)
            for (int dy = -1; dy <= 1; dy++)
                if (dx != 0 || dy != 0) FloodFill(x + dx, y + dy);
    }
}

2. MineControl 狀態機設計

每個格子獨立管理狀態,Form 僅負責分派事件:

  • 狀態:Initial, Pressed, Flag, QuestionMark, Unsealed
  • 操作:Press(), UnPress(), PutFlag(), Unseal()
  • 優勢:邏輯與 UI 解耦,Form 程式碼極度簡潔。

3. GDI+ 高效渲染策略

  • 重寫 OnPaint 直接繪製 Icon,避免 PictureBox 載入圖片的閃爍與效能損耗。
  • 使用 DoubleBuffered = true 雙緩衝消除閃爍。
  • 資源檔嵌入組件 (.resx) 避免外部檔案相依。

4. 滑鼠雙鍵同步處理技巧

C# 無直接提供「左右鍵同時按下」事件,需自行追蹤狀態:

private MouseButtons _mouseState = MouseButtons.None;

void OnMouseDown(object sender, MouseEventArgs e) {
    _mouseState |= e.Button;
    if ((_mouseState & MouseButtons.Left) != 0 && (_mouseState & MouseButtons.Right) != 0) {
        // 雙鍵同時按下邏輯:標記周圍旗幟或快速展開
    }
}

void OnMouseUp(object sender, MouseEventArgs e) {
    _mouseState &= ~e.Button;
}

專案截圖

掃雷遊戲截圖

參考資源與原始碼

架構對比心得

作者認為自己的結構比參考專案更清晰,關鍵在於「控制項只負責顯示,邏輯全在 Form」的職責分離。這正是 MVC/MVVM 思想在 WinForms 中的輕量級體現。

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