2个晚上的时间,累计大约有6个多小时吧,用 python 实现了一个 qq炫舞 的机器人。
qq炫舞这个游戏就是很多年前比较流行的,出现 一排上下左右,在规定时间内正确输入,然后再在关键点狠拍空格键的那种游戏。
媳妇最近去了这个公司上班,工作需要,去接触了这款游戏。我也在旁边观摩了一阵,自己怎么也玩不好,然后就想到是不是可以自己动手做一个自动玩这个游戏的机器人。
主要参考了这几篇文章,
1,用Python实现QQ找茬游戏外挂工具
http://cpiz.net/blog/2012/03/a_qq_zhaocha_assistant_by_python/
2.用Python制作游戏外挂
http://eyehere.net/2012/python-game-bot-autopy-1/
里面把关键技术都说的差不多了,我在这里只大概总结一下自己的心得。(时间太晚。。困死了,明天还要上班)
实现思路是
一个死循环不停在游戏中截图,
检测到该按方向键的时候, 检测所有方向键,并给游戏发送 方向键 键盘事件
检测到该按空格键的时候, 按下空格键
所有的检测都是基于 像素颜色来检测的
1. 了解到 python 有 autopy 这个库, 可以模拟一些窗口消息。
但是我在这个例子里没有用到,而是用的 win32api 这个库。
win32api 这个库,可以像 windows sdk 一样,调用 windows sdk 的函数,非常方便,也更接近 windows 底层
2. 用到了 PIL 库 , 尤其是 PIL 库 截图的部分.
3. 图像检测,是哪个方向键(上下左右?),以及是不是该按方向键,还是该按空格键,都是基于像素颜色的检验。
上面参考的文章里面,给出了 匹配相似图的算法,但是我发现在我这里 貌似不能用。
他们的做法我大概看了一下,印象是取图片 所有像素 数值的和,与 目标图片的 像素和 做比对。
但是我这里 上下左右4个按钮 ,像素和应该基本一样,所以这种方法不能用,采取了最笨拙的 ,比对关键点颜色是否为蓝色 来判定的。
4.了解了一下 python的多线程,虽然最后没有用上。但是做了一下科普.
5. windows sdk 的 keybd_event 第二个参数是 硬件扫描码。
如果传0 的话,在模拟 键盘消息时候,会出现 在游戏中模拟 无效的情况,必须用 MapVirtualKey() 填写正确的 值,
游戏才认为输入有效。
6. 大量使用了 windows 的画图工具量坐标。。
7. 本来想用 python 面向对象一下, 想封装一下。。可是太晚了,今天把功能实现了很高兴了,来不及封装。代码就先这样吧。
8. 由于本轮开始的判定,写的不那么精确,导致偶尔出现 本轮开始判定不准确,不会输入方向键的情况。但是只要多花点时间,是能够改好的。
9. 用自己的 "挂" 和其他 “选手“ p