まえがき
私は最近プリンセスコネクトをプレイしています。以前は陰陽師などのゲームもプレイしたことがあります。そういったゲームにはこのような初期番号が付けられます。 、または食べられるもの。
もちろん、プログラマーとして、肝臓のようなものは、コードを書くことで自動的に完了することができます。ゲーム スクリプトは実際には高度なものではありませんが、これを体験する最も簡単な方法は、Airtest をダウンロードし、数枚の写真を撮り、いくつかのコード レイヤーを記述するだけで、独自のロジックに従ってゲームをプレイできるようになります。
もちろん、この記事は Airtest の使用方法に関するものではなく、オリジナルの Python opencv を使用して上記の操作を実装する方法について説明しています。
この 2 日間で、初期アカウントを取得するためのプリンセス リンクのプログラムを作成しました。私はゲーム スクリプト作成のベテランとは言えません。この記事は主に、ゲーム スクリプトの基本的なテクニックと経験を共有することを目的としています。それを使って。
#準備作業
まず、以下の準備を完了する必要があります。 Android デバイス 1 台: エミュレータまたは実デバイスを使用できます。 ADB をインストールしてシステムの PATH に追加します: adb は次の目的で使用されますtesseract-ocr をインストールしてシステムの PATH に追加します: 単純な文字認識の実現にご協力くださいPython3.7 以降のバージョンをインストールしてください。Baidu ネットワーク ディスクに adb と tesseract を入れました。その中にエフェクト ビデオが録画されています。 リンク: pan.baidu.com/s/1edTPu2o7… 抽出コード: 33aw
Python ライブラリのインストール
pipinstallpillow pytesseract opencv-python copy codeさらに、必要に応じて uiauTomator2 をインストールすることもできますが、この記事ではこの知識については説明しません。adb を使用して Android デバイスを取得する
ここでは主に、単一の Android デバイスの ADB 接続操作を行います。エミュレータ。 次に、adb devices を呼び出して現在の Android デバイスを取得します。これがエミュレータです。 次に、adb Shell を呼び出して Android デバイスのシェル環境に入ることができるかどうかをテストし、exit を入力して終了できることを確認します。 #シェルに入れない場合は、最初に adb kill-server を呼び出し、次に adb devices を呼び出すことができます。一般的に使用される可能性のある ADB シェル コマンド
次に、ADB コマンド操作の一部を示します。 adb コマンドを使用すると、Python を使用して Android デバイスを操作できます。スクリーンショット
最も一般的な操作は、スクリーンショットを撮ることです。まず、screencap を呼び出してスクリーンショットを撮り、それを Android デバイスに置きます。そしてスクリーンショットをコンピュータに取り込みます。def take_screenshot(): os.system("adb shell screencap -p /data/screenshot.png") os.system("adb pull /data/screenshot.png ./tmp.png")
ドロップダウン ファイル
ドロップダウン ファイルは、先ほどの adb pull です。プリンセス リンクを例にとると、次のようになります。コードでアカウント情報の XML をエクスポートできるため、将来は XML 経由でログインできます。os.system(f"adb pull /data/data/tw.sonet.princessconnect/shared_prefs/tw.sonet.princessconnect.v2.playerprefs.xml ./user_info.xml")
ファイルのアップロード
ドロップダウンを使用すると、アップロードが自然に行われ、adb プッシュによって完了できます。 Princess Link を例に挙げると、次のコードでアカウントの切り替えを完了できます。# 切换账号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")
#画面上のどこかをクリック#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}")
text = "YourPassword" os.system(f"adb shell input text {text}")
文字の削除
入力ボックスに入力キャッシュがあり、文字を削除する必要がある場合があります。 # 删除10个字符
for i in range(10):
os.system("adb shell input keyevent 67")
現在実行中のパッケージ名とアクティビティのクエリ
次のコードを通じて、現在実行中のプログラムのアクティビティをクエリできます。ちなみにパッケージを確認することもできます。
<span>xxxxxxxxxx</span>
<span role="presentation" style="padding-right: 0.1px;">adb shell dumpsys activity activities</span>
##アプリケーションを停止します
##場合によっては、アプリケーションを停止する必要があり、アプリケーションのパッケージ名を指定する必要があります。 adb shell am force-stop tw.sonet.princessconnect
アプリケーションを開くには、パッケージ名とアクティビティを指定する必要があります。
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以及图像相关的基础操作。谢谢大家的观看。
以上がPython でゲーム スクリプトを書くのはとても簡単であることが判明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。