You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 13:01:05