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

如何使用二维数组在类Zork Python文本游戏中记录玩家位置

实现指导:用二维数组打造Zork类开放文本冒险游戏

核心逻辑拆解

你想到的二维数组方案就是网格地图系统,核心只需要维护三类数据即可实现开放移动效果:

  • 地图本身的单元格属性(墙壁、可通行区域、道具等)
  • 玩家当前的坐标位置(x,y)
  • 背包、剧情触发状态等全局变量

不需要嵌套复杂的if-else,所有移动、交互逻辑都可以通过坐标计算统一处理。

完整可运行实现代码

# 常量定义
MAP_CELL = {
    "WALL": 1,
    "EMPTY": 0,
    "FOOD": 2
}
# 方向指令映射:输入关键词对应坐标偏移量,支持简写
DIRECTION_CMD = {
    "north": (-1, 0),
    "n": (-1, 0),
    "south": (1, 0),
    "s": (1, 0),
    "east": (0, 1),
    "e": (0, 1),
    "west": (0, -1),
    "w": (0, -1)
}
TAKE_CMD = ["take", "grab", "bring", "拾取", "拿"]
QUIT_CMD = ["quit", "exit", "q", "退出"]

# 初始化地图:和你给出的示例结构完全一致
game_map = [
    [1, 1, 1, 1, 1],
    [1, 2, 1, 0, 1],
    [1, 0, 0, 0, 1],
    [1, 0, 1, 0, 1],
    [1, 1, 1, 1, 1]
]
# 坐标对应场景描述,可按需扩展更多点位
location_desc = {
    (1,1): "房屋厨房角落",
    (1,3): "二楼卧室门口",
    (2,1): "一楼玄关",
    (2,2): "一楼客厅中央",
    (2,3): "房屋后门,门外就是街道",
    (3,1): "地下室入口台阶",
    (3,3): "地下室储物间门口"
}

# 玩家初始状态:初始位置在客厅,背包为空
player_pos = [2, 2]
inventory = []
game_running = True

# 游戏主循环
print("="*35)
print("欢迎开始冒险!输入n/s/e/w移动,take拾取物品,quit退出游戏")
print("="*35)

while game_running:
    current_x, current_y = player_pos
    # 输出当前位置信息
    print(f"\n当前位置:{location_desc.get((current_x, current_y), '未知区域')}")
    current_cell = game_map[current_x][current_y]
    if current_cell == MAP_CELL["FOOD"]:
        print("地面上有一块可以拾取的面包")

    # 读取玩家输入
    cmd = input(">> ").strip().lower()

    # 处理退出指令
    if cmd in QUIT_CMD:
        print("游戏结束,再见")
        game_running = False
        continue

    # 处理移动指令
    if cmd in DIRECTION_CMD:
        dx, dy = DIRECTION_CMD[cmd]
        new_x = current_x + dx
        new_y = current_y + dy
        # 边界+碰撞判断
        if 0 <= new_x < len(game_map) and 0 <= new_y < len(game_map[0]):
            target_cell = game_map[new_x][new_y]
            if target_cell == MAP_CELL["WALL"]:
                print("前面是墙,过不去")
            else:
                player_pos = [new_x, new_y]
                print("你移动到了新的区域")
        else:
            print("你走到了地图边界,无法继续前进")
        continue

    # 处理拾取指令
    if cmd in TAKE_CMD:
        if current_cell == MAP_CELL["FOOD"]:
            inventory.append("面包")
            # 拾取后把格子改成空白
            game_map[current_x][current_y] = MAP_CELL["EMPTY"]
            print("你捡起了面包放进背包")
            print(f"当前背包内容:{inventory}")
        else:
            print("这里没有可以拾取的物品")
        continue

    # 未知指令处理
    print("我听不懂你说的内容,试试输入n/s/e/w移动、take拾取、quit退出")

扩展方案

你之前写的if-else剧情可以直接绑定到特定坐标触发:比如当玩家走到(2,3)的后门位置时,自动弹出你原来写的「陌生人跑来要求进门」的剧情分支,不需要修改现有移动逻辑。
如果需要加更多内容,只需要给game_map的单元格新增数值定义即可:比如3代表NPC、4代表剧情机关,对应增加判断逻辑就能实现更多交互。

内容的提问来源于stack exchange,提问作者Robert McNeil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 02:06:05