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

Pygame开发太空侵略者游戏:窗口弹出后立即关闭问题求助

解决太空侵略者游戏窗口弹出即关闭的问题

以下是导致问题的核心错误及修复方案:

  • 语法错误触发程序终止:Ship类的draw方法最后多了一个多余的x,这会直接引发语法错误,导致程序运行到此处立刻终止,窗口随之关闭。
    修复:删除pygame.draw.rect(window, (255,0,0), (self.x, self.y, 50, 50))末尾的x。

  • 事件处理逻辑位置错误:处理窗口关闭事件的循环写在了主游戏循环while run的外面,导致游戏循环内无法响应退出操作;若修复语法错误后,游戏会进入死循环,无法正常关闭。
    修复:将事件处理代码移到while run循环内部。

  • 画面刷新机制缺失:redraw_window函数内没有调用pygame.display.update(),绘制的内容无法显示到窗口;原代码中仅在函数外执行了一次刷新,无法实时更新画面。
    修复:在redraw_window函数末尾添加pygame.display.update(),并删除函数外的刷新语句。

  • 额外优化:原代码中玩家飞船图片覆盖了RED_SPACE_SHIP变量,建议重命名为PLAYER_SHIP,避免后续使用红色敌人飞船时出错。


修复后的完整代码

import pygame
import os
import time
import random
pygame.font.init()

WIDTH, HEIGHT = 750, 750 
WIN = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Space Invaders")

# Load Enemy Ships
RED_SPACE_SHIP = pygame.image.load(os.path.join("assets", "pixel_ship_red_small.png"))
GREEN_SPACE_SHIP = pygame.image.load(os.path.join("assets", "pixel_ship_green_small.png"))
BLUE_SPACE_SHIP = pygame.image.load(os.path.join("assets", "pixel_ship_blue_small.png"))

# Player Ship
PLAYER_SHIP = pygame.image.load(os.path.join("assets", "pixel_ship_yellow.png"))

# Lasers
RED_LASER = pygame.image.load(os.path.join("assets", "pixel_laser_red.png"))
GREEN_LASER = pygame.image.load(os.path.join("assets", "pixel_laser_green.png"))
BLUE_LASER = pygame.image.load(os.path.join("assets", "pixel_laser_blue.png"))
YELLOW_LASER = pygame.image.load(os.path.join("assets", "pixel_laser_yellow.png"))

# Background
BG = pygame.transform.scale(pygame.image.load(os.path.join("assets", "background-black.png")), (WIDTH, HEIGHT))


class Ship:
    def __init__(self, x, y, health = 100):
        self.x = x
        self.y = y    
        self.health = health
        self.ship_img = None
        self.laser_img = None
        self.lasers = []
        self.cool_down_counter = 0

    def draw(self, window):
        pygame.draw.rect(window, (255,0,0), (self.x, self.y, 50, 50))


def main():
    run = True
    FPS = 60
    level = 1
    lives = 5
    main_font = pygame.font.SysFont("comicsans", 50)

    ship = Ship(300, 650)

    clock = pygame.time.Clock()

    def redraw_window():
        WIN.blit(BG, (0,0))    
        # Draw text
        lives_label = main_font.render(f"Lives: {lives}", 1, (255,255,255))
        level_label = main_font.render(f"Level: {level}", 1, (255,255,255))

        WIN.blit(lives_label, (10, 10))
        WIN.blit(level_label,(WIDTH - level_label.get_width() - 10, 10))

        ship.draw(WIN)
        pygame.display.update()

    while run:
        clock.tick(FPS)
        redraw_window()

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False
    pygame.quit()
main()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 07:25:40