博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MFC+Android模拟器 实现 自动玩“天天爱消除”
阅读量:5960 次
发布时间:2019-06-19

本文共 2105 字,大约阅读时间需要 7 分钟。

朋友用QT做了个自动玩的,觉得有意思,自己也想用MFC做个试试。

模拟器用的BlueStacks。Android SDK带的那个模拟器不知道是不是设置的问题,开游戏很卡。

用MFC建了对话框工程,配置极简化。

1、控制鼠标移动

SetCursorPos(x1, y1);//设置鼠标位置mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);//左键按下SetCursorPos(x2, y2);//设置鼠标位置mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);//左键弹起

这样就完成了鼠标从(x1,y1)拖拽至(x2,y2)的动作,

2、获取屏幕像素RGB

要能自动玩,肯定要分辨游戏界面中不同小动物。几个小动物颜色区分还是很明显的,直观方法就是获取小动物中心位置像素的RGB了。

MFC一个传统方式就是用GetPixel来做

HDC hDC = ::GetDC(NULL);//获取屏幕COLORREF cl = GetPixel(hDC,point.x,point.y);//得到屏幕(x,y)坐标像素//获取RGBrr = GetRValue(cl);gg = GetGValue(cl);bb = GetBValue(cl);CString tmp;tmp.Format(_T("%02X%02X%02X"), rr, gg, bb);MessageBox(tmp);::ReleaseDC(NULL,hDC);

但是做好之后问题就来了,自动玩的时候发现,无论Timer设多小,几乎都是一秒动一下,这样还不如自己手快点玩的分高。

分段输出运行时间后发现,一个GetPixel()要运行30ms。好!慢!啊!49个小动物的颜色获取下来就一秒多了。

于是网上找到有人说用GetDIBits。千辛万苦找到了零碎的实现方法。其实Bitmap文件结构还是熟悉的,取个像素不在话下,可是MFC的各种HDC、CDC、BITMAP、HBITMAP、CBitmap搞得人好晕啊,转来转去终于是把HDC搞到BITMAP里了,剩下就能弄了。

HDC hWinDC=::GetDC(NULL); HDC hMemDC=CreateCompatibleDC(hWinDC); HBITMAP hMemBmp = CreateCompatibleBitmap(hWinDC,sizeX,sizeY); HBITMAP hBmpOld = (HBITMAP)SelectObject(hMemDC,hMemBmp); BitBlt(hMemDC,0,0,sizeY,sizeX,hWinDC,m_startx,m_starty,SRCCOPY); SelectObject(hMemDC, hBmpOld); BITMAP bm;   ::GetObject(hMemBmp,sizeof(BITMAP),&bm);

有了BITMAP,就用bmp的文件结构去拿像素吧。。。

每次计算时间大约30ms。

 

3、算法

暴力枚举。。。没啥说的。

 

4、热键

自动开始之后如何停下来?定时自动停不太合适,因为游戏中有时间奖励。根据其他条件?好像略复杂。

自动进行的时候只要鼠标动作有触发,就没法通过键盘鼠标回到程序来终止,按键精灵之类的工具都会有热键,于是查MFC热键怎么搞。

//1、自己定义系统的WM_HOTKEY消息#define ID_DOIT   0X6000 //2、声明OnHotkey方法,在.h头文件的位置afx_msg LONG OnHotKey(WPARAM wPARAM, LPARAM lPARAM);DECLARE_MESSAGE_MAP()//3、添加BEGIN_MESSAGE_MAP中的声明BEGIN_MESSAGE_MAP(xxxxx, xxxxx)//...ON_MESSAGE(WM_HOTKEY,OnHotKey)//...END_MESSAGE_MAP()//4、注册热键,一般在OnInitDialog,这里设置ctrl+p::RegisterHotKey(this->GetSafeHwnd(),ID_DOIT,MOD_CONTROL,'P');//5、实现OnHotKey方法,处理具体热键事件:LONG xxx::OnHotKey(WPARAM wPARAM, LPARAM lPARAM){    DoSomething();    return 0;}

如此下来,就完成了。

动画消除的时候、有某个小动物闪动的时候程序会受到干扰,不过这个影响不大,点击的频率还是挺快的。Timer设置150~250,也就是每秒自动操作大约4~8次,无效操作无所谓。

顺便录了个视频。没管对话框界面求不吐槽。。。算法没优化,模拟器也稍有点卡,试了几盘也就一百多万分,还不算太变态。。。

视频密码:mfcttaxctest

转载于:https://www.cnblogs.com/CSGrandeur/p/3434070.html

你可能感兴趣的文章
mysql 链接数满了的错误 ERROR 1040 (HY000): Too many connections
查看>>
android textview字体加下划线
查看>>
springMVC 定时任务
查看>>
Mint8(ubuntu16.04) 搭建微信Web开发工具
查看>>
微信开发学习总结(二)——微信开发入门
查看>>
JDK8新特性
查看>>
windows平台pthread库应用
查看>>
AS3 基本数据类型 primitive data type
查看>>
百度地图定位分享
查看>>
PostgreSQL数据类型-数据类型简介和布尔类型
查看>>
PostgreSQL数据类型-二进制数据和字符串数据类型与字符串函数
查看>>
安装应用的时候拷贝一个DB文件到应用database下
查看>>
shell 基础
查看>>
twisted的LineReceiver的接口定义
查看>>
浅解用PHP实现MVC
查看>>
MySQL常用操作
查看>>
Yxcms网站管理系统安装
查看>>
Android学习笔记---Matrix矩阵
查看>>
算法导论自学1-2章
查看>>
圆满结束【一对一私人定制,我和马哥有个约会】
查看>>