学习《Python Crash Course》开发Alien Invasion时遇报错求助
问题分析与解决
错误原因
你的问题核心是主程序创建Ship实例时传入的参数类型不匹配:
- 初始报错
NameError: name 'screen' is not defined:主程序中self.ship = Ship(screen)里的screen未定义,应使用类实例属性self.screen,但这只是第一步。 - 修改后出现
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
相关产品推荐
相关产品推荐

