Vorwort
Ich spiele kürzlich Princess Connect und habe schon früher Spiele wie Onmyoji gespielt, Spiele wie Dies wird immer so etwas wie eine Anfangsnummer oder etwas sein, das verwendet werden kann.
Natürlich können wir als Programmierer Dinge wie Leber automatisch für uns erledigen, indem wir Code schreiben. Das Spielskript ist eigentlich nicht fortgeschritten. Der einfachste Weg, es zu erleben, besteht darin, einen Airtest herunterzuladen, einfach ein paar Bilder zu machen, ein paar Codeebenen zu schreiben und dann das Spiel nach Ihrer eigenen Logik zu spielen.
Natürlich geht es in diesem Artikel nicht um die Verwendung von Airtest, sondern um die Verwendung von Original-Python + OpenCV zur Implementierung der oben genannten Vorgänge.
In den letzten zwei Tagen habe ich ein Programm für Princess Link geschrieben, um den ersten Account zu erhalten. Ich kann nicht als Veteran im Schreiben von Spielskripten angesehen werden Nutzungserfahrung.
Vorbereitung
Zunächst müssen wir die folgenden Vorbereitungen abschließen.
Ein Android-Gerät: Emulator oder echtes Gerät ist akzeptabel.
Installieren Sie ADB und fügen Sie es zum PATH des Systems hinzu: adb wird verwendet, um
Installieren Sie tesseract-ocr und fügen Sie es zum PATH des Systems hinzu: Helfen Sie uns, einfache Zeichen zu identifizieren #🎜 🎜#
Installieren Sie Python3.7 oder eine höhere VersionIch habe adb und tesseract auf der Baidu-Netzwerkfestplatte abgelegt, und darin befindet sich ein aufgezeichnetes Effektvideo. Link: pan.baidu.com/s/1edTPu2o7… Extraktionscode: 33awPython-Bibliotheksinstallation#🎜🎜 #pipinstall Pillow Pytesseract OpenCV-Python-Kopiercode
Darüber hinaus können Sie bei Bedarf uiautomator2 installieren. Dieses Wissen wird in diesem Artikel nicht behandelt.
Verwenden Sie adb, um ein Android-Gerät zu erhaltenHier geht es hauptsächlich um den ADB-Verbindungsvorgang eines einzelnen Android-Gerät: Zuerst öffnen wir den Simulator.
Dann rufen wir adb devices auf, um das aktuelle Android-Gerät zu erhalten.
Als Nächstes können Sie die ADB-Shell aufrufen, um zu testen, ob Sie die Shell-Umgebung des Android-Geräts aufrufen können, und bestätigen, dass Sie Exit zum Beenden eingeben können .
Wenn Sie die Shell manchmal nicht aufrufen können, können Sie zuerst adb kill-server und dann adb devices aufrufen.
Möglicherweise häufig verwendete ADB-Shell-BefehleIm Folgenden sind einige ADB-Befehlsoperationen aufgeführt. Über den Befehl adb können wir Python zum Betrieb von Android-Geräten verwenden.
ScreenshotDer häufigste Vorgang ist das Erstellen eines Screenshots und legen Sie es auf das Android-Gerät und laden Sie dann den Screenshot auf Ihren Computer.
def take_screenshot(): os.system("adb shell screencap -p /data/screenshot.png") os.system("adb pull /data/screenshot.png ./tmp.png")
Dropdown-DateiDie Dropdown-Datei ist gerade der ADB-Pull Princess Link als Beispiel: Der folgende Code kann die XML-Kontoinformationen exportieren, und Sie können sich später über XML anmelden.
os.system(f"adb pull /data/data/tw.sonet.princessconnect/shared_prefs/tw.sonet.princessconnect.v2.playerprefs.xml ./user_info.xml")
Datei hochladenMit dem Dropdown wird es natürlich hochgeladen, was sein kann abgeschlossen durch adb push . Am Beispiel von Princess Link kann der folgende Code den Kontowechsel abschließen.
# 切换账号1 os.system("adb push ./user_info1.xml /data/data/tw.sonet.princessconnect/shared_prefs/tw.sonet.princessconnect.v2.playerprefs.xml") # 切换账号2 os.system("adb push ./user_info2.xml /data/data/tw.sonet.princessconnect/shared_prefs/tw.sonet.princessconnect.v2.playerprefs.xml")
Klicken Sie irgendwo auf den Bildschirmdef adb_click(center, offset=(0, 0)):
(x, y) = center
x += offset[0]
y += offset[1]
os.system(f"adb shell input tap {x} {y}")
Text eingeben# 🎜🎜#
text = "YourPassword" os.system(f"adb shell input text {text}")
# 🎜 🎜# Manchmal verfügt das Eingabefeld über einen Eingabecache und wir müssen Zeichen löschen. # 删除10个字符
for i in range(10):
os.system("adb shell input keyevent 67")
Fragen Sie den Namen und die Aktivität des aktuell ausgeführten Pakets ab
Mit dem folgenden Code können Sie das abfragen Aktivität des aktuell ausgeführten Programms, Sie können auch den Paketnamen überprüfen.
<span>xxxxxxxxxx</span>
<span role="presentation" style="padding-right: 0.1px;">adb shell dumpsys activity activities</span>
Um eine Anwendung zu öffnen, müssen Sie den Paketnamen und die Aktivität angeben .
adb shell am start -W -n tw.sonet.princessconnect/jp.co.cygames.activity.OverrideUnityActivity
图像操作
对于图像的操作第一就是图像查找了,比如说像Airtest提供的这种,无非就是判断某个图像在不在截屏中,在的话在什么位置。
除此之外还需要一些抠图,比如说我们想获取账号的id,账号的等级,需要截取出一部分图片然后进行OCR操作。
图像查找
图像查找其实就是先拿到两张图片,然后调用cv2.matchTemplate方法来查找是否存在以及位置,这里匹配是一个相对模糊的匹配,会有一个相似度的概率,最高是1。我们设定一个阈值来判断模板是否在截屏里即可。
这里截屏如下,文件名为tmp.png:
模板如下:
代码如下:
import cv2 def image_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) if max_val > 0.98: global center center = (max_loc[0] + image_y / 2, max_loc[1] + image_x / 2) return center else: return False if __name__ == "__main__": screen = cv2.imread('tmp.png') template =cv2.imread('Xuandan.png') print(image_to_position(screen, template))
运行上述代码后,可以看到模板匹配出来的概率为0.9977,位置为(1165, 693),对于一张图片,左上角为原点,因为我的分辨率是1280 * 720,那么右下角的坐标就是(1280, 720)。可以看到我们这个选单其实就是刚好在右下角的位置。
如何快速裁剪模板?(win10)
游戏脚本其实并不是代码很难写,而是需要截很多的图,这些图要保证分辨率和原始一样。我发现在win10如果用画图打开图片
可以保证使用QQ截屏出来的分辨率,和图片本身的分辨率一样。
这个时候直接用qq截屏出来的模板即可直接用于识别。
图像裁剪
接下来就是有时候需要裁剪一些图像了,当然我们的模板图片也可以通过裁剪图片的方式得到,这样的模板图片是最准的。
裁剪其实就是需要裁剪的位置,以及需要的高度和宽度,说白了就是一篇长方形的区域,下面的代码使用PIL库实现。
from PIL import Image def crop_screenshot(img_file, pos_x, pos_y, width, height, out_file): img = Image.open(img_file) region = (pos_x, pos_y, pos_x + width, pos_y + height) cropImg = img.crop(region) cropImg.save(out_file) print("exported:", out_file) if __name__ == "__main__": crop_screenshot("tmp.png", 817,556, 190, 24, "test_id.png")
上面的代码以截取玩家的id为例。
运行代码后,得到截图如下:
简单的OCR
得到了以上的图片信息后就是进行OCR了,也就是光学字符识别。这里代码非常简单,只要调用API即可。
from PIL import Image import pytesseract image = Image.open('test_id.png') content = pytesseract.image_to_string(image) # 识别图片 print(content)
不过需要注意的一点就是pytesseract识别出来的结果会有空格符,换行符这样的符号,真正要用的时候进行一些字符的过滤即可。
The End
这篇文章到这里就结束了,主要还是介绍一些ADB以及图像相关的基础操作。谢谢大家的观看。
Das obige ist der detaillierte Inhalt vonDas Schreiben von Spielskripten in Python erweist sich als sehr einfach. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!