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

Python Curses程序重复按键时运行加速问题的解决咨询

问题根源

你的游戏循环执行速度完全依赖getch()的返回时机:当按住按键时,系统会持续发送重复按键事件,getch()会立刻返回,导致循环高频执行;而敌人/NPC的移动逻辑如果是每次循环执行一次,自然会跟着加速。

解决方案

核心思路是将输入处理与游戏逻辑更新解耦,固定游戏帧率,确保敌人/NPC的移动速度不受输入频率影响。

具体实现步骤

  1. 改用nodelay(True)替代timeout(),让getch()变为纯非阻塞模式,有输入时返回键值,无输入时立刻返回-1。
  2. 引入固定帧率控制,用时间戳确保游戏逻辑(玩家移动、敌人行为等)每固定间隔执行一次,和输入频率无关。
  3. 用状态变量记录当前按住的方向,避免重复处理同一按键事件。

修改后的代码示例

import time

# 初始化时设置非阻塞输入,替代原timeout
screen.nodelay(True)
# 设定固定帧率,比如每秒30帧,每帧间隔约33毫秒
FRAME_INTERVAL = 1 / 30
last_update_time = time.time()

# 记录当前按住的方向,实现按住移动且避免重复触发
current_dir = None

while run:
    now = time.time()
    time_since_last_update = now - last_update_time

    # 处理输入
    key = screen.getch()
    if key != -1:
        if key == curses.KEY_UP:
            current_dir = "UP"
        elif key == curses.KEY_DOWN:
            current_dir = "DOWN"
        elif key == curses.KEY_LEFT:
            current_dir = "LEFT"
        elif key == curses.KEY_RIGHT:
            current_dir = "RIGHT"
        elif key == ord('q'):  # 按q退出
            run = False
    # 无输入时保持当前方向(如果需要按住移动的话)

    # 到达帧间隔时,执行游戏逻辑与画面更新
    if time_since_last_update >= FRAME_INTERVAL:
        # 处理玩家移动
        if current_dir == "UP":
            player.xy["y"] -= 1
        elif current_dir == "DOWN":
            player.xy["y"] += 1
        elif current_dir == "LEFT":
            player.xy["x"] -= 1
        elif current_dir == "RIGHT":
            player.xy["x"] += 1

        # 在这里执行敌人/NPC的移动逻辑
        # enemy.move()
        # npc.behave()

        # 更新画面
        screen.clear()
        print_map()
        screen.refresh()

        # 更新上次逻辑更新的时间戳
        last_update_time = now

    # 短暂休眠,降低CPU占用
    time.sleep(0.001)

关键说明

  • nodelay(True):彻底摆脱输入对循环速度的束缚,循环可以自主控制节奏。
  • 固定帧率:无论输入是否频繁,敌人/NPC的移动逻辑都按固定间隔执行,速度完全可控。
  • 方向状态变量:既实现了按住移动的操作体验,又不会因为系统的按键重复事件导致多次触发移动。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 17:09:46