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

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

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

1、控制鼠标移动

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

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

2、获取屏幕像素RGB

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

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

HDC hDC = ::GetDC(NULL);//获取屏幕
COLORREF cl = GetPixel(hDC,point.x,point.y);//得到屏幕(x,y)坐标像素 //获取RGB
rr = 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,,,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 ;
}

如此下来,就完成了。

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

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

视频密码:mfcttaxctest

MFC+Android模拟器 实现 自动玩“天天爱消除”的更多相关文章

  1. 天天模拟器极速畅玩靠谱游戏《仙境传说RO:复兴》

    在电脑上用模拟器打开手游<仙境传说RO:复兴>,今天小编就来写一写天天模拟器的试玩教学. 首先先打开天天模拟器极速版. 在界面中找到鱼图标的靠谱游戏应用中心. 在应用中心中找到<仙境 ...

  2. Android 天天爱消除辅助

    简介 <天天爱消除>是一款移植于手游的消除类益智游戏,该游戏只有通过手机登录QQ跟微信才能进行,这样一来这款游戏必然会大红大紫. 功能 开发Android自动化触屏事件,录制操作脚本,实现 ...

  3. 自动批改android模拟器的imei的小程序 和 下载各个版本SDK Tools及ADT

    ADT 22.6.0版本的下载路径是:http://dl.google.com/android/ADT-22.6.0.zip ADT22.6.1版本的下载路径是:http://dl.google.co ...

  4. 微软发布独立Android模拟器 为开发者提供测试

    微软发布了 Visual Studio 2015 正式版,除了免费的社交版之外,另外也有付费的专业版.这套工具除了提供 Windows 应用程序的整合环境之外,你也可以利用它来开发 Android 程 ...

  5. 【转】使用命令行方式创建和启动android模拟器

    原文网址:http://blog.csdn.net/tiandinilv/article/details/8953001 1.Android模拟器介绍 Android中提供了一个模拟器来模拟ARM核的 ...

  6. 【Android】Android模拟器的安装

    目录结构: contents structure [+] 使用VMware安装Android模拟器 安装安卓(Android)系统前VMware虚拟机的配置 安装安卓(Android)系统 安装安卓( ...

  7. Android模拟器基本使用和常用工具介绍

    注:其中部分内容参考网上资源 1.Android模拟器介绍 Android中提供了一个模拟器来模拟ARM核的移动设备.Android的模拟器是基于QEMU开发的,QEMU是一个有名的开源虚拟机项目(详 ...

  8. 第三方Android 模拟器流畅速度快,适合开发人员

    “工欲善其事,必先利其器.” 使用Android模拟器开发和调试应用肯定比使用真机方便.但相比XCODE的IOS模拟器,Android SDK自带的AVD实在不争气,不过一些第三方的模拟器却表现不俗! ...

  9. Andy - 又一款速度流畅的免费安卓 Android 模拟器 (支持手机无线控制电脑模拟器)

    随着 Genymotion.BlueStacks 等电脑上的 Android 模拟器流行起来之后,似乎很多人都发现在电脑上运行使用安卓APP软件.畅玩手机游戏确实很有乐趣. 今天我们又发现了一款全新免 ...

随机推荐

  1. [Effective JavaScript 笔记] 第1章:让自己习惯javascript小结

    在这里整理一下,每条对应的提示 第1条:了解使用的js版本 确定应用程序支持的js的版本(浏览器也是应用程序噢) 确保使用的js特性是应用程序支持的(要不写了也运行不了) 总是在严格模式下编写和测试代 ...

  2. 采用Unity快速开发高质量游戏的若干优化建议

    http://files.cnblogs.com/123ing/%E9%87%87%E7%94%A8Unity%E5%BF%AB%E9%80%9F%E5%BC%80%E5%8F%91%E9%AB%98 ...

  3. ZeroMQ之Publish/Subscribe (Java)

    前面的文章介绍了比较简单的Request/Subscribe模式, 这篇文章介绍更为经典的Publish/Subscribe通信模式用来ZeroMQ的实现,其通信方式如下图: 客户端(subscrib ...

  4. linux 使用 ionice 限制 Xen 虚拟机磁盘 IO

    作为 VPS 服务商我们需要保证每个 VPS 公平的使用 host(服务器)的资源,避免某个 VPS 因为程序死循环.挂起.滥用等因素 “拖累” 其他 VPS,如果出现这个情况如何临时限制这个 VPS ...

  5. Linux tar命令exclude选项排除指定文件或目录

    在linux中可以用tar打包目录以方便传输or备份,我们先来看一个例子 test 文件夹有如下文件 [root@lee ~]# ll test 总用量 -rw-r--r--. root root 4 ...

  6. 九度 OJ1008 hdu 3790

    #include<stdio.h> #include<string.h> struct node { int d; int p; }g[][]; #define inf 0x3 ...

  7. macosx zsh下安装rvm和ruby

    1)curl -L get.rvm.io | bash -s stable 2)把下面一行加到~/.zshrc中: [[ -s "$HOME/.rvm/scripts/rvm" ] ...

  8. js init : function ()

    这个init外面应该还有一层,比如 var a = { init: function () {...}, exit: function () {...} } 这样的话,可以用a.init()来调用这个 ...

  9. Android studio 程序升级和sdk manager 升级方法

    在中国使用android有点郁闷,经常被屏蔽.常遇到2个升级问题,现在总结如下:  1.android studio升级时提示 Connection failed. Please check your ...

  10. php中GD库的简单使用

    在php中需要图像处理的地方GD库会发挥重要的作用,php可以创建并处理包括GIF,PNG,JPEG,WBMP以及XPM在内的多种图像格式,简单的举几个例子: 1.用GD库会创建一块空白图片,然后绘制 ...