py教材里pygame外星人游戏无法正确运行

这个是主程序
import pygame
from settings import Settings
from ship import Ship
import game_function as gf
def run_game():
    pygame.init()                           
    ai_settings = Settings()
    screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height))
    pygame.display.set_caption("Allien Invasion")
    ship = Ship(screen)
    while True:
        gf.check_events(ship)
        ship.update()
        gf.update_screen(ai_settings,screen,ship)
run_game()

game_function.py
import sys
import pygame
def check_events(ship):
    for event in pygame.event.get():
        if event == pygame.QUIT:
            sys.exit()
        elif event.type == pygame.KEYDOWN:#event.get():获取每一次事件,event的属性type,如果是键盘输入KEYDOWN
            if event.key == pygame.K_RIGHT:#方向右键-->
                #ship.rect.centerx += 1#这里用到了形参ship,所以要在函数的括号内加上形参ship
                ship.moving_right == True
            elif event.key == pygame.K_LEFT:
                ship.moving_left == True
        elif event.type == pygame.KEYUP:#抬起键盘
            if event.key == pygame.K_RIGHT:
                ship.moving_right == False
            elif event.key == pygame.K_LEFT:
                ship.moving_left == False


def update_screen(ai_settings,screen,ship):
    screen.fill(ai_settings.bg_color)
    ship.blitme()       
    pygame.display.flip()

ship.py

import pygame
class Ship():
    def __init__(self,screen):
        self.screen = screen
        self.image = pygame.image.load('images/ship.png')#加载图片
        self.rect = self.image.get_rect()   #获取surface的rect属性
        self.screen_rect = screen.get_rect()

        self.rect.centerx = self.screen_rect.centerx#设置rect的位置
        self.rect.bottom = self.screen_rect.bottom
        '''center top bottom left right属性 加上xy坐标可实现位置的设置
        注意:左上角的坐标为(0,0),往右下增大'''
        self.moving_right = False
        self.moving_left = False
    
    def update(self):
        if self.moving_right == True:
            self.rect.centerx += 1
        elif self.moving_left == True:
            self.rect.centerx -= 1

    def blitme(self):
        self.screen.blit(self.image,self.rect)
        #c.blit(a,b)根据指定位置将a:image按照b:rect的位置(相当于粘贴覆盖)绘制到c:screen上,即显示出来

这个是《从入门到实践》的第一个例子,然后目前就是让飞船通过键盘左右移动。可是并不成功。

一个是不能通过右上的叉关闭。一开始是可以的,就是把 if event.type == pygame.QUIT: sys.exit() 写在主程序里的时候,后来放在function里面再导入就不能用了
还有就是左右移动的功能也根本不能用,而且有时候按左右方向键还会闪退。
我对比了一下,代码应该没有错呀,pygame也是安装好了,可以看到那个飞碟,实在不知道是什么问题了。

按叉关闭的问题加一句pygame.quit
由于先更新了屏幕后更新位置导致显示不出来

game_function.py改为:

import sys
import pygame
def check_events(ship):
    for event in pygame.event.get():
        if event == pygame.QUIT:
            pygame.quit()
            sys.exit(0)
        elif event.type == pygame.KEYDOWN:#event.get():获取每一次事件,event的属性type,如果是键盘输入KEYDOWN
            if event.key == pygame.K_RIGHT:#方向右键-->
                #ship.rect.centerx += 1#这里用到了形参ship,所以要在函数的括号内加上形参ship
                ship.moving_right == True
            elif event.key == pygame.K_LEFT:
                ship.moving_left == True
        elif event.type == pygame.KEYUP:#抬起键盘
            if event.key == pygame.K_RIGHT:
                ship.moving_right == False
            elif event.key == pygame.K_LEFT:
                ship.moving_left == False
 
 
def update_screen(ai_settings,screen,ship):
    screen.fill(ai_settings.bg_color)
    ship.blitme()       

然后ship.py改为:

import pygame
class Ship():
    def __init__(self,screen):
        self.screen = screen
        self.image = pygame.image.load('images/ship.png')#加载图片
        self.rect = self.image.get_rect()   #获取surface的rect属性
        self.screen_rect = screen.get_rect()
 
        self.rect.centerx = self.screen_rect.centerx#设置rect的位置
        self.rect.bottom = self.screen_rect.bottom
        '''center top bottom left right属性 加上xy坐标可实现位置的设置
        注意:左上角的坐标为(0,0),往右下增大'''
        self.moving_right = False
        self.moving_left = False
    
    def update(self):
        if self.moving_right == True:
            self.rect.centerx += 1
            pygame.display.update()
        elif self.moving_left == True:
            self.rect.centerx -= 1
            pygame.display.update()
 
    def blitme(self):
        self.screen.blit(self.image,self.rect)