Python项目实践之四:计分
需求:实现一个记分系统,以实时地跟踪玩家的得分,并显示最高得分、当前等级和余下的飞船数。
一、显示得分
得分是游戏的一项统计信息,因此我们在 GameStats 中的reset_stats()添加一个 score 属性:
def reset_stats(self):
"""初始化在游戏运行期间可能变化的统计信息"""
self.ships_left = self.ai_settings.ship_limit
self.score = 0
为在屏幕上显示得分、最高得分、等级和余下的飞船数,我们首先创建一个新类 Scoreboard 。
import pygame.font
class Scoreboard():
"""显示得分信息的类"""
def __init__(self, ai_settings, screen, stats):
"""初始化显示得分涉及的属性"""
self.screen = screen
self.screen_rect = screen.get_rect()
self.ai_settings = ai_settings
self.stats = stats
# 显示得分信息时使用的字体设置
self.text_color = (30, 30, 30)
self.font = pygame.font.SysFont(None, 48)
# 准备初始得分图像
self.prep_score()
解释:
1、导入模块 pygame.font:在屏幕上显示文本信息。
2、self.text_color:设置字体颜色
3、self.font:创建字体对象
4、self.prep_score():将要显示的文本转化为图像
在scoreboard.py 中定义 prep_score() :
def prep_score(self):
"""将得分转换为一幅渲染的图像"""
score_str = str(self.stats.score)
self.score_image = self.font.render(score_str, True, self.text_color,
self.ai_settings.bg_color)
# 将得分放在屏幕右上角
self.score_rect = self.score_image.get_rect()
self.score_rect.right = self.screen_rect.right - 20
self.score_rect.top = 20
解释:
1、首先,将数字值 stats.score 转换为字符串,然后将这个字符串传递给创建图像的 render(),并将设置好的文本颜色text_color和游戏的背影颜色bg_color传递给render(),构建了一个score_image对象。
2、其次,通过score_image对象的get_rect()方法获取了它的rect,然后将其定位于距离屏幕右边缘和顶部20像素。
创建方法 show_score() ,用于显示渲染好的得分图像(在scoreboard.py 中定义此方法):
def show_score(self):
"""在屏幕上显示得分"""
self.screen.blit(self.score_image, self.score_rect)
二、创建记分牌
为显示得分,我们在alien_invasion.py中创建一个 Scoreboard 实例:
......
#创建分数显示实例
sb = Scoreboard(ai_settings, screen, stats)
......
把创建的 Scoreboard 实例添加到主循环中用于实时更新屏幕的函数中:
......
#每次循环重绘屏幕
gf.update_screen(ai_settings, screen, stats, sb, ship, aliens, bullets,
play_button)
......
修改game_functions.py 中的 update_screen(),调用显示得分的方法:
...
# 显示得分
sb.show_score()
...
三、在外星人被消灭时更新得分
首先,在settings.py的可变设置的方法initialize_dynamic_settings中定义消灭一个外星人的得分:
......
# 记分
self.alien_points = 50
......
只有在外星人被消灭了才改变得分,所以我们在响应子弹和外星人的碰撞的函数中添加此项功能:
def check_bullet_alien_collisions(ai_settings, screen, stats, sb, ship, aliens, bullets):