You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于邻接矩阵的文本冒险游戏:实现方向式地图导航改造

文本冒险游戏:邻接矩阵转方向导航方案

核心思路

把原有的地点-地点邻接矩阵,重构为地点-方向-目标地点的映射结构,直接建立方向与目标地点的关联,用户输入方向时可直接查询跳转,逻辑更直观高效。

方案一:完全重构为嵌套字典(推荐)

放弃邻接矩阵,改用嵌套字典存储地图数据,每个地点对应一个方向到目标地点的映射,同时支持方向缩写(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)

关键修改点

  1. 数据结构优化:用嵌套字典替代邻接矩阵,直接关联地点、方向和目标,无需通过索引转换,可读性和维护性大幅提升。
  2. 输入兼容性:同时支持方向缩写和全称,用户输入更灵活。
  3. 逻辑简化:直接通过字典查询跳转,省去邻接矩阵的索引匹配和连通性判断步骤(映射本身已保证连通)。

方案二:保留邻接矩阵(兼容原有结构)

如果不想完全丢弃邻接矩阵,可以补充一个地点索引-方向-目标索引的映射字典,在原逻辑基础上扩展方向导航功能。

修改后代码示例

# 原有地点列表和邻接矩阵
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 22:05:22