如何使用二维数组在类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
相关产品推荐
相关产品推荐

