NetHack风格游戏角色楼层上下移动功能实现技术问询
实现NetHack风格游戏的楼层切换功能
以下是修改后的完整代码,已实现上下楼层移动功能,同时优化了原代码的效率问题:
import random from pynput.keyboard import Key, Listener import time import os clear = lambda: os.system('cls') # 初始化所有楼层,用列表乘法简化重复代码 floor1 = ["_"] * 20 floor2 = ["_"] * 20 floor3 = ["_"] * 20 floor4 = ["_"] * 20 floor5 = ["_"] * 20 # 将楼层存入统一列表,方便通过索引快速访问 floors = [floor1, floor2, floor3, floor4, floor5] char = "0" space_amount = len(floor1) # 初始化角色状态:默认在第一层随机位置 current_floor_idx = 0 current_pos = random.randint(0, space_amount - 1) floors[current_floor_idx][current_pos] = char def draw_floors(): for floor in floors: print("".join(floor)) draw_floors() def on_release(key): global current_floor_idx, current_pos if 'char' in dir(key): # 处理左右移动 if key.char == "a": new_pos = current_pos - 1 if new_pos >= 0: time.sleep(0.1) floors[current_floor_idx][current_pos] = "_" current_pos = new_pos floors[current_floor_idx][current_pos] = char clear() draw_floors() elif key.char == "d": new_pos = current_pos + 1 if new_pos < space_amount: time.sleep(0.1) floors[current_floor_idx][current_pos] = "_" current_pos = new_pos floors[current_floor_idx][current_pos] = char clear() draw_floors() # 处理上下楼层切换 elif key == Key.up: if current_floor_idx > 0: time.sleep(0.1) # 清除当前楼层的角色标记 floors[current_floor_idx][current_pos] = "_" current_floor_idx -= 1 # 在目标楼层的相同位置放置角色 floors[current_floor_idx][current_pos] = char clear() draw_floors() elif key == Key.down: if current_floor_idx < len(floors) - 1: time.sleep(0.1) floors[current_floor_idx][current_pos] = "_" current_floor_idx += 1 floors[current_floor_idx][current_pos] = char clear() draw_floors() # 按ESC退出游戏 elif key == Key.esc: return False with Listener(on_release=on_release) as listener: listener.join()
关键改动说明
- 状态跟踪优化:新增
current_floor_idx记录当前楼层索引,current_pos记录角色在当前层的位置,避免每次调用index()查找角色位置,提升运行效率 - 楼层管理简化:将所有楼层存入
floors列表,通过索引直接访问对应楼层,避免重复处理单个floor变量 - 上下楼层逻辑:
- 按下上箭头时,若当前不是最顶层,将角色从当前楼层移除,切换到上一层并在相同位置放置角色
- 按下下箭头时,若当前不是最底层,执行类似的楼层切换逻辑
- 边界限制:左右移动限制在楼层的有效索引范围内,上下楼层限制在1-5层之间,防止越界
- 代码精简:用列表乘法初始化楼层,复用绘制逻辑,减少冗余代码
内容的提问来源于stack exchange,提问作者Donté Stewart
相关产品推荐
相关产品推荐

