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

学习《Python Crash Course》开发Alien Invasion时遇报错求助

问题分析与解决

错误原因

你的问题核心是主程序创建Ship实例时传入的参数类型不匹配:

  1. 初始报错NameError: name 'screen' is not defined:主程序中self.ship = Ship(screen)里的screen未定义,应使用类实例属性self.screen,但这只是第一步。
  2. 修改后出现AttributeError: 'pygame.surface.Surface' object has no attribute 'screen':你的Ship类构造函数需要接收AlienInvasion类的实例(游戏主对象),而非直接传入pygame的Surface屏幕对象。

修复步骤

步骤1:修改主程序创建Ship的代码

在AlienInvasion类的__init__方法里,把:

self.ship = Ship(screen)

改成:

self.ship = Ship(self)

这里的self就是当前AlienInvasion的实例,完全符合Ship类构造函数的参数要求。

步骤2:确认Ship类代码无需修改

你的Ship类代码逻辑正确,它的构造函数接收ai_game(即AlienInvasion实例),再通过ai_game.screen获取屏幕对象,和修改后的主程序参数完全匹配。

修改后的完整主程序代码

import sys

import pygame

from settings import Settings

from ship import Ship


class AlienInvasion:

    def __init__(self):
        """初始化Pygame模块并设置游戏窗口"""
        pygame.init()
        self.settings = Settings()

        self.screen = pygame.display.set_mode(
            (self.settings.screen_width, self.settings.screen_height)
        )
        pygame.display.set_caption("Alien Invasion")

        # 修改此处,传入AlienInvasion实例self
        self.ship = Ship(self)

    def run_game(self):
        while True:
            # 监听键盘和鼠标事件
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    sys.exit()
            # 每次循环重绘屏幕
            self.screen.fill(self.settings.bg_color)
            self.ship.blitme()
            # 显示最后绘制的屏幕
            pygame.display.flip()


if __name__ == "__main__":
    # 创建实例并运行游戏
    ai = AlienInvasion()
    ai.run_game()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 09:44:58