You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

自动化点击器Match Case逻辑错误导致无限循环及特定点击流程实现求助

自动化点击器Match Case逻辑错误导致无限循环及特定点击流程实现求助

嘿,我看到你现在遇到了两个核心问题:一是当前代码里的match case逻辑完全错误,直接导致了无限循环;二是还没实现你想要的那个“第四步可能是Next或重复Ok”的特定点击流程。咱们一步步来把这些问题解决掉!

先说说你原代码里的关键问题

  1. Match Case逻辑完全错误:你写的match click_image:是在匹配函数对象本身,而不是去检测图片的结果,这部分逻辑完全偏离了你的需求,直接导致无限循环一直在打印“Searching for Image ...”却没有实际执行图片检测。
  2. click_image函数的重试逻辑有问题:原函数里找到图片点击后就直接return True了,max_retries参数根本没发挥作用——因为一次成功就退出了,而且最后重置counter的代码也不会被执行到。

修正后的完整代码(实现你的需求)

import pyautogui
import cv2
import numpy as np
import time

def find_image(image_path, confidence=0.8):
    screenshot = pyautogui.screenshot()
    screenshot = np.array(screenshot)
    screenshot = cv2.cvtColor(screenshot, cv2.COLOR_RGB2BGR)
    template = cv2.imread(image_path)
    # 先判断模板是否成功读取,避免报错
    if template is None:
        print(f"Error: 无法读取图片 {image_path}")
        return None
    result = cv2.matchTemplate(screenshot, template, cv2.TM_CCOEFF_NORMED)
    loc = np.where(result >= confidence)

    if loc[0].size > 0:
        # 返回匹配区域的中心坐标(比左上角更适合点击)
        x = loc[1][0] + template.shape[1] // 2
        y = loc[0][0] + template.shape[0] // 2
        return (x, y)
    else:
        return None

def click_image(image_path, confidence=0.8, max_retries=5, interval=3):
    """尝试找到图片并点击,成功返回True,重试次数用完返回False"""
    for attempt in range(max_retries):
        position = find_image(image_path, confidence)
        if position:
            print(f"找到图片 {image_path} 在位置 {position},执行点击...")
            pyautogui.click(position)
            time.sleep(interval)
            return True
        else:
            print(f"第 {attempt+1}/{max_retries} 次尝试:未找到图片 {image_path},{interval}秒后重试...")
            time.sleep(interval)
    print(f"重试 {max_retries} 次后仍未找到图片 {image_path}")
    return False

# 定义图片路径
STAMINA_PATH = r'C:\Users\blabla\DokkanAutocklicker\Stamina.png'
START_PATH = r'C:\Users\blabla\DokkanAutocklicker\StartStage.png'
OK_PATH = r'C:\Users\blabla\DokkanAutocklicker\Ok.png'
NEXT_PATH = r'C:\Users\blabla\DokkanAutocklicker\GoToNextLevel.png'

def main_loop():
    while True:
        print("\n=== 开始新一轮循环 ===")
        # 步骤1:点击Stamina
        if not click_image(STAMINA_PATH):
            print("Stamina图片点击失败,跳过后续步骤进入下一轮循环")
            continue
        # 步骤2:点击Start
        if not click_image(START_PATH):
            print("Start图片点击失败,跳过后续步骤进入下一轮循环")
            continue
        # 步骤3:点击Ok
        if not click_image(OK_PATH):
            print("Ok图片点击失败,跳过后续步骤进入下一轮循环")
            continue
        # 步骤4:处理两种情况:先找Next,找不到就找Ok再找Next
        print("\n=== 进入第四步处理 ===")
        # 先尝试点击Next
        if click_image(NEXT_PATH):
            print("直接找到Next并点击,回到循环开头")
            continue
        # 如果没找到Next,尝试找Ok
        print("未找到Next,尝试找Ok...")
        if click_image(OK_PATH):
            # 点击Ok后再找Next
            print("找到Ok并点击,现在尝试找Next...")
            click_image(NEXT_PATH)
        # 无论第四步结果如何,回到循环开头
        print("第四步处理完成,回到循环开头")

if __name__ == "__main__":
    try:
        main_loop()
    except KeyboardInterrupt:
        print("\n程序被用户中断")

代码说明

  1. 优化了find_image函数:返回匹配区域的中心坐标(比左上角点击更准确),还加了图片读取失败的判断,避免程序崩溃。
  2. 重构了click_image函数:用for循环处理重试逻辑,成功就返回True,失败返回False,逻辑更清晰,也能真正发挥max_retries的作用。
  3. 实现了你的核心需求流程
    • 依次执行Stamina → Start → Ok的点击,任何一步失败都会跳过后续步骤进入下一轮循环
    • 第四步先尝试找Next,找到就点击直接回到开头
    • 如果没找到Next,就找Ok点击,之后再找Next点击,完成后回到开头
  4. 去掉了错误的match case:用更清晰的顺序判断和函数调用替代,完全避免了原有的无限循环问题。
  5. 增加了中断处理:按Ctrl+C可以正常终止程序,不会一直卡着。

你可以直接运行这个代码,记得把图片路径换成你实际的路径,如果需要调整置信度或者重试间隔,修改对应的参数即可。

备注:内容来源于stack exchange,提问作者Giandalf

火山引擎 最新活动