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

使用Pygame编写的贪吃蛇游戏无法运行问题求助

问题原因
  • 核心问题:run方法未被实际执行,代码末尾的Game.run只是引用了方法对象,没有添加括号调用函数,游戏主循环完全没有启动,程序初始化后直接结束运行,自然没有任何窗口响应。
  • 逻辑缺陷:pygame.display.flip()被放在事件遍历的for循环内部,只有当触发键鼠、窗口操作等事件时才会执行画面刷新,无事件触发时画面不会更新。
  • 潜在问题:未做帧率控制,后续蛇移动时速度会不可控;如果项目目录下不存在BLOCK.png资源,程序会直接抛出文件不存在异常崩溃。
修复方案

按以下步骤修改代码即可正常运行:

  1. 将最后一行的Game.run改为Game.run(),正确启动主循环
  2. 把run方法内的pygame.display.flip()移动到for事件循环外部,和事件遍历同级,确保每次主循环都刷新画面
  3. 新增pygame时钟控制帧率,限制游戏运行速度
  4. 若没有BLOCK.png资源,可以用pygame绘制方块替代图片资源

修正后的完整代码如下:

import pygame
from pygame.locals import *

class Snake:
    def __init__(self, parent_screen):
        self.parent_screen = parent_screen
        # 没有对应图片可直接用Surface绘制方块,无需加载外部资源
        # self.block = pygame.image.load("BLOCK.png")
        self.block = pygame.Surface((10,10))
        self.block.fill("Black")
        self.x = 100
        self.y = 100
    
    def draw(self):
        self.parent_screen.fill("White")
        self.parent_screen.blit(self.block, (self.x,self.y))

    def move_up(self):
        self.y -= 10
        self.draw()

    def move_down(self):
        self.y += 10
        self.draw()

    def move_right(self):
        self.x += 10
        self.draw()

    def move_left(self):
        self.x -= 10
        self.draw()    

class Game:
    def __init__(self):
        pygame.init()
        self.screen = pygame.display.set_mode((500,500))
        self.clock = pygame.time.Clock()
        self.screen.fill("White")
        self.snake = Snake(self.screen)
        self.snake.draw()
        

    def run(self):
        game_on = True
        while game_on:
            for event in pygame.event.get():
                if event.type == KEYDOWN:
                    if event.key == K_w:
                        self.snake.move_up()
                    elif event.key == K_s:
                        self.snake.move_down()
                    elif event.key == K_a:
                        self.snake.move_left()
                    elif event.key == K_d:
                        self.snake.move_right()
                elif event.type == QUIT:
                    game_on = False
            # 刷新逻辑移到事件循环外
            pygame.display.flip()
            # 限制帧率为30,避免移动速度过快
            self.clock.tick(30)
        pygame.quit()


if __name__ == "__main__":
    game = Game()
    game.run()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 18:15:04