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

如何修复Python Pygame运行贪吃蛇游戏时仅显示黑屏的问题

Pygame贪吃蛇黑屏无响应修复方案

你的代码没有报错但黑屏、按键失效,是核心逻辑缩进错误、API调用错误导致的,具体问题和修复方案如下:

具体错误点

  • 核心逻辑位置错误:边界判断、坐标更新、画面绘制、帧率控制、屏幕刷新代码全部写在while not game_over主循环之外,主循环内没有任何绘制操作,导致持续黑屏
  • 事件处理缩进错误:方向键判断逻辑写在了if event.type == QUIT:的分支内部,只有点击关闭窗口时才会触发按键检测,所有操作无效
  • 背景填充API调用错误:使用game_display.blit(black)填充背景,正确方法应为game_display.fill(black)
  • 方向逻辑错误:向上移动对应y轴坐标减小,你写的y_speed = snake_size会导致按向上键时蛇向下移动,且缺失向下方向的按键检测
  • 游戏结束逻辑错误:两次判断按下K_1的逻辑冲突,且QUIT事件判断缩进错误,无法正常关闭窗口

修复后完整代码

注意:请确保你已经提前完成pygame初始化、窗口创建、字体初始化、颜色/常量定义等前置代码编写

def print_score(score):
    text = score_font.render(f"Score: {score}", True, orange)
    game_display.blit(text, [0, 0])

def draw_snake(snake_size, snake_pixels):
    for pixel in snake_pixels:
        pygame.draw.rect(game_display, white, [pixel[0], pixel[1], snake_size, snake_size])

def run_game():
    game_over = False
    game_close = False

    x = width / 2
    y = height / 2

    x_speed = 0
    y_speed = 0

    snake_pixels = []
    snake_length = 1

    target_x = round(random.randrange(0, width-snake_size) / 10.0) * 10.0
    target_y = round(random.randrange(0, height-snake_size) / 10.0) * 10.0

    while not game_over:

        while game_close:
            game_display.fill(black)
            game_over_msg = message_font.render("Game Over! 按Q退出 按R重新开始", True, red)
            game_display.blit(game_over_msg, [width / 6, height / 3])
            print_score(snake_length - 1)
            pygame.display.update()

            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_q:
                        game_over = True
                        game_close = False
                    if event.key == pygame.K_r:
                        run_game()
                if event.type == pygame.QUIT:
                    game_over = True
                    game_close = False

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                game_over = True
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT and x_speed == 0:
                    x_speed = -snake_size
                    y_speed = 0
                if event.key == pygame.K_RIGHT and x_speed == 0:
                    x_speed = snake_size
                    y_speed = 0
                if event.key == pygame.K_UP and y_speed == 0:
                    x_speed = 0
                    y_speed = -snake_size
                if event.key == pygame.K_DOWN and y_speed == 0:
                    x_speed = 0
                    y_speed = snake_size

        if x >= width or x < 0 or y >= height or y < 0:
            game_close = True

        x += x_speed
        y += y_speed

        game_display.fill(black)
        pygame.draw.rect(game_display, orange, [target_x, target_y, snake_size, snake_size])
        snake_pixels.append([x, y])

        if len(snake_pixels) > snake_length:
            del snake_pixels[0]

        for pixel in snake_pixels[:-1]:
            if pixel == [x, y]:
                game_close = True

        draw_snake(snake_size, snake_pixels)
        print_score(snake_length - 1)

        pygame.display.update()

        if x == target_x and y == target_y:
            target_x = round(random.randrange(0, width-snake_size) / 10.0) * 10.0
            target_y = round(random.randrange(0, height-snake_size) / 10.0) * 10.0
            snake_length += 1

        clock.tick(snake_speed)

    pygame.quit()
    quit()

run_game()

内容的提问来源于stack exchange,提问作者Kirito-Kun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 11:45:01