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

VC 實現《連連看》外掛:像素特徵識別、路徑尋找與自動點擊全流程

     編輯:關於VC++

外掛核心邏輯

  1. 特徵提取:每個方塊取 5 點像素(中心、上下左右各 5 像素)RGB 值求和作為 ID,區分不同圖案。
  2. 背景濾除:預先掃描純背景區域建立背景 ID 白名單,識別時排除。
  3. 連通判斷:依《連連看》規則實現 0 轉彎(同行/同列直連)、1 轉彎、2 轉彎三種連線演算法。
  4. 自動操作:找到可消除配對後,發送 WM_LBUTTONDOWN/UP 或在螢幕繪製提示框。

關鍵代碼解析

1. 方塊特徵 ID 計算


int CLLK_CheatDlg::GetRectData(int col, int row) {
    CPoint pts[5];
    int cx = col * BLOCK_W + BLOCK_W/2;
    int cy = row * BLOCK_H + BLOCK_H/2;
    pts[0] = {cx, cy};           // 中心
    pts[1] = {cx, cy-5};         // 上
    pts[2] = {cx, cy+5};         // 下
    pts[3] = {cx-5, cy};         // 左
    pts[4] = {cx+5, cy};         // 右

    int sum = 0;
    for (int i=0; i<5; ++i)
        sum += GetPixel(m_MemDC, pts[i].x, pts[i].y); // RGB 合併值

    // 背景白名單比對
    for (int bg : m_BackgroundIDs)
        if (sum == bg) return BACKGROUND_FLAG;
    return sum;
}

注意:GetPixel 回傳 COLORREF (0x00BBGGRR),直接相加雖簡單但易碰撞。生產級建議改用 CRC32 或取 5 點各通道獨立統計構造 64 位特徵值。

2. 連通性判斷演算法


BOOL IsLink(int x1, int y1, int x2, int y2) {
    if (x1==x2 && X1_Link_X2(x1, y1, y2)) return TRUE;  // 同行直連
    if (y1==y2 && Y1_Link_Y2(x1, x2, y1)) return TRUE;  // 同列直連
    if (OneCornerLink(x1,y1,x2,y2)) return TRUE;        // 1 轉彎
    if (TwoCornerLink(x1,y1,x2,y2)) return TRUE;        // 2 轉彎
    return FALSE;
}

// 同行掃描範例
BOOL X1_Link_X2(int x, int y1, int y2) {
    int step = (y2>y1)?1:-1;
    for (int y=y1+step; y!=y2; y+=step)
        if (m_Board[x][y] != EMPTY) return FALSE;
    return TRUE;
}

完整演算法需處理「虛擬外框」邊界(將棋盤四周視為空白),使邊緣方塊也能透過外框連線。

3. 主掃描迴圈


void FindAndRemovePairs() {
    for (int y1=0; y1

4. 模擬點擊


void AutoClick(int col, int row) {
    POINT pt = BoardToScreen(col, row); // 方塊中心螢幕座標
    SendMessage(hGameWnd, WM_LBUTTONDOWN, MK_LBUTTON, MAKELONG(pt.x, pt.y));
    SendMessage(hGameWnd, WM_LBUTTONUP, 0, MAKELONG(pt.x, pt.y));
    // 或使用 mouse_event / SendInput 繞過訊息攔截
}

工程化細節與避坑

法律與道德警示

⚠️ **本文僅供技術研究與教學用途。** 針對線上遊戲開發/使用外掛違反多數遊戲用戶協議,可能導致帳號封禁、法律責任。請勿用於商業牟利或破壞遊戲公平性。建議將技術應用於:單機遊戲輔助測試、無障礙輔助工具、遊戲 AI 訓練環境等合法場景。

總結

《連連看》外掛展示了「螢幕像素特徵提取 → 邏輯演算法 → 模擬輸入」的經典遊戲自動化管線。核心難點在於**穩健的特徵識別**(抗背景干擾、光照變化)與**高效的路徑尋找**(剪枝、緩存)。現代方案傾向於 OpenCV 模板匹配/深度學習分類替代手工像素特徵,並配合 SendInput/驅動級輸入實現更隱蔽、穩定的自動化。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
問題解決方案
背景非純色、含圖案啟動時掃描全棋盤建立背景 ID 陣列(如文中硬編碼 64 個值),遊戲版本更新需重掃
GetPixel 速度極慢改用 BitBlt 將整個棋盤區域一次複製到記憶體 DC,再以 GetDIBits 取得像素陣列批次處理
遊戲視窗非最上層/被遮擋用 SetForegroundWindow + BringWindowToTop,或改用後台掛鉤 DirectDraw/D3D 繪製提示框
反外掛檢測(檢測 SendMessage)改用 SendInput 產生真實輸入流,或內核驅動級模擬
方塊尺寸/位置變動啟動時自動偵測棋盤左上角與方塊尺寸(邊緣檢測/模板匹配)