首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++/CLI WinForms PictureBox 連連看遊戲邏輯:資料結構驅動而非控制項指標

     編輯:程式設計綜合問答

開發連連看遊戲時,不應直接操作 PictureBox 控制項指標來判斷連通與消除,而應建立邏輯資料結構(二維陣列/圖模型)對應棋盤狀態,UI 僅負責渲染。

核心架構

// 邏輯層
class LinkGame {
    int rows, cols;
    int[,] board; // 0=空, >0=圖片ID
    PictureBox[,] uiBoxes; // 對應 UI 控制項,僅供渲染用
    
    public LinkGame(int r, int c, PictureBox[,] boxes) {
        rows = r; cols = c; uiBoxes = boxes;
        board = new int[rows, cols];
        InitBoard();
    }
    
    void InitBoard() {
        // 隨機配對填充 board,確保可解
        // ...
        Render();
    }
    
    bool CanLink(Point p1, Point p2) {
        // 判斷兩格是否可用 ≤3 段直線連通(經典規則)
        // 可用 BFS/DFS 尋路,或針對直線/一折/兩折專門判斷
        return true; // 簡化
    }
    
    void OnBoxClick(Point p) {
        if (firstClick == null) { firstClick = p; Highlight(p); }
        else {
            if (CanLink(firstClick.Value, p)) {
                ClearBoxes(firstClick.Value, p);
                board[firstClick.Value.X, firstClick.Value.Y] = 0;
                board[p.X, p.Y] = 0;
                Render();
                CheckWin();
            }
            firstClick = null; ClearHighlight();
        }
    }
    
    void ClearBoxes(Point a, Point b) {
        // 僅操作 UI 控制項隱藏/清空圖片
        uiBoxes[a.X, a.Y].Visible = false; // 或 Image = null
        uiBoxes[b.X, b.Y].Visible = false;
    }
    
    void Render() {
        for (int i=0;i 0) uiBoxes[i,j].Image = images[board[i,j]];
            else uiBoxes[i,j].Image = null;
        }
    }
}

為何不用 PictureBox 指標

  • 控制項屬於 UI 執行緒,跨執行緒操作需 Invoke,易死結。
  • 邏輯判斷(連通性、消除規則)與 UI 無關,分離後易測試、易移植(如改 WPF/Unity)。
  • 動畫效果(消除漸變、連線動畫)需在 UI 層協調,邏輯層只發事件通知。

進階優化

  • 單一 PictureBox 繪製整個棋盤(OnPaint 畫格子),效能遠優於成百上千個控制項。
  • 使用 Bitmap 雙緩衝繪製,實現流暢動畫。
  • 參考開源實現:GitHub 搜尋 "LinkGame C# WinForms" 可找到完整專案。

「資料驅動 UI」是圖形遊戲開發的核心原則,連連看正是絕佳練習案例。

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