如何动态识别脚本元素为变量/坐标并解析获取两组坐标与结果变量名
实现getcords函数的变量与坐标识别方案
核心逻辑思路
先明确输入命令的固定格式:getcords <结果变量名> <坐标/变量1> <坐标/变量2>,处理流程分为三步:
- 拆分命令参数,提取关键元素
- 用正则匹配识别静态坐标格式
- 非坐标格式的元素,直接匹配
M_LOCATIONS字典的键验证变量有效性
具体实现代码
import re # 示例位置变量字典 M_LOCATIONS = { "spawn_point": (0, 0), "boss_loc": (150.5, 220.0), "chest": (-30, 45) } def getcords(command_line): # 拆分命令行,过滤空字符 parts = [p for p in command_line.strip().split() if p] if len(parts) != 4: raise ValueError("命令格式错误,正确用法:getcords <结果变量名> <坐标/变量> <坐标/变量>") result_var = parts[1] elem_a = parts[2] elem_b = parts[3] # 匹配静态坐标的正则(支持整数、浮点数,允许坐标内有空格) coord_regex = re.compile(r'^\(-?\d+(\.\d+)?\s*,\s*-?\d+(\.\d+)?\)$') def resolve_element(elem): # 优先判断是否为静态坐标 if coord_regex.match(elem): # 提取并转换坐标值 coords = elem.strip('()').split(',') x = float(coords[0].strip()) y = float(coords[1].strip()) return (x, y) # 再判断是否为M_LOCATIONS中的变量 elif elem in M_LOCATIONS: return M_LOCATIONS[elem] # 都不匹配则抛出错误 else: raise ValueError(f"无法解析元素:{elem} - 既不是合法坐标也不是已定义的位置变量") # 解析两组坐标 coord1 = resolve_element(elem_a) coord2 = resolve_element(elem_b) return result_var, coord1, coord2 # 测试用例 if __name__ == "__main__": # 变量+静态坐标 test_cmd1 = "getcords attack_pos boss_loc (10, 20)" var, c1, c2 = getcords(test_cmd1) print(f"结果变量:{var},坐标1:{c1},坐标2:{c2}") # 双静态坐标 test_cmd2 = "getcords move_path (0,0) (-50.5, 30)" var, c1, c2 = getcords(test_cmd2) print(f"结果变量:{var},坐标1:{c1},坐标2:{c2}") # 双变量 test_cmd3 = "getcords distance spawn_point chest" var, c1, c2 = getcords(test_cmd3) print(f"结果变量:{var},坐标1:{c1},坐标2:{c2}")
关键细节说明
- 坐标正则优化:允许坐标内部有空格(比如
(10, 20)),适配用户可能的输入习惯 - 优先级处理:先判断静态坐标,避免变量名恰好和坐标格式冲突(虽然概率低,但逻辑更严谨)
- 错误反馈:明确区分格式错误和未定义变量的情况,方便调试
- 扩展性:如果需要支持更多坐标格式(如不带括号的
10,20),只需修改正则表达式即可
内容的提问来源于stack exchange,提问作者Advik
相关产品推荐
相关产品推荐

