分享免费的编程资源和教程

网站首页 > 技术教程 正文

C语言游戏外挂(三):自动模拟操作功能

goqiw 2024-10-06 08:23:16 技术教程 25 ℃ 0 评论

通过 C 语言编写一个外挂,通过 API 函数模拟进行连连看操作,实现自动进行游戏

  • 对象分析

  • 要用的 API 函数简单介绍

  • 编写测试效果

  • 总体评价

对象分析

本次游戏对象为某连连看游戏

试玩发现需要进行棋子确定和模拟鼠标操作

通过 CE 确定棋盘基址获得游戏数据,再利用算法确定目标,执行鼠标操作

要用的 API 函数简单介绍

LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);

其中 Msg 为 WMLBUTTONDOWN,WMLBUTTONUP,表示对鼠标的软件模拟操作 (虽然兼容性和安全性不如硬件模拟的 mouse_event,但不改变移动鼠标指针)

故一般写作 SendMessage(hwnd, WMLBUTTONUP/WMLBUTTONUP, 0, Y 坐标 <<16+X);

编写测试效果

打开游戏

运行外挂 我用 MFC 将几个函数功能封装为按钮

  1. 单消:读取数据并消一对

  2. 自动:恢复 / 暂停一个线程,这个线程有消一对和延时的循环功能

  3. 秒杀:不延时,直接消 999 对

检测有效

  1. //

  2. // 03自动模拟操作功能(部分).cpp

  3. // C/C++

  4. //

  5. #include<windows.h>

  6. #include<iostream>

  7. usingnamespace std;

  8. HWND gameh;

  9. DWORD processid =0;

  10. HANDLE processh =0;

  11. byte chessdata[11][19];//数据保存缓冲区,假设棋盘为11*19

  12. constchar*gamename ="连连看";//某连连看游戏名称,可通过SPY++查找

  13. struct point {//具体使用和算法见"连连看BFS算法"

  14. int x, y, direct;

  15. int step, hp;

  16. };

  17. void readchess(){//读数据并更新

  18. gameh =::FindWindow(NULL, gamename);

  19. ::GetWindowThreadProcessId(gameh,&processid);

  20. processh =::OpenProcess(PROCESS_ALL_ACCESS,false, processid);

  21. LPCVOID pbase =(LPCVOID)棋盘基址;

  22. LPVOID nbuffer =(LPVOID)&chessdata;

  23. ::ReadProcessMemory(processh, pbase, nbuffer,11*19,&byread);

  24. }

  25. void click2p(POINT p1, POINT p2){//点击两个点的操作功能

  26. HWND hwnd=FindWindow(NULL, gamename);

  27. int lparam;

  28. lparam=((p1.y*35+192)<<16)+(p1.x*31+21);

  29. SendMessage(hwnd, WM_LBUTTONDOWN,0, lparam);

  30. SendMessage(hwnd, WM_LBUTTONUP,0, lparam);

  31. lparam=((p2.y*35+192)<<16)+(p2.x*31+21);

  32. SendMessage(hwnd, WM_LBUTTONDOWN,0, lparam);

  33. SendMessage(hwnd, WM_LBUTTONUP,0, lparam);

  34. }

  35. void clearapair(){//找到可消去的两个点并点击

  36. POINT p1, p2;

  37. int x1, y1, x2, y2;

  38. for(y1=0; y1<11; y1++)

  39. for(x1=0; x1<19; x1++){

  40. if(!chessdata[y1][x1])

  41. continue;

  42. for(y2=0; y2<11; y2++)

  43. for(x2=0; x2<19; x2++)

  44. if(chessdata[y2][x2]&&(chessdata[y1][x1]==chessdata[y2][x2])&&(x1!=x2 || y1!=y2)){

  45. p1.x=x1; p1.y=y1;

  46. p2.x=x2; p2.y=y2;

  47. readchess();

  48. if(llk_bfs(y1, x1, y2, x2)!=-1){

  49. click2p(p1, p2);

  50. return;

  51. }

  52. }

  53. }

  54. }

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表