1.前言
初学python,看到微信跳一跳外挂觉得挺有意思,想做个比这个稍简单的来学习一下相关语法与模块
(此外挂只用于学习!并没有过多关于外挂的知识!)所做的游戏就是这个!开心斗游戏中的消砖块小游戏
通过点击屏幕来使该位置增加方块,从而达到消掉一层四个砖块,是一个简单的休闲小游戏。
2.所用工具/前期准备
(1).python3.X
请读者自行配置环境。
(2).adb
本攻略只适合安卓手机,请先下载adb驱动
下载地址:http://adbshell.com/downloads
(3).python中的openCV模块进行简单的图像识别
下载方法:命令行中输入pip install opencv-python进行下载
(4).python中的numpy,PIL和pylab模块进行简单运算和图像处理
pip install matplotlibpip install numpy
pip install pillow
3.adb安装注意事项
1.在cmd中输入adb,显示如下字样证明安装成功。
2.将手机调整到开发者模式(百度各种型号的打开方法),并开启USB调试功能
3.将手机与PC连接,手机中询问是否调试,一直点同意。PC中打开cmd 输入
adb devices
若看到如下显示,则证明已经连接上了!可以开启我们的编程之旅了!
4.adb的简易操作
//在屏幕上做划屏操作,前四个数为坐标点,后面是滑动的时间(单位毫秒)
adb shell input swipe 50 250 250 250 500
//在屏幕上点击坐标点x=50 y=250的位置。
adb shell input tap 50 250
//截图
adb shell /system/bin/screencap -p /sdcard/screenshot.png
//将截好的图保存到电脑之中
adb pull /sdcard/screenshot.png D:\screenshot
5.图像处理
(1).我们先要抓取屏幕并传输到电脑中,上面已经提过了,所以直接上函数
def screenshot():
os.system("adb shell screencap -p /sdcard/game.png")#cmd运行
os.system("adb pull /sdcard/game.png D:/PYthon/first_j/game.png")#存入电脑里面
截图后,我们得到如下图像
(2).我们发现上方的信息和下方的一些按键并不是我们想要的,我们可以轻松的把它们裁剪掉
crop_img = img[280:1780, 20:1080] # X=1060,Y=1500
效果图:
(3).当我们拿到这一张彩色的图片的时候,我们自然的知道应该向哪里发射方块,可是怎么才能让机器知道呢?这里我们应该把图像转化为灰度或二值图像,进行一系列的去噪等操作,使得计算机可以认出我们的图像并做判断
Q:什么是灰度图像?什么是二值图像?
http://www.jb51.net/article/78762.htm
这篇文章讲解的非常清晰,读者可以仔细阅读,了解一下数字图像的构成和灰度图像的原理
我们这里讲图片转化为二值图像,效果图如下
GrayImage = cv2.cvtColor(crop_img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(GrayImage, 127, 255, cv2.THRESH_BINARY_INV)
在上图中,我们看到方块有些不整齐,有一部分白色,我们要把这些白色填充掉,使得后面的程序更容易识别方块,此时需要一些形态学方面的操作。
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (25, 25))
closed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
上一下效果图
PS:左上角的东西我们无需担心~它只是在个别的时候会蹦出来,告诉我们我们的砖块行数+2了,然后会马上消失~并不 影响我们的识别~
到这里,我们对图像的处理已经很完善了。机器已经能很轻松的识别哪里是砖块(黑色——值为0),哪里是空白(白色——值为255),如果小伙伴们有时候处理一些复杂的图像,可以再用一下腐蚀与膨胀算法,效果也是非常好的。贴一下代码
# 分别执行4次形态学腐蚀与膨胀算法。
closed = cv2.erode(closed, None, iterations=4)
closed = cv2.dilate(closed, None, iterations=4)
6.模拟操作
相信大家的想法和我最初的想法非常像,这个是不是已经接近尾声了,我只需要检测 X= [100,375,650,925]
这四个点哪里是白色就模拟按键就好了?我就是用了这个简单的算法,发现模拟的结果非常不理想:(划重点)因为adb模拟按键和截图的速度并不快,所以会导致没有人的操作快!
那怎么办?只能优化算法咯
我们先检测哪里有方块,什么时候出方块,并把他的位置存到数组中
#先检测什么时候有块
for count in np.arange(1450,0,-50):
if int(closed[count,100])+int(closed[count,375])+int(closed[count,650])+int(closed[count,925])!=255*4:
break
for i in np.arange(count,0,-160):
Y.append(i)
记录后,一次性进行多次按键操作,实现一张图模拟多个按键,这样效率就高多啦
for i in Y:
if closed[i,100]!=0:
val.append(120)
elif closed[i,375]!=0:
val.append(395)
elif closed[i,650]!=0:
val.append(670)
elif closed[i,925]!=0:
val.append(945)
return val
7.结束