python外星人入侵代码问题

完全跟着书上敲的代码,提示:AttributeError: 'AlienInvasion' object has no attribute '_check_events'

import sys
import pygame
from settings import Settings
from ship import Ship
class AlienInvasion:

def __init__(self):
    pygame.init()  #我们已经知道python有一个特殊的“工具包(模块)”叫pygame了。在我们要动手用
    #它完成我们的想法之前,电脑这个强迫症需要我们检查一遍,这个工具包是否完整,能否正常给我们
    #提供帮助。而这个检查的动作,就是pygame.init()
    self.settings=Settings()
    self.screen=pygame.display.set_mode((self.settings.screen_width,self.settings.screen_height))  #创建一个显示窗口  宽1200,高800
    pygame.display.set_caption("Alien Invasion")   #设置窗口的标题为 Alien Invasion
    self.ship=Ship(self)

def run_game(self):

    while True:
        self._check_events()
        self._update_screen()
        self.ship.updata()


        def _check_events(self):
            for event in pygame.event.get():  #事件循环
                if event.type==pygame.QUIT: #用户点击关闭窗口按钮,将使用exit()方法退出游戏
                    sys.exit()
                elif event.type==pygame.KEYDOWN:
                    if event.key==pygame.K_RIGHT:
                        self.ship.moving_right=True
                    elif event.key==pygame.K_LEFT:
                        self.ship.moving_left=True
              elif event.type==pygame.KEYUP:
                    if event.key==pygame.K_RIGHT:
                        self.ship.moving_right=False

                    elif event.key==pygame.K_LEFT:
                        self.ship.moving_left=False




        def _update_screen(self):
            self.screen.fill(self.settings.bg_color)  #每次循环时,都重绘屏幕 填充屏幕
            self.ship.blitme()   #调用blitme()方法
            pygame.display.flip()    #让最近的屏幕可见,刷新屏幕

if name=="main":
ai=AlienInvasion()
ai.run_game()

你把_check_events函数定义到while循环里面去了
这缩进,我也是服气

就是还不太理解,所有是懂非懂的看着书上敲得,不在主循环里也还是不行@

要把_check_events函数体拿出来,放在和 def run_game(self) 并列的等级

这篇文章:外星人入侵游戏--python实战 (附完整代码) 也许有你想要的答案,你可以看看