Rumah >pembangunan bahagian belakang >Tutorial Python >Menulis skrip permainan dalam Python ternyata begitu mudah

Menulis skrip permainan dalam Python ternyata begitu mudah

WBOY
WBOYke hadapan
2023-04-13 10:04:023841semak imbas

Kata Pengantar

Saya telah bermain Princess Connect baru-baru ini Saya juga pernah bermain permainan seperti Onmyoji sebelum ini. atau sesuatu yang boleh dimakan.

Sudah tentu, sebagai pengaturcara, perkara seperti hati boleh diselesaikan secara automatik untuk kita dengan menulis kod. Skrip permainan sebenarnya tidak maju Cara paling mudah untuk mengalaminya ialah memuat turun Airtest, hanya mengambil beberapa gambar, menulis beberapa lapisan kod, dan kemudian anda boleh bermain permainan mengikut logik anda sendiri.

Menulis skrip permainan dalam Python ternyata begitu mudah

Sudah tentu, artikel ini bukan tentang cara menggunakan Airtest, tetapi menggunakan python+opencv asli untuk melaksanakan operasi di atas.

Dalam dua hari yang lalu, saya menulis program untuk Princess Link untuk mendapatkan akaun awal. Saya tidak boleh dianggap sebagai veteran dalam menulis skrip permainan .

Persediaan

Pertama sekali, kita perlu menyiapkan persediaan berikut.

Peranti Android: sama ada emulator atau peranti sebenar.

Pasang ADB dan tambahkannya pada PATH sistem: adb digunakan untuk

Pasang tesseract-ocr dan tambahkannya pada PATH sistem: Bantu kami mencapai pengecaman aksara mudah

Pasang versi python3.7 ke atas

Saya telah meletakkan adb dan tesseract dalam cakera rangkaian Baidu, dan terdapat juga video kesan yang dirakam di dalamnya.

Pautan: pan.baidu.com/s/1edTPu2o7… Kod pengekstrakan: 33aw

pemasangan perpustakaan python

pipinstall pillow pytesseract opencv-python copy code

Selain itu, anda boleh memasang uiautomator2 jika perlu, artikel ini tidak akan merangkumi pengetahuan ini.

Gunakan adb untuk mendapatkan peranti Android

Di sini kami terutamanya melibatkan operasi sambungan ADB bagi satu peranti Android Pertama, kami membukanya emulator.

Kemudian kami memanggil peranti adb untuk mendapatkan peranti Android semasa, yang merupakan emulator di sini.

Menulis skrip permainan dalam Python ternyata begitu mudah

Seterusnya, anda boleh memanggil adb shell untuk menguji sama ada anda boleh memasuki persekitaran shell peranti Android dan mengesahkan bahawa anda boleh memasuki exit to exit.

Menulis skrip permainan dalam Python ternyata begitu mudah

Jika kadangkala anda tidak boleh memasuki shell, anda boleh memanggil adb kill-server dahulu, dan kemudian memanggil peranti adb.

Arahan ADB Shell yang mungkin biasa digunakan

Berikut ialah beberapa operasi arahan ADB. Melalui arahan adb, kita boleh menggunakan python untuk mengendalikan peranti Android.

Tangkapan skrin

Operasi yang paling biasa ialah mengambil tangkapan skrin panggilan pertama dan meletakkan tangkapan skrin ke dalam peranti Android, kemudian tarik tangkapan skrin turun ke komputer.

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

Fail lungsur turun

Fail lungsur turun ialah tarik adb sebentar tadi. kod berikut boleh mengeksport maklumat akaun xml, anda boleh log masuk melalui xml pada masa hadapan.

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

Muat naik fail

Dengan drop-down, muat naik boleh dilakukan secara semula jadi, yang boleh dilakukan melalui adb push. Mengambil Princess Link sebagai contoh, kod berikut boleh melengkapkan penukaran akaun.

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

Klik di suatu tempat pada skrin

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}")

Masukkan teks


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

Padam aksara

Kadangkala kotak input akan mempunyai cache input, kita memerlukan Padam aksara .

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

Soal nama pakej dan Aktiviti yang sedang dijalankan

Dengan kod berikut, anda boleh menanyakan Aktiviti program yang sedang dijalankan , atau dengan cara Semak nama pakej.

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

Menulis skrip permainan dalam Python ternyata begitu mudah

Hentikan aplikasi

Kadangkala anda perlu menghentikan aplikasi dan anda perlu memberikan nama pakej aplikasi tersebut.

adb shell am force-stop tw.sonet.princessconnect

Untuk membuka aplikasi

Untuk membuka aplikasi, anda perlu memberikan nama pakej dan Aktiviti.


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

图像操作

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

Menulis skrip permainan dalam Python ternyata begitu mudah

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

Menulis skrip permainan dalam Python ternyata begitu mudah

图像查找

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

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

Menulis skrip permainan dalam Python ternyata begitu mudah

模板如下:

Menulis skrip permainan dalam Python ternyata begitu mudah

代码如下:

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

Menulis skrip permainan dalam Python ternyata begitu mudah

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

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

Menulis skrip permainan dalam Python ternyata begitu mudah

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

Menulis skrip permainan dalam Python ternyata begitu mudah

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

Menulis skrip permainan dalam Python ternyata begitu mudah

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

Menulis skrip permainan dalam Python ternyata begitu mudah

简单的OCR

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


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

Menulis skrip permainan dalam Python ternyata begitu mudah

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

The End

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

Atas ialah kandungan terperinci Menulis skrip permainan dalam Python ternyata begitu mudah. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:51cto.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam