最近一个小游戏挺火的,羊了个羊,很多程序员都通过后台破解代码让道具无限,让关卡重复第一关等等来实现通关,但技术不够,代码来凑,想着游戏还有一定的几率可以通关,无非就是要多试几把,那要不写个程序让电脑无限的自动匹配点击。
第一想法是用按键精灵,但按键精灵写复杂代码实在麻烦,而且还不支持面向对象,所以想着能不能用程序来实现,所以就有了今天这篇文章,正好要自学Pyhton,那这个练手实现自动玩【羊了个羊】
自动匹配的思路放后面讲,今天主要是怎么用Python写一个类似按键精灵的自动识别和点击的部分,如果没有安装足够的类可能过程会提示错误,例如pyautogui ,openCV之类的
按键精灵的自动识别点击第一步是要先截取屏幕的图片用于对比,所以首先要能截取我们想要的图片,这里使用到了Python的pyautogui 类
// 关键代码
import pyautogui as py
ss=py.screenshot() #截取整个电脑屏幕
targt=ss.crop((leftX,leftTop,rightX,rightBottom)) #截取图片的区域,参数自己填
targt.save(str(img_name+".png")) #保存匹配图片
# 如果不知道要截图的具体区域,可以使用pyautogui 自带的工具, print(py.mouseInfo()) 调用位置和颜色获取工具
pyautogui 自带了一个匹配函数locateAllOnScreen,结果发现要100%完全匹配才能找出来,这样肯定准确率就很低,所以就打算引入confidence(类似参数),实现模糊匹配。这里想了个十分笨但感觉精确度挺高的办法,那就是把要匹配的图片全部裁剪成四份,在辅助高的模糊匹配值。
如confidence=0.95以上,虽然部分图片会识别不出来,但叠加多次匹配后,对去掉重复的点(如玉米区域内(0,0,60,60)都被四个拆分的玉米识别到,或只识别到一次,只要在这个区域内有大于1个坐标,就意味识别成功),这样的精确度就提高了,所以先来一段分割图片的代码,将要识别的图片截取成4个
// 关键代码
import cv2
img= cv2.imread(file_path, -1) #-1读入完整图片,0读入灰度图片,1读入彩色图片,忽略alpha通道(透明)
img_height, img_width = src.shape[0], src.shape[1] #shape = (图片的高度,图片的宽度,图片的通道)
sub_img=img[0:img_width /2, 0:img_height/2, :] #截取左上部分
cv2.imwrite(file_name + '.png', sub_img) #保存截取图片
然后用循环的方式,将所有图片拍成列表进行4等分,
// 关键代码
import os
for root, dirs, files in os.walk(".\\"):
……
将所有分割好的图片都加入Original_Img_Path_List,将模糊匹配参数设置为0.9,至此实现自动点击消除。
// 关键代码
for pos in py.locateAllOnScreen(Original_Img_Path_List[img_sqe],confidence=0.9):
#…… 获取所有坐标后去重得到一个显示在第一层的图片列表level1_Gird_List
#…… 此处省略判断三个为一组的代码
for ll in level1_Gird_List:
py.moveTo(ll.center_x,ll.center_y,duration=0.25)
time.sleep(0.1)
py.click()