平均每天日增一粉还是可以的,总感觉被人偷偷关注了呢。开始开始。
3.3.2 创建记分牌
为显示得分,我们在alien_invasion.py中创建一个Scoreboard 实例:
from scoreboard import Scoreboard
import pygame
from pygame.sprite import Group
from setting import Settings
from game_stats import GameStats
from button import Button
from ship import Ship
from alien import Alien
import game_functions as gf
def rungame():
#初始化游戏并创建一个屏幕对象
pygame.init()
#实例化设置对象
ai_settings = Settings()
screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
pygame.display.set_caption("Alien Invasion")
# 创建play按钮
play_button = Button(ai_settings, screen, "Play")
#创建一个用于存储游戏统计信息的实例
stats = GameStats(ai_settings)
#创建一只飞船
ship = Ship(ai_settings,screen)
#创建一个用于存储子弹的编组
bullets = Group()
#创建一个用于存储敌人的编组
aliens = Group()
# #创建一个外星人
# alien = Alien(ai_settings,screen)
# 创建一群敌人
gf.create_fleet(ai_settings,screen,ship,aliens)
# 创建存储游戏统计信息的实例,并创建记分牌
stats = GameStats(ai_settings)
sb = Scoreboard(ai_settings,screen,stats)
#开始游戏主循环
while True:
gf.check_events(ai_settings,screen,stats,play_button,ship,aliens,bullets)
if stats.game_active:
ship.update()
gf.update_bullets(ai_settings,screen,ship,aliens,bullets)
gf.update_aliens(ai_settings,stats,screen,ship,aliens,bullets)
gf.update_screen(ai_settings,screen,stats,ship,sb,aliens,bullets,play_button)
rungame()
首先我们创建了sb存储记分牌实例,接着我们更新了update_screen函数里的参数,增加了sb变量。下面来修改一下update_screen()函数:
def update_screen(ai_settings,screen,stats,ship,sb,aliens,bullets,play_button):
#每次循环时都重绘屏幕
screen.fill(ai_settings.bg_color)
#在飞船和外星人后面重绘所有子弹
for bullet in bullets.sprites():
bullet.draw_bullet()
# 屏幕上绘制飞船#
ship.blitme()
# 屏幕上绘制敌人
# alien.blitme()
aliens.draw(screen)
# 显示得分
sb.show_score()
# 如果游戏处于非活动状态,就绘制按钮
if not stats.game_active:
play_button.draw_button()
#让最近绘制的屏幕可见#
pygame.display.flip()
在绘制play按钮之前,我们调用了显示记分牌的方法。如果现在运行这个游戏,你将在屏幕右上角看到0(当前,我们只想在进一步开发记分系统前确认得分出现在正确的地方)。如下图所示:
注意主程序中函数参数的位置!!!
3.3.3 在外星人被消灭时更新得分
为在屏幕上实时地显示得分,每当有外星人被击中时,我们都更新stats.score 的值,再调用prep_score() 更新得分图像。但在此之前,我们需要指定玩家每击落一个外星人都将得到多少个点:
def initialize_dynamic_settings(self):
#初始化随游戏进行而变化的设置
self.ship_speed_factor = 1.5
self.bullet_speed_factor = 3
self.alien_speed_factor = 1
#fleet_direction为1表示向右移,-1表示向左移
self.fleet_direction = 1
# 记分
self.alien_points = 50
随着游戏的进行,我们将提高每个外星人值的点数。为确保每次开始新游戏时这个值都会被重置,我们在initialize_dynamic_settings() 中设置它。 在check_bullet_alien_collisions() 中,每当有外星人被击落时,都更新得分:
def check_bullet_alien_collisions(ai_settings,screen,stats,sb,ßship,aliens,bullets):
collisions = pygame.sprite.groupcollide(bullets,aliens,True,True)
if collisions:
stats.score += ai_settings.alien_points
sb.prep_score()
我们更新check_bullet_alien_collisions() 的定义,在其中包含了形参stats 和sb ,让它能够更新得分和记分牌。有子弹撞到外星人时,Pygame返回一个字典 (collisions)。我们检查这个字典是否存在,如果存在,就将得分加上一个外星人值的点数。接下来,我们调用prep_score() 来创建一幅显示最新得分的新图 像。
我们需要修改update_bullets() ,确保在函数之间传递合适的实参:
def update_bullets(ai_settings,screen,stats,sb,ship,aliens,bullets):
# 更新子弹的位置
bullets.update() # 删除已消失的子弹
for bullet in bullets.copy():
if bullet.rect.bottom <= 0:
bullets.remove(bullet)
# 检查是否有子弹击中了敌人
# 如果是这样,就删除相应的子弹和敌人
check_bullet_alien_collisions(ai_settings,screen,stats,sb,ßship,aliens,bullets)
在update_bullets() 的定义中,需要新增形参stats和sb ,而调用check_bullet_alien_collisions() 时,也需要传递实参stats 和sb 。 我们还需要修改主while 循环中调用update_bullets() 的代码:
#开始游戏主循环
while True:
gf.check_events(ai_settings,screen,stats,play_button,ship,aliens,bullets)
if stats.game_active:
ship.update()
gf.update_bullets(ai_settings,screen,stats,sb,ship,aliens,bullets)
gf.update_aliens(ai_settings,stats,screen,ship,aliens,bullets)
gf.update_screen(ai_settings,screen,stats,ship,sb,aliens,bullets,play_button)
如果你现在运行这个游戏,得分将不断增加!
网友评论