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

Pygame双人PONG游戏使用keyboard模块控制球拍移动的问题咨询

问题根源

你遇到的两个问题完全是当前代码的输入处理逻辑错误导致的:

  • 你使用了第三方keyboard库的热键机制,本身受系统按键重复延迟设置影响,会出现按下后先卡一下再连续移动的问题;同时你把keyboard.add_hotkey放在了pygame事件循环内部,每轮循环都会重复注册热键,不仅额外占用资源,还会触发逻辑冲突导致多键同时按下无响应。
  • 你之前使用pygame.key.get_pressed()无法实现连续移动,是因为你没有把按键检测和坐标更新逻辑放在主循环的每帧执行路径上,大概率是写在了事件遍历的内部、仅在按键按下事件触发时执行一次。

修复方案

完全抛弃第三方keyboard库,使用pygame原生的按键状态检测机制,原生支持多键同时识别,无系统按键延迟问题,修复后代码如下:

import pygame
import os

chx = 0.051
chy = 0.051
# 两个球拍初始y坐标,可根据你的实际需求修改
y = 150
y1 = 150

pygame.init()
# 窗口尺寸对应你设定的y轴边界327,可自行调整
screen = pygame.display.set_mode((400, 360))

while True:
    # 处理基础事件
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            os.system("cls")
            pygame.quit()
            exit()
    
    # 每帧统一检测所有按键的实时状态,是连续移动的核心
    keys = pygame.key.get_pressed()
    # 左侧球拍W/S控制,同步做边界判断
    if keys[pygame.K_w] and y > 4:
        y -= chy
    if keys[pygame.K_s] and y < 327:
        y += chy
    # 右侧球拍上下方向键控制,同步做边界判断
    if keys[pygame.K_UP] and y1 > 4:
        y1 -= chy
    if keys[pygame.K_DOWN] and y1 < 327:
        y1 += chy

    # 以下为你的游戏绘制逻辑,可替换为你原有实现
    screen.fill((0,0,0))
    pygame.draw.rect(screen, (255,255,255), (10, y, 10, 50)) # 左侧球拍
    pygame.draw.rect(screen, (255,255,255), (380, y1, 10, 50)) # 右侧球拍
    pygame.display.flip()

修复逻辑说明

  • 每帧统一调用一次pygame.key.get_pressed()获取所有按键的实时状态,只要按键处于按下状态,每轮主循环都会更新对应球拍的坐标,实现平滑无延迟的连续移动。
  • 所有按键判断相互独立,同时按下W和向上箭头时两个球拍的移动逻辑都会触发,不存在多键冲突问题。
  • 边界判断直接和坐标更新写在一起,不需要额外定义多个操作全局变量的函数,逻辑更简洁清晰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 18:45:03