Skip to content

[10-1] NodeTracker 忽略带路条件,在分支点误判当前节点为 B #458

@syokounya

Description

@syokounya

在提交您的问题反馈之前

  • 我已经阅读了 用户文档 并尝试自己解决问题,同时在社群中进行了讨论
  • 我无法找到任何 open issue 反馈了相同的问题

相关环境信息

  • 操作系统: Windows 10/11
  • 模拟器: mumu
  • AutoWSGR 版本: 最新主干分支 (autowsgr/combat/node_tracker.py 等文件)

问题描述

10-1 地图的移动阶段,NodeTracker.update_node()忽略游戏内的带路条件,仅根据 YAML 地图数据中的 next 字段和几何距离来判定当前节点。这导致在满足去 A 节点的带路条件时,程序仍可能误判当前位置为 B 节点。

具体表现为:

  1. 10-1.yaml 中节点 "0"next 字段配置了 ["A", "B"]
    "0":
      position: [900, 427]
      next: [A, B]
  2. NodeTrackerupdate_node() 中(第 395-402 行)会将 AB 全部作为候选;
  3. 随后仅通过欧几里得距离(第 412-424 行)选择最近的一个,而不考虑当前舰队阵容是否满足去 B 的带路条件;
  4. 当小船当前像素位置 (0.931, 0.719) 距离 B (0.820, 0.556) 更近时(距离 0.1979),直接判定为节点 B

这导致 10-1 中所有基于节点 B 的后续决策(阵型选择、夜战策略等)被错误应用。
关键观察

  • 视觉检测完全正常(小船像素验证 OK,阵型识别 OK)。
  • 问题出在 NodeTracker 的决策逻辑:候选列表包含 B 且距离最近,因此直接选了 B

根因分析

查阅源码 autowsgr/combat/node_tracker.py

# 第 395-402 行:确定候选节点列表
if current_data is not None and current_data.next_nodes:
    # 新格式:仅在 next_nodes 中搜索
    candidate_names = current_data.next_nodes

# 第 412-424 行:欧几里得距离选最近节点
for name in candidate_names:
    node = self._map_data.get(name)
    if node is None:
        continue
    dist = _euclidean_distance(sx, sy, node.x, node.y)
    if dist < best_distance:
        # ...

以及 autowsgr/combat/engine.py 中的轮询调用(第 266-270 行):

def _poll_map(screen):
    click_speed_up(device)
    if tracker is not None:
        tracker.update_ship_position(screen)
        new_node = tracker.update_node()  # 纯几何距离,无带路条件过滤

NodeTracker 目前不具备带路条件评估能力,而 engine.py 也未在调用前对候选节点进行过滤。


建议的修复方向

  1. 短期(文档/配置层):在文档中明确说明,地图 YAML 的 next 字段应当仅包含当前条件下可达的节点。对于强带路分支地图,可能需要用户为不同带路条件维护多套地图配置,或精简 next 连接。

  2. 长期(代码层):在 NodeTracker.update_node()CombatEngine._get_poll_action() 中引入带路条件过滤机制

    • 在计算最近节点前,先根据当前 GameContext(舰队阵容、航速、索敌值等)过滤掉不可达的候选节点;
    • 或者允许 CombatPlan / 上层决策模块动态注入候选节点列表,而非完全依赖 YAML 中的静态 next

附加上下文

  • 上游仓库: https://github.com/OpenWSGR/AutoWSGR
  • 涉及文件:
    • autowsgr/combat/node_tracker.py
    • autowsgr/combat/engine.py
    • autowsgr/data/map/normal/10-1.yaml

autowsgr_2026-04-22.debug.log

复现方法

  1. 选择 10-1 地图。
  2. 配置一个满足去 A 带路条件的舰队(例如满足航速/舰种条件,游戏内实际只会前往 A)。
  3. 启动战斗脚本,进入地图移动阶段。
  4. 观察日志输出:
    • NodeTracker 会正确检测到小船位置;
    • 但节点更新时会从 0 误判为 B,而非游戏实际前往的 A

Log输出

23:25:18.698 | DEBUG    | combat/node_tracker.py:352 | [NodeTracker] 小船位置更新: (0.931, 0.719) [黄色簇检测+像素验证]
23:25:18.699 | DEBUG    | combat/node_tracker.py:397 | [NodeTracker] 当前节点 '0', 下一节点候选列表: ['A', 'B']
23:25:18.699 | DEBUG    | combat/node_tracker.py:465 | [NodeTracker] 节点更新: 0 → B (距离 0.1979), 位置: (0.931, 0.719)
23:25:22.393 | DEBUG    | vision/matcher.py:206 | [Matcher] 'choose_formation' OK (6/6 规则匹配, 策略=all)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No fields configured for Bug.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions