⽤Python写游戏脚本原来这么简单
前⾔
最近在玩⼉公主连结,之前也玩⼉过阴阳师这样的游戏,这样的游戏都会有个初始号这样的东西,或者说是可以肝的东西。
当然,作为⼀名程序员,肝这种东西完全可以⽤写代码的⽅式帮我们⾃动完成。游戏脚本其实并不⾼深,最简单的体验⽅法就是下载⼀个Airtest 了,直接截⼏个图⽚,写⼏层代码,就可以按照⾃⼰的逻辑玩⼉游戏了。
当然,本篇⽂章不是要讲Airtest这个怎么⽤,⽽是⽤原始的python+opencv来实现上⾯的操作。
这两天我写了⼀个公主连结刷初始号的程序,也不能算写游戏脚本的⽼⼿,这篇⽂章主要是分享⼀些基础的技术和使⽤上的⼼得吧。
准备⼯作
⾸先,我们要完成以下准备。
安卓设备⼀个:模拟器或者真机都可以。
安装ADB,并添加到系统的PATH⾥:adb是⽤来
安装tesseract-ocr,并添加到系统的PATH⾥:帮助我们实现简单的字符识别
安装python3.7以上的版本
这⾥adb和tesseract我放在百度⽹盘⾥了,⾥⾯顺便放了⼀个录制的效果视频。
链接:pan.baidu/s/1edTPu2o7… 提取码:33aw
python库安装
pipinstall pillow pytesseract opencv-python复制代码
除此以外,如果有需要可以安装uiautomator2,这篇⽂章就不涉及这块知识了。
使⽤adb获取安卓设备
这⾥我们主要是涉及到单个安卓设备的ADB连接操作,⾸先我们打开模拟器。
然后我们调⽤adb devices来获取当前的安卓设备,我这⾥是⼀个模拟器。
java中高级面试题大全
接下来可以调⽤adb shell测试⼀下是否能进⼊到安卓设备的shell环境下,确认可以输⼊exit退出即可。
如果有的时候进不了shell,可以先调⽤⼀下adb kill-server,然后再调⽤adb devices。
可能常⽤的ADB Shell命令
接下来是⼀些ADB的命令操作。通过adb命令,我们可以⽤python来操作的安卓设备。
屏幕截图
最常见的操作就是截图了,先调⽤screencap截图放到安卓设备⾥,然后再把截图下拉到电脑。
deftake_screenshot():os.system("adb shell screencap -
p /data/screenshot.png")      os.system("adb pull /data/screenshot.png ./tmp.png")
python入门教程网盘下拉⽂件
下拉⽂件就是刚刚那个adb pull了,以公主连结为例,以下代码可以导出账号信息的xml,以后通过xml就可以登录了。
os.system(f"adb pull /data/data/tw.sonet.princessconnect/shared_prefs/tw.sonet.princessconnect.l ./user
_l")
上传⽂件
有了下拉⾃然就有上传了,通过adb push即可完成。以公主连结为例,以下代码可以完成账号的切换。
# 切换账号
1os.system("adb push ./l /data/data/tw.sonet.princessconnect/shared_prefs/tw.sonet.princessconnect.v2.l")  # 切换账号
2os.system("adb push ./l /data/data/tw.sonet.princessconnect/shared_prefs/tw.sonet.princessconnect.v2.l")
点击屏幕某个位置
defadb_click(center, offset=(0,0)):(x, y) = center      x += offset[0]      y += offset[1]      os.system(f"adb shell input tap {x} {y}")
输⼊⽂字
text ="YourPassword"os.system(f"adb shell input text {text}")
删除字符
有的时候输⼊框会有输⼊的缓存,我们需要删除字符。
# 删除10个字符foriinrange(10):os.system("adb shell input keyevent 67")
linux最稳定的版本查询当前运⾏的包名和Activity
通过以下代码,可以查询当前运⾏的程序的Activity,也可以顺便查包名。
adbshell dumpsys activity activities
停⽌某个应⽤
有时候会需要停⽌某个应⽤,需要提供应⽤的包名。
adbshellamforce-stoptw.sonet.princessconnect
开启某个应⽤
开启某个应⽤需要提供包名以及Activity。
adbshellamstart -W -n tw.sonet.ames.activity.OverrideUnityActivity
图像操作
对于图像的操作第⼀就是图像查了,⽐如说像Airtest提供的这种,⽆⾮就是判断某个图像在不在截屏中,在的话在什么位置。
除此之外还需要⼀些抠图,⽐如说我们想获取账号的id,账号的等级,需要截取出⼀部分图⽚然后进⾏OCR操作。
c datagridview图像查
图像查其实就是先拿到两张图⽚,然后调⽤cv2.matchTemplate⽅法来查是否存在以及位置,这⾥匹配是⼀个相对模糊的匹配,会有⼀个相似度的概率,最⾼是1。我们设定⼀个阈值来判断模板是否在截屏⾥即可。
这⾥截屏如下,⽂件名为tmp.png:
模板如下:
代码如下:
importcv2defimage_to_position(screen, template):image_x, image_y = template.shape[:2]      result = cv2.matchTemplate(screen, template, cv2.TM_CCOEFF_NORMED)      min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)      print("prob:", max_val)i fmax_val >0.98:globalcenter          center = (max_loc[0] + image_y /2, max_loc[1] + image_x /2)returncenterelse:returnFalseif__n ame__ =="__main__":      screen = cv2.imread('tmp.png')      template =  cv2.imread('Xuandan.png')      print(image_to_position(s creen, template))
运⾏上述代码后,可以看到模板匹配出来的概率为0.9977,位置为(1165, 693),对于⼀张图⽚,左上⾓为原点,因为我的分辨率是1280 * 720,那么右下⾓的坐标就是(1280, 720)。可以看到我们这个选单其实就是刚好在右下⾓的位置。
傅里叶变换公式的推导如何快速裁剪模板?(win10)
游戏脚本其实并不是代码很难写,⽽是需要截很多的图,这些图要保证分辨率和原始⼀样。我发现在win10如果⽤画图打开图⽚
可以保证使⽤QQ截屏出来的分辨率,和图⽚本⾝的分辨率⼀样。
这个时候直接⽤qq截屏出来的模板即可直接⽤于识别。
图像裁剪2021年数据库系统工程师

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。