misakamikodo / mhxy_script

梦幻西游手游脚本(基于pyautogui、opencv,在python环境下运行文件)
168 stars 62 forks source link

Issue with Recursion in Baotu Class #22

Closed minchieh-fay closed 6 months ago

minchieh-fay commented 6 months ago

Description: In the mhxy_baotu.py file of the project, there is a Baotu class containing a mission function. This function utilizes recursion, but it seems to encounter a deadlock when it reaches the statement waitUtilFindPic(r'resources/fuben/select.png').

Issue: The mission function within the Baotu class appears to have a deadlock problem during recursion. It gets stuck at the line where it waits for the select.png image to be found.

Expected Behavior: The mission function should be able to recursively execute without encountering deadlock or getting stuck at any point.

Steps to Reproduce:

Execute the mission function of the Baotu class in mhxy_baotu.py. Observe the execution behavior, especially when it reaches the waitUtilFindPic(r'resources/fuben/select.png') statement.

minchieh-fay commented 6 months ago

我知道为什么会卡死在baotu->mission上面了 当我把左下角聊天频道禁用后
只留下了个人信息 也就是刚打完的藏宝任务 "获得一张藏宝图" 和 resources/richang/baotu_mission.png 中的文字一样(除了颜色) 因为以模糊度0.8查找的 他就一直认为存在宝图任务 然后就死循环了

解决方法:

  1. 改代码: 将find的区域改至右半边
  2. 不改代码, 放开"世界" "系统"等窗口信息, 等待系统信息刷掉 "获得藏宝图"的字样
misakamikodo commented 6 months ago

这个方法是以出现领取任务对话框开始(waitUtilFindPic(r'resources/fuben/select.png') 是等待到对话框出现,也就是没领取任务的前提下点击店小二出现的对话框),在1分30秒内没有进入战斗为结束条件的。baotu_mission那个图会在领取任务后点击任务栏任务追踪用到一次(如果找不到就会读取配置文件的位置)。结尾处的递归为了防止网络卡了情况但调用得确实不对,我会增加判断是否已经领取过宝图任务,是的话就跳过领取任务步骤。

minchieh-fay commented 6 months ago

我递归加了参数, 防止递归时进入waitUtilFindPic 但是出现左下角聊天出现绿色的 "宝图"字样 就会再次进入递归 因为误认为baotu_mission.png , 不会卡死在waitUtilFindPic上 而是一直在自旋

我没有用方法1去改代码 而是方开了 我的系统聊天 等有人全世界喊话几句 冲掉前面的"宝图"字样 他自己就正常走下去了

misakamikodo commented 6 months ago

我递归加了参数, 防止递归时进入waitUtilFindPic 但是出现左下角聊天出现绿色的 "宝图"字样 就会再次进入递归 因为误认为baotu_mission.png , 不会卡死在waitUtilFindPic上 而是一直在自旋

我没有用方法1去改代码 而是方开了 我的系统聊天 等有人全世界喊话几句 冲掉前面的"宝图"字样 他自己就正常走下去了

是不是说的10张宝图做完了没有结束,错误地进入递归了的错

minchieh-fay commented 6 months ago

对的 他扫描到 左下角界面的 "宝图" == baotu_mission.png 误判 -> 进入递归

假如像我 我不喜欢订阅系统消息, 聊天框一直是 个人信息: "您获得了一张藏宝图...." 然后就一直卡死了

minchieh-fay commented 6 months ago

我自己这边已经OK了:

def mission(self, count = 0):
  if  count == 0 :
       waitUtilFindPic(r'resources/fuben/select.png')
  if count > 3:
      return
  ......
  if ms is not None:
            self.mission(count+1)

最多让他递归3次

misakamikodo commented 6 months ago

我自己这边已经OK了:

def mission(self, count = 0):
  if  count == 0 :
       waitUtilFindPic(r'resources/fuben/select.png')
  if count > 3:
      return
  ......
  if ms is not None:
            self.mission(count+1)

最多让他递归3次

我改成从右半边获取baotu_mission 了

minchieh-fay commented 6 months ago

OK 那就彻底解决了 我没去理解你的坐标数据 简单写死最多循环3次 用10个角色串行测试了一晚上 全部成功做完了 没有卡死的情况 所以应该就这里的问题