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

Python自动化脚本异常:调用att()后陷入重复点击死循环

问题分析与解决方案

核心问题

  1. att()函数陷入重复操作:函数内嵌套遍历像素时,找到目标RGB(155,15,19)后没有终止循环,会持续对同一个像素位置重复执行点击操作,因为外层的for循环不会自动停止。
  2. 主循环逻辑错误:逐个像素判断是否存在战斗标记RGB(0,255,0),只要有一个像素不符合就调用att(),导致att()被频繁触发,且一旦进入att()的遍历循环就无法回到主循环。

修复后的代码

1. 修复att()函数

找到目标颜色后立即完成点击并退出函数,避免重复操作:

def att():
    s = pyautogui.screenshot()
    for x in range(68, 1690, 5):
        for y in range(140, 975, 5):
            r,g,b = s.getpixel((x,y))
            if (r,g,b) == (155,15,19):
                print('attacking')
                pyautogui.moveTo(x, y)
                pyautogui.click(x, y)
                sleep(3)
                return  # 找到目标后立即退出函数,终止遍历

2. 修复主循环逻辑

先整体检测区域内是否存在战斗标记,只有完全不存在时才调用att(),避免逐个像素判断导致的频繁调用:

while True:
    openinvo()
    lowhp = pyautogui.locateCenterOnScreen('lowhp.JPG', region=(0, 0, 1920, 1080), confidence=0.85)
    if lowhp is None:
        heal()
    
    # 先检测整个区域是否存在战斗标记(0,255,0)
    in_combat = False
    s1 = pyautogui.screenshot()
    for x1 in range(68, 1690, 5):
        for y1 in range(140, 975, 5):
            r1,g1,b1 = s1.getpixel((x1,y1))
            if (r1,g1,b1) == (0,255,0):
                in_combat = True
                break  # 找到战斗标记,停止内层遍历
        if in_combat:
            break  # 找到战斗标记,停止外层遍历
    
    if in_combat:
        print('in combat')
        sleep(0.3)
    else:
        print('test')
        att()
        sleep(0.3)
    
    if keyboard.is_pressed("q"):
        break

额外优化建议

  • 减少截图频率:频繁截图会占用系统资源,可以根据实际场景调整截图的时机和区域范围。
  • 调整遍历步长:原代码步长为5已做优化,若追求更快检测速度,可适当增大步长值。
  • 添加超时机制:在att()中可添加超时判断,避免长时间找不到目标时一直处于遍历状态。

内容的提问来源于stack exchange,提问作者willy smith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 04:20:16