Maison >développement back-end >Tutoriel Python >Écrire des scripts de jeu en Python s'avère si simple

Écrire des scripts de jeu en Python s'avère si simple

WBOY
WBOYavant
2023-04-13 10:04:023813parcourir

Avant-propos

J'ai joué à Princess Connect récemment. J'ai également joué à des jeux comme Onmyoji auparavant. De tels jeux auront quelque chose comme un numéro initial, ou quelque chose qui peut être joué.

Bien sûr, en tant que programmeur, des choses comme le foie peuvent être complétées automatiquement pour nous en écrivant du code. Le script du jeu n'est en fait pas avancé. Le moyen le plus simple d'en faire l'expérience est de télécharger un Airtest, de prendre simplement quelques photos, d'écrire quelques couches de code, puis de jouer au jeu selon votre propre logique.

Écrire des scripts de jeu en Python s'avère si simple

Bien sûr, cet article ne explique pas comment utiliser Airtest, mais utilise python+opencv d'origine pour implémenter les opérations ci-dessus.

Au cours des deux derniers jours, j'ai écrit un programme pour Princess Link pour obtenir le compte initial. Je ne peux pas être considéré comme un vétéran dans l'écriture de scripts de jeu. Cet article vise principalement à partager quelques technologies de base et son utilisation.

Préparation

Tout d'abord, nous devons terminer les préparations suivantes.

Un appareil Android : un émulateur ou un appareil réel est acceptable.

Installez ADB et ajoutez-le au PATH du système : adb est utilisé pour

installez tesseract-ocr et ajoutez-le au PATH du système : aidez-nous à réaliser une reconnaissance simple des caractères

Installez les versions de python3.7 ou supérieure

Ici, j'ai mis adb et tesseract sur le disque réseau Baidu, et il contient également une vidéo d'effet enregistrée.

Lien : pan.baidu.com/s/1edTPu2o7… Code d'extraction : 33aw

installation de la bibliothèque Python

pipinstall oreiller pytesseract opencv-python copier le code

De plus, vous pouvez installer uiautomator2 si nécessaire, ce l’article n’implique pas cette connaissance.

Utilisez adb pour obtenir un appareil Android

Ici, nous impliquons principalement l'opération de connexion ADB d'un seul appareil Android. Tout d'abord, nous ouvrons l'émulateur.

Ensuite, nous appelons les appareils adb pour obtenir l'appareil Android actuel, voici un émulateur.

Écrire des scripts de jeu en Python s'avère si simple

Ensuite, vous pouvez appeler adb shell pour tester si vous pouvez entrer dans l'environnement shell de l'appareil Android et confirmer que vous pouvez entrer exit pour quitter.

Écrire des scripts de jeu en Python s'avère si simple

Si parfois vous ne pouvez pas entrer dans le shell, vous pouvez d'abord appeler adb kill-server, puis appeler les appareils adb.

Commandes ADB Shell éventuellement couramment utilisées

Voici quelques opérations de commande ADB. Grâce à la commande adb, nous pouvons utiliser Python pour faire fonctionner des appareils Android.

Capture d'écran

L'opération la plus courante consiste à prendre une capture d'écran. Appelez d'abord screencap pour prendre la capture d'écran et placez-la sur l'appareil Android, puis transférez la capture d'écran sur l'ordinateur.

def take_screenshot():
os.system("adb shell screencap -p /data/screenshot.png")
os.system("adb pull /data/screenshot.png ./tmp.png")

Le fichier déroulant

Le fichier déroulant est le pull adb de tout à l'heure. En prenant Princess Link comme exemple, le code suivant peut exporter le XML des informations du compte et vous pouvez vous connecter. via XML à l'avenir.

os.system(f"adb pull /data/data/tw.sonet.princessconnect/shared_prefs/tw.sonet.princessconnect.v2.playerprefs.xml ./user_info.xml")

Télécharger des fichiers

Avec la liste déroulante, le téléchargement se produira naturellement et peut être complété via adb push. En prenant Princess Link comme exemple, le code suivant peut effectuer un changement de compte.

# 切换账号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")

Cliquez quelque part sur l'écran

def adb_click(center, offset=(0, 0)):
(x, y) = center
x += offset[0]
y += offset[1]
os.system(f"adb shell input tap {x} {y}")

Entrez du texte


text = "YourPassword"
os.system(f"adb shell input text {text}")

Supprimer des caractères

Parfois, le la zone de saisie aura un cache de saisie, nous avons besoin de supprimer les caractères.

# 删除10个字符
for i in range(10):
os.system("adb shell input keyevent 67")

Interroger le nom et l'activité du package en cours d'exécution

Avec le code suivant, vous pouvez interroger l'activité du programme en cours d'exécution et vous pouvez également vérifier le nom du package.

<span>xxxxxxxxxx</span>
1
<span role="presentation" style="padding-right: 0.1px;">adb shell dumpsys activity activities</span>

Écrire des scripts de jeu en Python s'avère si simple

Arrêter une application

Parfois, vous devez arrêter une application et vous devez fournir le nom du package de l'application.

adb shell am force-stop tw.sonet.princessconnect

Ouverture d'une application

Pour ouvrir une application, vous devez fournir le nom du package et l'activité.


adb shell am start -W -n tw.sonet.princessconnect/jp.co.cygames.activity.OverrideUnityActivity

图像操作

对于图像的操作第一就是图像查找了,比如说像Airtest提供的这种,无非就是判断某个图像在不在截屏中,在的话在什么位置。

Écrire des scripts de jeu en Python s'avère si simple

除此之外还需要一些抠图,比如说我们想获取账号的id,账号的等级,需要截取出一部分图片然后进行OCR操作。

Écrire des scripts de jeu en Python s'avère si simple

图像查找

图像查找其实就是先拿到两张图片,然后调用cv2.matchTemplate方法来查找是否存在以及位置,这里匹配是一个相对模糊的匹配,会有一个相似度的概率,最高是1。我们设定一个阈值来判断模板是否在截屏里即可。

这里截屏如下,文件名为tmp.png:

Écrire des scripts de jeu en Python s'avère si simple

模板如下:

Écrire des scripts de jeu en Python s'avère si simple

代码如下:

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)。可以看到我们这个选单其实就是刚好在右下角的位置。

Écrire des scripts de jeu en Python s'avère si simple

如何快速裁剪模板?(win10)

游戏脚本其实并不是代码很难写,而是需要截很多的图,这些图要保证分辨率和原始一样。我发现在win10如果用画图打开图片

Écrire des scripts de jeu en Python s'avère si simple

可以保证使用QQ截屏出来的分辨率,和图片本身的分辨率一样。

Écrire des scripts de jeu en Python s'avère si simple

这个时候直接用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为例。

Écrire des scripts de jeu en Python s'avère si simple

运行代码后,得到截图如下:

Écrire des scripts de jeu en Python s'avère si simple

简单的OCR

得到了以上的图片信息后就是进行OCR了,也就是光学字符识别。这里代码非常简单,只要调用API即可。


from PIL import Image
import pytesseract
image = Image.open('test_id.png')
content = pytesseract.image_to_string(image) # 识别图片
print(content)

Écrire des scripts de jeu en Python s'avère si simple

不过需要注意的一点就是pytesseract识别出来的结果会有空格符,换行符这样的符号,真正要用的时候进行一些字符的过滤即可。

The End

这篇文章到这里就结束了,主要还是介绍一些ADB以及图像相关的基础操作。谢谢大家的观看。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer