自动化点击器Match Case逻辑错误导致无限循环及特定点击流程实现求助
自动化点击器Match Case逻辑错误导致无限循环及特定点击流程实现求助
嘿,我看到你现在遇到了两个核心问题:一是当前代码里的match case逻辑完全错误,直接导致了无限循环;二是还没实现你想要的那个“第四步可能是Next或重复Ok”的特定点击流程。咱们一步步来把这些问题解决掉!
先说说你原代码里的关键问题
- Match Case逻辑完全错误:你写的
match click_image:是在匹配函数对象本身,而不是去检测图片的结果,这部分逻辑完全偏离了你的需求,直接导致无限循环一直在打印“Searching for Image ...”却没有实际执行图片检测。 - 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程序被用户中断")
代码说明
- 优化了find_image函数:返回匹配区域的中心坐标(比左上角点击更准确),还加了图片读取失败的判断,避免程序崩溃。
- 重构了click_image函数:用for循环处理重试逻辑,成功就返回True,失败返回False,逻辑更清晰,也能真正发挥
max_retries的作用。 - 实现了你的核心需求流程:
- 依次执行Stamina → Start → Ok的点击,任何一步失败都会跳过后续步骤进入下一轮循环
- 第四步先尝试找Next,找到就点击直接回到开头
- 如果没找到Next,就找Ok点击,之后再找Next点击,完成后回到开头
- 去掉了错误的match case:用更清晰的顺序判断和函数调用替代,完全避免了原有的无限循环问题。
- 增加了中断处理:按Ctrl+C可以正常终止程序,不会一直卡着。
你可以直接运行这个代码,记得把图片路径换成你实际的路径,如果需要调整置信度或者重试间隔,修改对应的参数即可。
备注:内容来源于stack exchange,提问作者Giandalf




