【Python】【pygame】游戏:外星人入侵

    技术2026-08-30  24

    安装Pygame

    Pygame是一组功能强大的模块,可用于管理图形、动画、声音。 在windows安装:就很简单,在cmd命令窗先看有没有pip,然后直接输入命令安装

    Pygame最常用的15个模块详解 pygame—精灵

    项目

    一个可以上下左右移动的飞船,三次机会,按键开始。失败以后显示开始按键。记录分数,提高难度,显示等级,显示最高分。

    用了五天,磕磕绊绊码完了,啊,好难。 文件压缩在我的资源里。

    涉及的函数

    函数模板解释实例pygame.init()初始化背景设置pygame.init()pygame.display.set_mode()根据元组参数(长,高)创建屏幕screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))pygame.display.set_caption()根据字符串参数创建标题pygame.display.set_caption(“Alien Invasion”)pygame.display.flip()让最近绘制的屏幕可见pygame.display.flip()pygame.event.get()访问pygame检测到的时间for event in pygame.event.get()pygame.KEYDOWN/pygame.KEYUP/pygame.QUIT按键、松开、退出if event.type == pygame.QUITpygame_K_UP/pygame_K_1/pygame_K_XX表示按键if event.key == pygame.K_UPsys.exit()退出程序sys.exit()screen.fill()根据提供的RGB值[元组(红,绿,蓝)]颜色填充屏幕screen.fill(ai_settings.bg_color)pygame.image.load()返回一个表示图像的surfaceself.star_image = pygame.image.load(‘image/kiki.bmp’)get_rect()获取surface的属性rect,Rect 是用于存储矩形坐标的Pygame对象self.rect = self.image.get_rect()pygame.rect()从空白开始创建一个矩形,需要提供x/y坐标、矩形长/宽self.rect = pygame.Rect(0, 0, ai_settings.bullet_width, ai_settings.bullet_height)rect.x ;rect.width;rect.y ;rect.height;以及属性center/centerx/centery/top/bottom/left/right矩形对象的左上角坐标(x,y)self.rect.x = self.rect.widthpygame.draw.rect()根据提供的屏幕,颜色,矩形,填充所占的屏幕比pygame.draw.rect(self.screen, self.color, self.rect)aliens.draw()对编组调用draw(),pygame自动绘制编组的每个元素,位置由rect属性决定aliens.draw(screen)screen.blit()对surface对象调用bilit(),根据提供的图片,形状绘制屏幕self.screen.blit(self.image,self.rect)Group()返回pygame.sprite.Group的一个实例,类似于列表/编组aliens = Group()bullets.sprites()返回一个列表,包含编组中的所有精灵for bullet in bullets.sprites()pygame.sprite.groupcollide(group1,group2,dokill1,dokill2,collided=None)比较两个编组的rect属性,返回一个字典,包括发生碰撞的。键是Group1,相应的值是击中的Group2。实数True表示发生碰撞就删除。collisions = pygame.sprite.groupcollide(bullets, aliens, True, True)pygame.sprite.spritecollide(sprite,group,dokill1,collided=None)接受一个精灵和一个编组,检查是否有编组成员与精灵碰撞,True将移除成员。碰撞后停止遍历编组并返回第一个碰撞的成员iif pygame.sprite.spritecollide(ship, aliens, False)pygame.sprite.collide_rect(first, second)精灵与精灵empty()清空编组bullets.empty()pygame.font.SysFont()从字库系统中创建一个Font对象,两个参数:字体、字号self.font = pygame.font.SysFont(None, 48)pygame.font.Font.render()在一个新的Surface对象上绘制文本,接收‘文字/布尔/文字色/背景色’,背景色默认透明。self.msg_image = self.front.render(msg, True, self.text_color, self.button_color)pygame.mouse.get_pos()返回一个元组,包含单击鼠标时的x/y坐标mouse_x, mouse_y = pygame.mouse.get_pos() # 返回一个元组,包含单击鼠标时的x/y坐标rect.collidepoint(x,y)检测坐标是否在rect图形内if play_button.rect.collidepoint(mouse_x, mouse_y)pygame.mouse.set_visible(False)隐藏光标pygame.mouse.set_visible(False)round()返回一个浮点数,将小数精确到小数点后多少位,小数点位数由第二个实参指定。第二实参为负,表示10的整倍数rounded_score = int(round(self.stats.score, -1))

    alien_invasion.py

    ''' 游戏主程序: 一个可以上下左右移动的飞船、向右移动碰到墙壁会下移并转向的外星人、 限制数量的子弹。 子弹碰到外星人,外星人死;外星人碰到飞船重新开始 ''' import pygame # 提供游戏开发功能 from setting import Settings # 存储游戏设置的类 from ship import Ship # 存储飞船设置的类 import game_functions as gf # 存储游戏函数的模块 from pygame.sprite import Group # 类似一个列表,有助于开发游戏额外的功能 from game_stats import GameStats # 一个统计游戏信息的类 from button import Button # 一个按键信息的类 from scoreboard import Scoreboard # 一个记分牌类 # 游戏主程序 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("Alien Invasion") # 创建相关对象 ship=Ship(ai_settings,screen) # 创建一艘飞船 bullets = Group() # 创建实例,一堆子弹 aliens = Group() # 创建一堆外星人 gf.create_fleet(ai_settings, screen, ship, aliens) # 创建外星人群 stats = GameStats(ai_settings) # 跟踪游戏统计对象 play_button = Button(ai_settings, screen, "PLAY") # 开始按键 scoreboard = Scoreboard(ai_settings, screen, stats) # 一个记分牌 # 游戏的主循环 while True: gf.check_events(ai_settings, screen, stats, scoreboard, play_button, ship, aliens, bullets) # 检测鼠标键盘有无退出 if stats.game_active: # 游戏进行 gf.update_ship(ship) # 更新飞船移动信息 gf.update_bullets(ai_settings, screen, stats, scoreboard, ship, aliens, bullets) # 更新子弹位置 gf.update_aliens(ai_settings, screen, stats, scoreboard, ship, aliens, bullets) # 更新外星人移动信息 gf.update_screen(ai_settings, screen, stats, scoreboard, ship, aliens, bullets, play_button) # 刷新屏幕 run_game()

    game_functions.py

    ''' 包含一系列函数,完成游戏的大部分工作 ''' import sys # 玩家退出游戏时,使用sys退出游戏 import pygame from random import randint # 随机数 from time import sleep # 时间停止函数 from bullet import Bullet # 子弹类 from alien import Alien # 外星人类 # 按键功能设置 def check_keydown_events(event, ai_settings, screen, ship, bullets): # 响应按键 if event.key == pygame.K_RIGHT: # 按下右键 ship.moving_right = True # 飞船持续右移 if event.key == pygame.K_LEFT: # 左 ship.moving_left = True if event.key == pygame.K_UP: # 上 ship.moving_up = True if event.key == pygame.K_DOWN: # 下 ship.moving_down = True if event.key == pygame.K_SPACE: # 空格,发子弹 fire_bullet(ai_settings, screen, ship, bullets) if event.key == pygame.K_q: #'q'退出游戏 sys.exit() # 响应松开按键 def check_keyup_events(event,ship): if event.key == pygame.K_RIGHT: # 右键 ship.moving_right = False # 飞船停止右移 if event.key == pygame.K_LEFT: # 左 ship.moving_left = False if event.key == pygame.K_UP: # 上 ship.moving_up = False if event.key == pygame.K_DOWN: # 下 ship.moving_down = False # 响应按键和鼠标事件 def check_events(ai_settings, screen, stats, scoreboard, play_button, ship, aliens, bullets): for event in pygame.event.get(): # 检测事件(鼠标和键盘的移动) if event.type == pygame.QUIT: # 检测到游戏关闭事件 sys.exit() elif event.type == pygame.KEYDOWN: # 按键 check_keydown_events(event, ai_settings, screen, ship, bullets) elif event.type==pygame.KEYUP:#松开按键 check_keyup_events(event,ship) elif event.type == pygame.MOUSEBUTTONDOWN: # 鼠标按键 mouse_x, mouse_y = pygame.mouse.get_pos() # 返回一个元组,包含单击鼠标时的x/y坐标 check_play_button(ai_settings, screen, stats, scoreboard, play_button, ship, aliens, bullets, mouse_x, mouse_y) # 鼠标按键操作 def check_play_button(ai_settings, screen, stats, scoreboard, play_button, ship, aliens, bullets, mouse_x, mouse_y): button_clicked = play_button.rect.collidepoint(mouse_x, mouse_y) # 检测坐标是否在rect图形内 if button_clicked and not stats.game_active: ai_settings.initialize_dynamic_settings() # 重置速度 pygame.mouse.set_visible(False) # 游戏开始,隐藏光标 stats.reset_stats() # 重置游戏统计信息 stats.game_active = True # 重置记分牌图像 scoreboard.prep_score() scoreboard.prep_high_score() scoreboard.prep_level() scoreboard.prep_ship() # 清空 aliens.empty() bullets.empty() # 创建 create_fleet(ai_settings, screen, ship, aliens) ship.center_ship() # 发射子弹 def fire_bullet(ai_settings, screen, ship, bullets): if len(bullets) < ai_settings.bullet_allowed: # 限制最大子弹数目 new_bullet = Bullet(ai_settings, screen, ship) # 创建一颗子弹 bullets.add(new_bullet) # 加入到编组中 # 更新屏幕图像 def update_screen(ai_settings, screen, stats, scoreboard, ship, aliens, bullets, play_button): '''填充图片 back = pygame.image.load('images/back.bmp') screen.blit(back,(0,0)) ''' screen.fill(ai_settings.bg_color) # 用背景色填充 for bullet in bullets.sprites(): # 返回一个列表,其中包含编组bullects中全部的精灵 bullet.draw_bullet() # 先绘制子弹,可以绘制在下面 ship.blitme() # 绘制飞船 aliens.draw(screen) # 绘制外星人群。自动绘制编组的每个元素,位置由rect决定 scoreboard.show_score() # 显示分数 if not stats.game_active: # 游戏未开始 play_button.draw_button() # 显示play按钮 pygame.display.flip() # 让最近绘制的屏幕可见 # 更新飞船位置信息 def update_ship(ship): ship.update() # 更新子弹位置 def update_bullets(ai_settings, screen, stats, scoreboard,ship, aliens, bullets): bullets.update() # 更新子弹移动信息 # 删除溢出屏幕的子弹,减少内存消耗 for bullet in bullets.copy(): # 不应从列表或者编组中删除条目,因此必须遍历副本 if bullet.rect.bottom <= 0: # y坐标为复数且越来越小 bullets.remove(bullet) # print("目前还有子弹:",len(bullets)) # 显示当前还有多少子弹 # 检查是否有子弹击中了外星人并更新外星人 check_bullet_alien_collisions(ai_settings, screen, stats, scoreboard, ship, aliens, bullets) # 外星人撞上飞船 def ship_hit(ai_settings, screen, stats, scoreboard, ship, aliens, bullets): if stats.ship_left > 0: # 还有剩余飞船 stats.ship_left -= 1 # 飞船数量 # 更新记分牌 scoreboard.prep_ship() # 清空 aliens.empty() bullets.empty() # 重新创建 create_fleet(ai_settings, screen, ship, aliens) ship.center_ship() sleep(0.5) else: # 游戏结束 stats.game_active = False pygame.mouse.set_visible(True) # 游戏结束,光标可见 # 外星人到底,重新开始 def check_aliens_bottom(ai_settings, screen, stats, scoreboard, ship, aliens, bullets): screen_rect = screen.get_rect() for alien in aliens.sprites(): if alien.rect.bottom >= screen_rect.bottom: # 外星人到达屏幕底端 ship_hit(ai_settings, screen, stats, scoreboard, ship, aliens, bullets) break # 更新外星人移动 def update_aliens(ai_settings, screen, stats, scoreboard, ship, aliens, bullets): # 检测是否有外星人碰到屏幕边缘 check_fleet_edges(ai_settings, aliens) aliens.update() # 检测外星人和飞船之间的碰撞 if pygame.sprite.spritecollide(ship, aliens, True): # 检测精灵和编组是否碰撞 ship_hit(ai_settings, screen,stats, scoreboard, ship, aliens, bullets) # 检查是否有外星人到达底端 check_aliens_bottom(ai_settings, screen, stats, scoreboard, ship, aliens, bullets) # 计算并返回每行可容纳外星人个数 def get_number_aliens_x(ai_settings, alien_width): availible_space_x = ai_settings.screen_width - 2 * alien_width # 屏幕可容纳外星人的宽度 number_alien_x = int(availible_space_x / 2 / alien_width) # 屏幕允许的外星人数量 return number_alien_x # 计算并返回一共可以容纳多少行外星人 def get_number_alien_y(ai_settings, ship_height, alien_height): availible_space_y = ai_settings.screen_height - 3 * alien_height - ship_height number_alien_y = int(availible_space_y / 2 / alien_height) return number_alien_y # 创建一个外星人 def create_alien(ai_settings, screen, aliens, alien_number_x, alien_number_y): alien = Alien(ai_settings, screen) alien_width = alien.rect.width # 计算一个外星人的宽度 alien.x = alien_width + 2 * alien_width * alien_number_x + randint(-10,10) alien.rect.x = alien.x alien.rect.y = alien.rect.height + 2*alien.rect.height*alien_number_y + randint(-10,10) aliens.add(alien) # 创建外星人群 def create_fleet(ai_settings, screen, ship, aliens): alien = Alien(ai_settings, screen) number_alien_x = get_number_aliens_x(ai_settings, alien.rect.width) number_alien_y = get_number_alien_y(ai_settings, ship.rect.height, alien.rect.height) for row in range(number_alien_y): # 逐个创建外星人 for alien_number in range(number_alien_x): create_alien(ai_settings, screen, aliens, alien_number, row) # 有外星人到达边界 def check_fleet_edges(ai_settings, aliens): for alien in aliens.sprites(): # 精灵组 if alien.check_edges(): change_fleet_direction(ai_settings, aliens) break # 调整外星人向下一行并改变方向 def change_fleet_direction(ai_settings, aliens): for alien in aliens: alien.rect.y += ai_settings.alien_drop_factor ai_settings.alien_fleet_direction *= -1 # 检查是否有子弹击中了外星人 def check_bullet_alien_collisions(ai_settings, screen, stats, scoreboard, ship, aliens, bullets): collisions = pygame.sprite.groupcollide(bullets, aliens, True, True) # 比较两个精灵的rect属性,返回一个字典,包括发生碰撞的子弹和外星人。键是子弹,相应的值是击中的 if collisions: # 击中 for aliens in collisions.values(): # 字典的值,每个值都是一个列表 stats.score += ai_settings.alien_points * len(aliens) # 加分 scoreboard.prep_score() # 显示分数 check_high_score(stats, scoreboard) # 更新最高分 # 外星人全部被击落 if len(aliens) == 0: bullets.empty() # 清空子弹 ai_settings.increase_speed() # 加快速度 # 加快速度 stats.level += 1 scoreboard.prep_level() create_fleet(ai_settings, screen, ship, aliens) # 新建一群外星人 # 更新最高分 def check_high_score(stats, scoreboard): if stats.score > stats.high_score: stats.high_score = stats.score scoreboard.prep_high_score()

    settings.py

    ''' 包含一个类,初始化控制游戏外观和飞行速度等属性 ''' class Settings(): # 存放所有设置 def __init__(self): # 屏幕设置 self.screen_width = 900 # 屏幕宽 self.screen_height = 600 # 屏幕高 self.bg_color = (230, 230, 230) # 红绿蓝0-255 # 飞船设置 self.ship_limit = 3 # 飞船的数量 # 子弹设置 self.bullet_width = 3 self.bullet_height = 15 self.bullet_color = (250, 0, 0) self.bullet_allowed = 10 # 允许最大的子弹数 # 外星人设置 self.alien_drop_factor = 10 # 掉落速度 # 提高等级 self.speedup_scale = 1.1 # 加速 self.score_scale = 1.5 # 加分 self.initialize_dynamic_settings() # 速度设置 # 需要改变的设置设置 def initialize_dynamic_settings(self): # 速度设置 self.ship_speed_factor = 1.5 # 飞船的速度 self.alien_speed_factor = 0.5 # 外星人横向移动速度 self.alien_fleet_direction = 1 # 外星人移动方向,1右,-1左 self.bullet_speed_factor = 1 # 子弹速度 # 分数设置 self.alien_points = 10 # 外星人初始分数 # 提高速度、分数 def increase_speed(self): self.ship_speed_factor *= self.speedup_scale self.alien_speed_factor *= self.speedup_scale self.alien_fleet_direction *= self.speedup_scale self.alien_points = int(self.alien_points * self.score_scale) print(self.alien_points)

    game_stats.py

    ''' 一个用于跟踪游戏统计信息的新类 ''' # 跟踪游戏 class GameStats(): def __init__(self, ai_settings): self.ai_settings = ai_settings self.reset_stats() # 初始化统计信息 self.high_score = 0 # 保存最高分 # 标志游戏活动,False结束 self.game_active = False # 初始化在游戏运行期间可能变化的统计信息 def reset_stats(self): self.ship_left = self.ai_settings.ship_limit # 剩余飞船数量 self.score = 0 # 累计分数 self.level = 1

    ship.py

    ''' 包含一个类,管理飞船的位置以及绘制飞船图像 ''' import pygame from pygame.sprite import Sprite # 管理飞船行为的类 class Ship(Sprite): def __init__(self, ai_settings, screen): # 初始化飞船并设置其初始位置 super(Ship, self).__init__() self.screen = screen # 屏幕 self.ai_settings = ai_settings # 环境设置 # 加载飞船图像,使用位图(.bmp) self.image = pygame.image.load('images/ship.bmp') # 函数返回一个表示飞船的surface self.rect = self.image.get_rect() # 获取相应的外观属性rect对象(外接矩形) self.screen_rect = screen.get_rect() # 将表示屏幕的矩形存储 # 设置新飞船位置为屏幕矩形的位置,新飞船放在屏幕底部中央 self.rect.centerx = self.screen_rect.centerx # 飞船的中心位置x坐标 self.rect.bottom = self.screen_rect.bottom # 飞船下边缘的y坐标 self.center = float(self.rect.centerx) # 设置变量,使坐标位置可以存储小数 self.y = float(self.rect.y) # 飞船移动标志 self.moving_right = False # 设置移动标志右 self.moving_left = False # 设置移动标志左 self.moving_up = False # 上 self.moving_down = False # 下 # 更新飞船位置 def update(self): # 根据移动标志调整位置,并在边界处停下 if self.moving_right and self.rect.right<self.screen_rect.right: # 右移 self.center += self.ai_settings.ship_speed_factor if self.moving_left and self.rect.left>0: # 左移 self.center -= self.ai_settings.ship_speed_factor if self.moving_up and self.rect.bottom>50: # 上移 self.y -= self.ai_settings.ship_speed_factor if self.moving_down and self.rect.bottom<self.ai_settings.screen_height: # 下移 self.y += self.ai_settings.ship_speed_factor self.rect.centerx = self.center # 根据self.center更新rect对象 self.rect.y = self.y # 在指定位置绘制飞船 def blitme(self): self.screen.blit(self.image, self.rect) # 重置飞船位置为底部中心 def center_ship(self): self.rect.centerx = self.screen_rect.centerx self.rect.bottom = self.screen_rect.bottom self.center = float(self.rect.centerx) self.y = float(self.rect.y)

    alien.py

    ''' 放置外星人类 ''' import pygame from pygame.sprite import Sprite class Alien(Sprite): # 外星人类 def __init__(self, ai_settings, screen): super(Alien, self).__init__() self.ai_settings = ai_settings self.screen = screen #加载外星人图像 self.image = pygame.image.load('images/alien.bmp') self.rect = self.image.get_rect() #将每个外星人设置在左上角附近 self.rect.x = self.rect.width self.rect.y = self.rect.height self.x = float(self.rect.x) # 在指定位置绘制外星人 def blitme(self): self.screen.blit(self.image, self.rect) # 检测是否撞到边缘,返回布尔值 def check_edges(self): screen_rect = self.screen.get_rect() if self.rect.right >= screen_rect.right: # 右边缘 return True elif self.rect.left <= 0: # 左边缘 return True # 更新外星人移动 def update(self): self.x += self.ai_settings.alien_speed_factor * self.ai_settings.alien_fleet_direction self.rect.x = self.x

    bullet.py

    ''' 包含一个类,管理子弹的属性 ''' import pygame # 通过使用精灵,可将游戏中相关元素编组,进而同时操作编组中的所有元素 from pygame.sprite import Sprite class Bullet(Sprite): # 继承。对飞船发射的子弹进行管理 def __init__(self, ai_settings, screen, ship): # 创建子弹对象 super(Bullet, self).__init__() self.screen=screen # 从空白处开始创建一个矩形表示子弹,必须提供矩形左上角x,y坐标和宽高 self.rect = pygame.Rect(0, 0, ai_settings.bullet_width, ai_settings.bullet_height) self.rect.centerx = ship.rect.centerx # 子弹开始位置和飞船保持一致 self.rect.top = ship.rect.top self.y = float(self.rect.y) # 使可以用小数表示子弹位置 self.color = ai_settings.bullet_color self.speed_factor = ai_settings.bullet_speed_factor # 向上移动子弹 def update(self): self.y -= self.speed_factor self.rect.y = self.y # 在屏幕上绘制子弹 def draw_bullet(self): pygame.draw.rect(self.screen, self.color, self.rect)

    button.py

    ''' 按键类 ''' import pygame.font # 加载和表示字体的模块 class Button(): def __init__(self, ai_settings, screen, msg): self.screen = screen self.screen_rect = screen.get_rect() # 按键的尺寸和属性 self.width = 200 self.height = 50 self.button_color = (0, 0, 0) self.text_color = (255, 255, 255) self.font = pygame.font.SysFont(None, 48) # 指定使用的字体字号,None是默认字体 # 创建按钮的rect对象 self.rect = pygame.Rect(0, 0, self.width, self.height) self.rect.center = self.screen_rect.center # 按钮的标签 self.prep_msg(msg) # 设置按钮标签 def prep_msg(self, msg): # msg是要显示的文本 # 将存储在msg中的文本转换为图像,布尔参数表示是否开启反锯齿功能(让图像更平滑) self.msg_image = self.font.render(msg, True, self.text_color, self.button_color) self.msg_image_rect = self.msg_image.get_rect() self.msg_image_rect.center = self.rect.center # 绘制按钮 def draw_button(self): self.screen.fill(self.button_color, self.rect) # 绘制表示按钮的矩形 self.screen.blit(self.msg_image, self.msg_image_rect)

    scoreboard.py

    ''' 一个显示分数信息的类 ''' import pygame.font from pygame.sprite import Group from ship import Ship class Scoreboard(): def __init__(self, ai_settings, screen, stats): self.screen = screen self.screen_rect = self.screen.get_rect() self.ai_settings = ai_settings self.stats = stats self.text_color = (200, 0, 0) self.font = pygame.font.SysFont(None, 40) self.prep_score() # 初始分数 self.prep_high_score() # 最高分 self.prep_level() # 等级 self.prep_ship() # 剩余飞船数 # 剩余飞船数 def prep_ship(self): self.ships = Group() for ship_number in range(self.stats.ship_left): ship = Ship(self.ai_settings, self.screen) ship.rect.x = 10 + ship_number * ship.rect.width ship.rect.y = 10 self.ships.add(ship) # 当前分数 def prep_score(self): # 表示分数 rounded_score = int(round(self.stats.score, -1)) # 小数精确位数,-1表示10的整倍数 score_str = "{:,}".format(rounded_score) # 格式控制,插入逗号 self.score_image = self.font.render(score_str, True, self.text_color) # 分数位置 self.score_rect = self.score_image.get_rect() self.score_rect.right = self.screen_rect.right - 30 self.score_rect.top = 20 # 最高分数 def prep_high_score(self): # 表示分数 high_score = int(round(self.stats.high_score, -1)) # 小数精确位数,-1表示10的整倍数 high_score_str = "{:,}".format(high_score) # 格式控制,插入逗号 self.high_score_image = self.font.render(high_score_str, True, self.text_color) # 分数位置 self.high_score_rect = self.high_score_image.get_rect() self.high_score_rect.centerx = self.screen_rect.centerx self.high_score_rect.top = 20 # 等级 def prep_level(self): self.level_image = self.font.render(str(self.stats.level), True, self.text_color) # 等级 self.level_rect = self.level_image.get_rect() self.level_rect.right = self.score_rect.right self.level_rect.top = self.score_rect.bottom + 10 # 显示分数 def show_score(self): self.screen.blit(self.score_image, self.score_rect) self.screen.blit(self.high_score_image, self.high_score_rect) self.screen.blit(self.level_image, self.level_rect) self.ships.draw(self.screen)

    运行截图

    Processed: 0.009, SQL: 9