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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 02:25:19