python-sc2单位查询完全指南用Units过滤与距离排序30技巧精准锁定目标【免费下载链接】python-sc2A StarCraft II bot api client library for Python 3项目地址: https://gitcode.com/gh_mirrors/pyt/python-sc2python-sc2 是一个面向 Python 3 的星际争霸 IIStarCraft IIAI Bot 开发库。对于新手来说单位查询是写 Bot 的第一步想知道我有多少海军陆战队、离敌人最近的水晶矿在哪、哪些建筑造好了全靠它。本文是一份 python-sc2 单位查询完全指南系统讲解Units集合类的过滤与距离排序技巧30 多个方法一次讲透帮助你快速精准锁定目标单位。什么是 Units 集合类在 python-sc2 中所有单位查询结果都不是普通列表而是一个专门的集合类——Units。它继承自 Python 的 list但在其上封装了类型过滤、距离计算、标签匹配、状态筛选等一整套查询 DSL让你用一行代码完成过去要写循环才能实现的操作。Units 类的完整源码在 sc2/units.py配合单位属性定义 sc2/unit.py 和类型常量 sc2/ids/unit_typeid.py是写 Bot 时查阅频率最高的三个文件。 小技巧self.units返回己方所有单位self.enemy_units返回敌方所有单位——两者都是 Units 对象因此后面讲的所有方法对它们都适用。快速获取单位分组常用查询入口BotAI类源码见 sc2/bot_ai.py内置了一批开箱即用的查询属性写 Bot 时建议优先使用避免每次都手动过滤查询入口含义self.units/self.enemy_units己方 / 敌方所有单位self.structures/self.enemy_structures己方 / 敌方所有建筑self.workers己方所有农民SCV / 探测机 / 工蜂self.townhalls己方所有主基地self.gas_buildings己方气矿建筑self.mineral_field/self.vespene_geyser地图上的水晶矿 / 气矿self.resources所有中性资源点示例一行代码拿到所有已完成的己方建筑ready_buildings self.structures.ready类型过滤6 种技巧精准筛选兵种1. 括号语法最常用Units 对象可以直接当函数调用等价于of_typemarines self.units(UnitTypeId.MARINE) # 单个类型 attackers self.units({UnitTypeId.MARINE, UnitTypeId.MARAUDER}) # 多个类型2. of_type —— 保留指定类型attackers self.units.of_type({UnitTypeId.ZERGLING, UnitTypeId.ROACH})⚡ 官方建议传入set 而不是 list查找速度更快。3. exclude_type —— 排除指定类型combat_units self.enemy_units.exclude_type({UnitTypeId.LARVA, UnitTypeId.EGG})4. same_tech —— 查找同源建筑建筑升级后类型会变孵化场→巢穴→蜂后same_tech能一次性拿到所有科技线等价的建筑zerg_bases self.townhalls.same_tech({UnitTypeId.HATCHERY}) # 孵化场巢穴蜂后5. same_unit —— 查找同兵种的不同形态跳埋的蟑螂类型 ID 会变用same_unit可以一并找出all_roaches self.units.same_unit(UnitTypeId.ROACH) # 含跳埋的蟑螂6. filter —— 自定义条件过滤前 5 种方法满足不了时filter是万能兜底方案。传入任意 lambda可以按血量、能量、状态等组合条件筛选queens self.units.filter(lambda u: u.type_id UnitTypeId.QUEEN and u.energy 25) can_shoot_air self.units.filter(lambda u: u.can_attack_air)距离排序12 种方法锁定最近目标距离查询是作战逻辑的核心。Units 类提供了一整套方法全部基于游戏坐标计算无需自己写欧氏距离单个最近 / 最远目标closest_to(position)返回距离目标最近的单个单位。position可以是单位也可以是Point2坐标点。target self.enemy_units.closest_to(self.start_location)furthest_to(position)返回距离目标最远的单个单位适合派斥候卡视野或让残兵撤退。最近 / 最远的 N 个单位closest_n_units(position, n)返回距离目标最近的 N 个单位是集火最近敌人的标配。top5 self.enemy_units.closest_n_units(self.townhalls.first, 5)furthest_n_units(position, n)返回最远的 N 个单位。按距离阈值筛选closer_than(distance, position)返回比指定距离更近的所有单位——警戒圈内敌军就这么查。close_enemies self.enemy_units.closer_than(15, my_base)further_than(distance, position)返回比指定距离更远的所有单位。in_distance_between(position, distance1, distance2)返回距离落在 [d1, d2] 区间内的单位适合做火力覆盖圈判断。只查距离数值不返回单位closest_distance_to(position)返回集合中最近单位到目标的距离数值常用于敌我距离小于 X 才开火的条件判断。furthest_distance_to(position)返回最远单位到目标的距离。按距离排序整个集合sorted_by_distance_to(position, reverseFalse)把整个集合按到目标的距离升序或降序排好返回新的 Units 对象。它比手写sorted(key...)更快因为内部复用了缓存的距离矩阵。prefer_idle一个特殊的排序属性把空闲单位排到最前面分配任务时先用它挑没事干的单位。next_worker self.workers.prefer_idle.first攻击范围与群体距离in_attack_range_of(unit, bonus_distance0)返回某单位能直接打到范围内的所有敌人内部自动考虑了双方半径。in_distance_of_group(other_units, distance)返回距离另一个 Units 集合中任意单位小于 distance 的单位用于判断是否贴到敌群。in_closest_distance_to_group(other_units)返回与敌群距离最近的单个单位——集火目标首选。n_closest_to_distance(position, distance, n)返回距离最接近指定数值 N 的单位冷门但有趣例如维持固定间距编队。标签查询与状态属性10 个速查技巧用 tag 精确定位单位每个单位都有唯一 tag。跨帧记住我要打的那个敌人时别存单位对象会过期存 tagby_tag(tag)按 tag 取单位找不到会抛 KeyError。find_by_tag(tag)同上但找不到返回 None更安全。tags_in(other)批量取出 tag 在某个集合里的单位。tags_not_in(other)批量排除 tag 在某集合里的单位常用于未被分配任务的皇后。tags返回集合内所有 tag 的 set。常用状态属性一行筛状态属性含义idle空闲单位站着没做事ready/not_ready建造完成 / 建造中的建筑flying/not_flying飞行 / 地面单位gathering/returning正在采矿 / 正在回基地的农民collecting采矿 回程的所有农民visible当前视野内可见的单位selected被玩家手动选中的单位集合运算像做数学一样组合单位Units 支持运算符重载组合多个查询结果非常顺手|或并集自动去重。self.units | self.structures就是己方全部实体。交集。-差集。self.units - busy_units得到还没分配任务的单位。辅助工具还有amount数量、empty/exists是否为空、first第一个、random随机一个、take(n)取前 N 个、random_group_of(n)随机 N 个、center所有单位的质心适合下移动到集合中心类指令。性能与实战建议每帧重复查询要注意缓存BotAI内置了property_cache_once_per_frame帧级缓存机制同一个 step 内多次访问self.units不会重复拉取数据放心查。距离计算可切换算法在__init__中设置self.distance_calculation_method 2scipy cdist大部队交火时距离查询明显更快。先类型过滤再距离过滤self.enemy_units(UnitTypeId.MUTALISK).closest_to(base)比先找最近单位再判断类型更高效。空集合保护closest_to等方法在集合为空时会断言失败调用前先用exists判断。想看看这些查询方法在真实 Bot 中如何运用推荐阅读 examples/ 目录下的示例如examples/protoss/cannon_rush.py以及专门测试查询行为的 test/queries_test_bot.py。更完整的 API 文档可在 docs_generate/unit/index.rst 对应的文档站中找到。总结掌握 python-sc2 的单位查询本质上就是掌握三件事入口self.units、self.workers等内置属性秒取单位分组过滤括号语法、of_type、filter层层筛选兵种与状态距离closest_to、closer_than、sorted_by_distance_to等 12 种方法完成定位与排序。把这 30 个方法内化后你写 Bot 的逻辑判断将大幅变短——这正是 python-sc2 的设计初衷一个 worker rush Bot 不应该写 200 行20 行就够了。【免费下载链接】python-sc2A StarCraft II bot api client library for Python 3项目地址: https://gitcode.com/gh_mirrors/pyt/python-sc2创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考