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

安装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.QUIT
pygame_K_UP/pygame_K_1/pygame_K_XX表示按键if event.key == pygame.K_UP
sys.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.width
pygame.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)

运行截图

在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值