基于邻接矩阵的文本冒险游戏:实现方向式地图导航改造
文本冒险游戏:邻接矩阵转方向导航方案
核心思路
把原有的地点-地点邻接矩阵,重构为地点-方向-目标地点的映射结构,直接建立方向与目标地点的关联,用户输入方向时可直接查询跳转,逻辑更直观高效。
方案一:完全重构为嵌套字典(推荐)
放弃邻接矩阵,改用嵌套字典存储地图数据,每个地点对应一个方向到目标地点的映射,同时支持方向缩写(N/E/S/W)和全称(北/东/南/西)输入。
修改后代码示例
# 地图数据:地点 -> {方向: 目标地点},同时支持缩写和全称 location_map = { "村口": {"N": "树林", "E": "小溪", "北": "树林", "东": "小溪"}, "树林": {"S": "村口", "E": "山洞", "南": "村口", "东": "山洞"}, "小溪": {"W": "村口", "S": "农田", "西": "村口", "南": "农田"}, "山洞": {"W": "树林", "西": "树林"}, "农田": {"N": "小溪", "北": "小溪"} } current_location = "村口" # 直接存储地点名称,避免索引转换麻烦 def handle_move(cmd): global current_location # 统一处理输入格式,支持大小写 cmd = cmd.strip().upper() # 全称转缩写,简化判断逻辑 full_to_short = {"北": "N", "东": "E", "南": "S", "西": "W"} if cmd in full_to_short: cmd = full_to_short[cmd] # 查询目标地点 if cmd in location_map[current_location]: current_location = location_map[current_location][cmd] print(f"你往{cmd}方向前进,来到了「{current_location}」") else: print(f"⚠️ 无法往{cmd}方向走!") # 游戏主循环 while True: user_input = input(f"\n当前位置:「{current_location}」\n请输入方向(N/E/S/W/北/东/南/西),输入quit退出:") if user_input.lower() == "quit": print("游戏结束!") break handle_move(user_input)
关键修改点
- 数据结构优化:用嵌套字典替代邻接矩阵,直接关联地点、方向和目标,无需通过索引转换,可读性和维护性大幅提升。
- 输入兼容性:同时支持方向缩写和全称,用户输入更灵活。
- 逻辑简化:直接通过字典查询跳转,省去邻接矩阵的索引匹配和连通性判断步骤(映射本身已保证连通)。
方案二:保留邻接矩阵(兼容原有结构)
如果不想完全丢弃邻接矩阵,可以补充一个地点索引-方向-目标索引的映射字典,在原逻辑基础上扩展方向导航功能。
修改后代码示例
# 原有地点列表和邻接矩阵 locations = ["村口", "树林", "小溪", "山洞", "农田"] adj_matrix = [ [0, 1, 1, 0, 0], # 村口连接树林、小溪 [1, 0, 0, 1, 0], # 树林连接村口、山洞 [1, 0, 0, 0, 1], # 小溪连接村口、农田 [0, 1, 0, 0, 0], # 山洞连接树林 [0, 0, 1, 0, 0] # 农田连接小溪 ] # 新增方向映射:地点索引 -> {方向: 目标地点索引} dir_to_target_idx = [ {"N": 1, "E": 2, "北": 1, "东": 2}, {"S": 0, "E": 3, "南": 0, "东": 3}, {"W": 0, "S": 4, "西": 0, "南": 4}, {"W": 1, "西": 1}, {"N": 2, "北": 2} ] current_idx = 0 # 初始在村口(索引0) def handle_move(cmd): global current_idx cmd = cmd.strip().upper() full_to_short = {"北": "N", "东": "E", "南": "S", "西": "W"} if cmd in full_to_short: cmd = full_to_short[cmd] # 先检查方向是否有效 if cmd in dir_to_target_idx[current_idx]: target_idx = dir_to_target_idx[current_idx][cmd] # 可选:用邻接矩阵验证连通性(防止映射数据错误) if adj_matrix[current_idx][target_idx] == 1: current_idx = target_idx print(f"你往{cmd}方向走,来到了「{locations[current_idx]}」") else: print("⚠️ 地图数据错误,无法前往该方向!") else: print(f"⚠️ 无法往{cmd}方向走!") # 游戏主循环 while True: user_input = input(f"\n当前位置:「{locations[current_idx]}」\n请输入方向(N/E/S/W/北/东/南/西),输入quit退出:") if user_input.lower() == "quit": print("游戏结束!") break handle_move(user_input)
适用场景
适合需要保留邻接矩阵用于其他逻辑(比如路径计算)的场景,通过补充方向映射实现导航功能,同时保留原数据结构。
内容的提问来源于stack exchange,提问作者user4378959
相关产品推荐
相关产品推荐

