首頁 後端開發 Python教學 用Python寫遊戲腳本原來這麼簡單

用Python寫遊戲腳本原來這麼簡單

Apr 13, 2023 am 10:04 AM
python 腳本 遊戲

前言

最近在玩兒公主連結,之前也玩過陰陽師這樣的遊戲,這樣的遊戲都會有個初始號這樣的東西,或者說是可以肝的東西。

當然,身為程式設計師,肝臟這種東西完全可以用寫程式碼的方式幫我們自動完成。遊戲腳本其實不高深,最簡單的體驗方法就是下載一個Airtest了,直接截幾個圖片,寫幾層程式碼,就可以用自己的邏輯玩兒遊戲了。

用Python寫遊戲腳本原來這麼簡單

當然,這篇文章不是要講Airtest這個怎麼用,而是用原始的python opencv來實現上面的操作。

這兩天我寫了一個公主連結刷初始號的程序,也不能算寫遊戲腳本的老手,這篇文章主要是分享一些基礎的技術和使用上的心得吧。

準備工作

首先,我們要完成以下準備。

安卓設備一個:模擬器或真機都可以。

安裝ADB,並加入到系統的PATH裡:adb是用來

安裝tesseract-ocr,並加入到系統的PATH裡:幫助我們實作簡單的字元辨識

#安裝python3.7以上的版本

這裡adb和tesseract我放在百度網盤裡了,裡面順便放了一個錄製的效果視頻。

連結:pan.baidu.com/s/1edTPu2o7… 提取碼:33aw

python庫安裝

#pipinstall pillow pytesseract opencv-python複製程式碼

除此之外,如果有需要可以安裝uiautomator2,這篇文章就不涉及這塊知識了。

使用adb取得安卓裝置

這裡我們主要是涉及到單一安卓裝置的ADB連線操作,首先我們開啟模擬器。

然後我們呼叫adb devices來取得目前的安卓設備,我這裡是一個模擬器。

用Python寫遊戲腳本原來這麼簡單

接下來可以呼叫adb shell測試是否能進入到安卓裝置的shell環境下,確認可以輸入exit退出即可。

用Python寫遊戲腳本原來這麼簡單

如果有的時候進不了shell,可以先呼叫adb kill-server,然後再呼叫adb devices。

可能常用的ADB Shell指令

#接下來是一些ADB的指令操作。透過adb指令,我們可以用python來操作的安卓設備。

螢幕截圖

最常見的操作就是截圖了,先呼叫screencap截圖放到安卓裝置裡,然後再把截圖下拉到電腦。

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 push即可完成。以公主連結為例,以下程式碼可以完成帳號的切換。

# 切换账号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")
登入後複製

查詢目前執行的套件名稱和Activity

#透過以下程式碼,可以查詢目前執行的程式的Activity,也可以順便查包名。

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

用Python寫遊戲腳本原來這麼簡單

#停止某個應用程式

有時候會需要停止某個應用,需要提供應用程式的套件名稱。

adb shell am force-stop tw.sonet.princessconnect
登入後複製

開啟某個應用程式

開啟某個應用程式需要提供套件名稱以及Activity。


adb shell am start -W -n tw.sonet.princessconnect/jp.co.cygames.activity.OverrideUnityActivity
登入後複製

图像操作

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

用Python寫遊戲腳本原來這麼簡單

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

用Python寫遊戲腳本原來這麼簡單

图像查找

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

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

用Python寫遊戲腳本原來這麼簡單

模板如下:

用Python寫遊戲腳本原來這麼簡單

代码如下:

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

用Python寫遊戲腳本原來這麼簡單

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

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

用Python寫遊戲腳本原來這麼簡單

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

用Python寫遊戲腳本原來這麼簡單

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

用Python寫遊戲腳本原來這麼簡單

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

用Python寫遊戲腳本原來這麼簡單

简单的OCR

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


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

用Python寫遊戲腳本原來這麼簡單

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

The End

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

以上是用Python寫遊戲腳本原來這麼簡單的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1665
14
CakePHP 教程
1424
52
Laravel 教程
1322
25
PHP教程
1270
29
C# 教程
1250
24
PHP和Python:解釋了不同的範例 PHP和Python:解釋了不同的範例 Apr 18, 2025 am 12:26 AM

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

在PHP和Python之間進行選擇:指南 在PHP和Python之間進行選擇:指南 Apr 18, 2025 am 12:24 AM

PHP適合網頁開發和快速原型開發,Python適用於數據科學和機器學習。 1.PHP用於動態網頁開發,語法簡單,適合快速開發。 2.Python語法簡潔,適用於多領域,庫生態系統強大。

sublime怎麼運行代碼python sublime怎麼運行代碼python Apr 16, 2025 am 08:48 AM

在 Sublime Text 中運行 Python 代碼,需先安裝 Python 插件,再創建 .py 文件並編寫代碼,最後按 Ctrl B 運行代碼,輸出會在控制台中顯示。

Python vs. JavaScript:學習曲線和易用性 Python vs. JavaScript:學習曲線和易用性 Apr 16, 2025 am 12:12 AM

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

PHP和Python:深入了解他們的歷史 PHP和Python:深入了解他們的歷史 Apr 18, 2025 am 12:25 AM

PHP起源於1994年,由RasmusLerdorf開發,最初用於跟踪網站訪問者,逐漸演變為服務器端腳本語言,廣泛應用於網頁開發。 Python由GuidovanRossum於1980年代末開發,1991年首次發布,強調代碼可讀性和簡潔性,適用於科學計算、數據分析等領域。

Golang vs. Python:性能和可伸縮性 Golang vs. Python:性能和可伸縮性 Apr 19, 2025 am 12:18 AM

Golang在性能和可擴展性方面優於Python。 1)Golang的編譯型特性和高效並發模型使其在高並發場景下表現出色。 2)Python作為解釋型語言,執行速度較慢,但通過工具如Cython可優化性能。

vscode在哪寫代碼 vscode在哪寫代碼 Apr 15, 2025 pm 09:54 PM

在 Visual Studio Code(VSCode)中編寫代碼簡單易行,只需安裝 VSCode、創建項目、選擇語言、創建文件、編寫代碼、保存並運行即可。 VSCode 的優點包括跨平台、免費開源、強大功能、擴展豐富,以及輕量快速。

notepad 怎麼運行python notepad 怎麼運行python Apr 16, 2025 pm 07:33 PM

在 Notepad 中運行 Python 代碼需要安裝 Python 可執行文件和 NppExec 插件。安裝 Python 並為其添加 PATH 後,在 NppExec 插件中配置命令為“python”、參數為“{CURRENT_DIRECTORY}{FILE_NAME}”,即可在 Notepad 中通過快捷鍵“F6”運行 Python 代碼。

See all articles