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

Pygame乒乓游戏精灵无法移动且退出报video system not initialized错误

问题修复方案

1. 精灵无法移动的问题

存在两处逻辑错误:

  • 混淆了event.type和event.key属性:KEYDOWN/KEYUP属于事件类型,存放在event.type中,具体按下的按键值存放在event.key里,原代码判断按键时仍然调用event.type,自然匹配不到任何按键。
  • 按键响应逻辑写反:应该是按键按下(KEYDOWN事件)时给移动速度赋值,按键松开(KEYUP事件)时将移动速度清零,原代码逻辑完全反转,无法触发移动。

2. 退出时报pygame.error: video system not initialized的问题

原代码在QUIT事件的处理逻辑里调用pygame.quit()后,没有立刻终止主循环,循环后续仍然会执行pygame.display.update(),此时pygame的视频系统已经被销毁,就会抛出该错误。需要把pygame.quit()放到主循环的外面,等所有逻辑执行完再调用。


修正后可正常运行的代码如下,额外增加了边界判断逻辑,避免球拍移出屏幕:

import pygame

# Initialization
pygame.init()
# Screen, Caption and Icon
width = 800
height = 600
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption('PyGame')
icon = pygame.image.load('ping-pong.png')
pygame.display.set_icon(icon)
# Create Rects
player = pygame.Rect((5, 230), (10, 120))
opponent = pygame.Rect((785, 230), (10, 120))
# Game Variables
playerY_change = 0
opponentY_change = 0

game_over = False
while not game_over:
    # Coloring the Screen
    screen.fill((27, 35, 43))
    # Draw Rects
    pygame.draw.rect(screen, (255,255,255), player)
    pygame.draw.rect(screen, (255,255,255), opponent)
    # Managing Events
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            game_over = True
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                opponentY_change -= 3
            if event.key == pygame.K_DOWN:
                opponentY_change += 3
            if event.key == pygame.K_w:
                playerY_change -= 3
            if event.key == pygame.K_s:
                playerY_change += 3
        if event.type == pygame.KEYUP:
            if (event.key == pygame.K_UP) or (event.key == pygame.K_DOWN):
                opponentY_change = 0
            if (event.key == pygame.K_w) or (event.key == pygame.K_s):
                playerY_change = 0

    # 边界判断
    if player.top <= 0:
        player.top = 0
    if player.bottom >= height:
        player.bottom = height
    if opponent.top <= 0:
        opponent.top = 0
    if opponent.bottom >= height:
        opponent.bottom = height

    # Moving my sprites
    player.y += playerY_change
    opponent.y += opponentY_change
    # Updating the screen on every iter of loop
    pygame.display.update()

# 主循环结束后再退出pygame
pygame.quit()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 23:45:03