Python部落冲突自动搜敌脚本如何实现屏幕识别功能
《部落冲突》Python自动搜敌机器人实现方案
你当前代码的核心缺失是屏幕指定区域截图+数字OCR识别环节,直接用input(Image)是无法读取游戏内资源数值的,按以下步骤调整即可跑通:
前置准备
先安装需要的依赖库,执行命令:
pip install pyautogui pillow pytesseract playsound
额外需要在本地安装Tesseract OCR引擎,安装时勾选英文数字识别组件,安装后把引擎路径加到系统环境变量里即可。
提前打开游戏进入搜敌界面,量好三个资源数值在屏幕上的固定坐标区域(游戏UI位置固定,只要窗口不移动坐标不会变),分别记录金币、圣水、暗黑圣水三个数字显示区域的左上角、右下角坐标。
核心逻辑修正点
- 废弃原来的三层嵌套if判断,改为三个资源阈值同时满足时才触发提示音,避免单资源达标就误报
- 调整点击顺序:先点击进攻按钮进入搜敌队列,每次加载完敌方基地后先截图识别资源,不达标再点击跳过按钮搜下一个
- 截图时只截取三个资源所在的极小区域,不要截全屏,同时对截图做灰度、二值化预处理,把数字和游戏UI背景分开,大幅提高OCR识别准确率
- 每次点击后加固定等待时间,等游戏界面加载完成再做下一步操作,避免操作过快识别到未加载完成的界面
修正后完整代码
import pyautogui import time import pytesseract from PIL import ImageOps from playsound import playsound # ========== 配置项 自行根据自己屏幕分辨率调整 ========== # 三个资源的截图区域 (左上角x, 左上角y, 右下角x, 右下角y) GOLD_REGION = (100, 50, 250, 90) ELIXIR_REGION = (280, 50, 430, 90) DARK_ELIXIR_REGION = (460, 50, 580, 90) # 按钮坐标 ATTACK_BTN = (200, 920) FIND_MATCH_BTN = (1480, 703) SKIP_BTN = (1642, 773) # 资源阈值 MIN_GOLD = 700000 MIN_ELIXIR = 700000 MIN_DARK_ELIXIR = 2000 # 提示音本地路径 ALERT_SOUND_PATH = "alert.mp3" # 操作等待时间 WAIT_AFTER_CLICK = 3 # ===================================================== def read_resource(region): """截取指定区域图片,识别其中的数字返回整数""" # 截图并做预处理提高识别率 img = pyautogui.screenshot(region=region) img = ImageOps.grayscale(img) img = img.point(lambda x: 0 if x < 128 else 255) # 只识别数字 num_str = pytesseract.image_to_string(img, config='--psm 7 -c tessedit_char_whitelist=0123456789') try: return int(num_str.strip()) except: # 识别失败返回0,直接跳过该目标 return 0 if __name__ == "__main__": # 初始进入进攻界面 pyautogui.leftClick(ATTACK_BTN, duration=0.5) time.sleep(WAIT_AFTER_CLICK) pyautogui.leftClick(FIND_MATCH_BTN, duration=1) time.sleep(WAIT_AFTER_CLICK) while True: # 读取当前敌方资源 gold = read_resource(GOLD_REGION) elixir = read_resource(ELIXIR_REGION) dark_elixir = read_resource(DARK_ELIXIR_REGION) print(f"当前识别资源:金币{gold},圣水{elixir},暗黑圣水{dark_elixir}") # 判断是否满足所有阈值 if gold >= MIN_GOLD and elixir >= MIN_ELIXIR and dark_elixir >= MIN_DARK_ELIXIR: playsound(ALERT_SOUND_PATH) # 响铃后暂停,等手动操作进攻,按回车继续搜下一个 input("找到符合要求的目标,按回车继续搜敌...") # 不满足条件点跳过 pyautogui.leftClick(SKIP_BTN, duration=0.2) time.sleep(WAIT_AFTER_CLICK)
调参提示
- 第一次运行先只跑资源识别打印的部分,调整三个资源区域的坐标,直到控制台打印的数值和游戏内显示的完全一致,再开自动点击逻辑,避免误点
- 如果识别准确率低,可以调整预处理的二值化阈值,或者把截图区域再缩小,只框住数字本身,不要带多余的UI图标
- 不要把点击间隔设太短,容易触发游戏的反作弊检测
内容的提问来源于stack exchange,提问作者yoan
相关产品推荐
相关产品推荐

