MFC学习笔记整理:002_腾讯游戏连连看外挂制作(一)
生活随笔
收集整理的這篇文章主要介紹了
MFC学习笔记整理:002_腾讯游戏连连看外挂制作(一)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
今天心血來潮,準備寫個外掛練練手,當然也是從簡單的開始了,就選騰訊連連看下手。
游戲開局很輕松實現,那么現在很關鍵很重要的就是要找整個棋盤的基址,即找左上角第一個棋子的內存位置。
成功讀取到棋盤所有數據,接下來的流程就是檢查棋盤數據,為0的就跳過,數據相同的就移動光標進行模擬點擊,每消除一對棋子就重新刷新一次棋盤數據,刷新數據變量m_num 直到棋盤數據數組中所有元素為0,結束循環,游戲結束。
之前整合過2個外部的exe程序,接觸了找句柄、讀寫內存的操作,寫游戲外掛找基址是關鍵,當然離不開CE(不知道CE的直接退下)了。
啟動VC6,新建一個簡單的基于對話框的工程,捋一捋游戲流程,先寫上幾個功能函數的空函數,這樣的好處是寫代碼的邏輯跟著游戲流程走,不會亂。先看一下我們都需要什么吧,頭文件功能函數如下:
void autoPlay(); //進入游戲后,自動開始游戲void OnBtnChessdata(); //獲取棋盤數據void dotaReplay(); //被踢重進游戲BOOL checkDataChange(); //檢查棋盤是否發生改變,如果消除未發生改變,則需要使用重排道具void useProp(); //使用重排道具bool checkEnd(); //判斷當前棋盤是否全部消除int m_x; //第一個棋子x坐標int m_y; //第一個棋子y坐標int m_num; //記錄棋盤未消除棋子個數先把框架寫好,一個個的去實現。
首先是開始游戲,獲取游戲窗口句柄 -> 移動光標點擊開始按鈕
開始游戲代碼如下,注意相對坐標和絕對坐標。
HWND gameH = ::FindWindow(NULL,gameCaption);if(!gameH){return ;}CPoint pOld; GetCursorPos(&pOld); //保存移動光標前的鼠標位置CRect rect;::GetWindowRect(gameH,&rect); //獲取窗口位置SetCursorPos(rect.left+m_x,rect.top+m_y); //將相對坐標 轉換成屏幕絕對坐標//移動光標,左鍵按下、左鍵抬起mouse_event(MOUSEEVENTF_LEFTDOWN,rect.left+m_x,rect.top+m_y,NULL,NULL);mouse_event(MOUSEEVENTF_LEFTUP,rect.left+m_x,rect.top+m_y,NULL,NULL);//還原光標SetCursorPos(pOld.x,pOld.y);游戲開局很輕松實現,那么現在很關鍵很重要的就是要找整個棋盤的基址,即找左上角第一個棋子的內存位置。
用CE工具不斷查找,最終獲取到棋盤基址是:0x00129F78? //基址每次游戲更新可能會變,這樣外掛輔助要要跟著更新了。
讀取棋盤數據功能函數如下:棋盤數據最好聲明為全局變量或者對話框類的數據成員
//讀取棋盤數據byte chessData[11][19]; /HWND gameH = ::FindWindow(NULL,gameCaption);if(!gameH){return ;}DWORD processID;//通過窗口句柄,獲取進程ID::GetWindowThreadProcessId(gameH,&processID);//通過進程ID,以所有權限打開進程HANDLE processH = ::OpenProcess(PROCESS_ALL_ACCESS,false,processID);LPDWORD realSize = 0;LPCVOID pbase = (LPCVOID)0x00129F78; //棋盤基址,即第一個棋子的內存地址LPVOID buffer = (LPVOID)&chessData;//從基址開始,讀取11*19個字節的數據::ReadProcessMemory(processH,pbase,buffer,11*19,realSize);///統計棋盤數據,棋盤大小為19*11for (int y=0;y<=10;y++) //行{for (int x=0;x<=18;x++) //列{if(chessData[y][x]!=0) //統計棋子數m_num++;}}成功讀取到棋盤所有數據,接下來的流程就是檢查棋盤數據,為0的就跳過,數據相同的就移動光標進行模擬點擊,每消除一對棋子就重新刷新一次棋盤數據,刷新數據變量m_num 直到棋盤數據數組中所有元素為0,結束循環,游戲結束。
代碼就不一段段的帖了,想要代碼或者程序的在下面鏈接下載。
http://download.csdn.net/detail/shortcoder/6566501
棋子消除判斷實現不理想,本程序思想是判斷2棋子相同,即去模擬點擊,并未判斷2個棋子間是否可消除。
程序中通過在循環中刷新數據,來避免死循環,能實現游戲的一鍵秒殺,但會有很短暫的卡屏。
判斷2棋子是否可消除算法,請期待下一節。
附:秒殺圖片:
總結
以上是生活随笔為你收集整理的MFC学习笔记整理:002_腾讯游戏连连看外挂制作(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Protel DXP使用教程 -建立工程
- 下一篇: stm32 IAP 程序编写心得