沣~ 2024-11-17 17:30 采纳率: 0%
浏览 22

运行蟒蛇书上的外星人入侵程序

谁帮我帮我看看哪里出问题了呀,为啥运行不了啊!
是缩进出问题了?
import sys
import pygame

import sys
import pygame


from settings import Settings 
from ship import Ship 

class AlienInvasion :
    """管理游戏资源和行为的类"""   
    def __init__(self) :
        """初始化游戏并创建游戏资源"""
        pygame.display.set_caption("Alien Invasion")
        self.bg_color = {230 , 230 , 230 , }#设置屏幕颜色
        pygame.init()
        self.clock = pygame.time.Clock()
        self.settings = Settings()

        self.screen = pygame.display.set_mode(
         (self.settings.screen_with, self.settings.screen_height)
    )


        self.screen = pygame.display.set_mode(( 1200 , 800 ))
        pygame.display.set_caption("Alien Invasion")
        self.ship = Ship(self)
    def run_game(self):
        """开始游戏的主循环"""
        self.screen.fill(self.setting.bg_color)
        while True :
            for event in pygame.event.get():
                if event.type == pygame.QUIT :
                 sys.exit()
            #每次循环时都会重新绘制平面
            self.screen.fill(self.setting.bg_color)
            self.screen.fill(self.bg_color)
            self.ship.blitme()
            #让最近绘制的屏幕可见
            pygame.display.flip()
            self.clock.tick(60)
            pygame.display.flip()
            self.clock.tick(60)


    while True:   
        #侦听键盘和鼠标事件                      
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()

                #让最近绘制的屏幕可见
                pygame.display.flip()
                
                
                
                
if __name__ == '__main__' :
    #创建游戏实例并运行游戏
    ai = AlienInvasion()
    ai.run_game()

\

这个是报错的提示
lifengjun@lifengjundeMacBook-Pro alien_invasion % /usr/local/bin/python3 "/Users/lifengjun/Visual Studio Code/alien_invasion/alien_invasion.py"
pygame 2.6.1 (SDL 2.28.4, Python 3.12.4)
Hello from the pygame community. https://www.pygame.org/contribute.html
Traceback (most recent call last):
  File "/Users/lifengjun/Visual Studio Code/alien_invasion/alien_invasion.py", line 46, in <module>
    for event in pygame.event.get():
                 ^^^^^^^^^^^^^^^^^^
pygame.error: video system not initialized

  • 写回答

1条回答 默认 最新

  • JavaPub-rodert 领域专家: 后端开发技术领域 2024-11-19 10:19
    关注

    本答案参考多次询问 ChatGPT-3.5 后选择的最佳回答,若是满意,还请采纳,谢谢。

    根据您提供的代码和错误信息,问题出在视频系统没有被正确初始化。错误信息指出 pygame.error: video system not initialized,这意味着在您尝试获取事件之前,pygame 的视频子系统没有被成功初始化。

    问题可能出在以下几个方面:

    1. pygame.init() 被调用了两次,这可能不是问题的原因,但通常我们只需要初始化一次。
    2. self.settingsself.setting 的使用不一致。您在代码中使用了 self.settings 来获取屏幕宽度和高度,但在 run_game 方法中,您尝试使用 self.setting.bg_color,这应该是一个拼写错误。

    以下是修改后的代码:

    import sys
    import pygame
    
    from settings import Settings 
    from ship import Ship 
    
    class AlienInvasion:
        """管理游戏资源和行为的类"""   
        def __init__(self):
            """初始化游戏并创建游戏资源"""
            pygame.init()  # 初始化pygame
            self.bg_color = (230, 230, 230)  # 设置屏幕颜色
            self.clock = pygame.time.Clock()
            self.settings = Settings()
    
            self.screen = pygame.display.set_mode(
                (self.settings.screen_width, self.settings.screen_height)
            )
            pygame.display.set_caption("Alien Invasion")
            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.bg_color)
                self.ship.blitme()
                # 让最近绘制的屏幕可见
                pygame.display.flip()
                self.clock.tick(60)
    
    if __name__ == '__main__':
        # 创建游戏实例并运行游戏
        ai = AlienInvasion()
        ai.run_game()
    

    请注意以下几点:

    • 确保 Settings 类中的 screen_widthscreen_height 属性是正确定义的。
    • 确保 Ship 类中的 blitme 方法是正确定义的,并且它不会引发任何错误。
    • 移除了多余的 pygame.display.set_mode() 调用和 self.settingsself.setting 的错误引用。
    • 移除了多余的 pygame.display.flip()self.clock.tick(60) 调用,因为它们应该只在每次循环的末尾调用一次。
    评论

报告相同问题?

问题事件

  • 创建了问题 11月17日