美文网首页
【python3小白上路系列】实现记分系统(二)

【python3小白上路系列】实现记分系统(二)

作者: Charles_DT | 来源:发表于2020-09-03 09:54 被阅读0次

平均每天日增一粉还是可以的,总感觉被人偷偷关注了呢。开始开始。

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)

如果你现在运行这个游戏,得分将不断增加!


相关文章

网友评论

      本文标题:【python3小白上路系列】实现记分系统(二)

      本文链接:https://www.haomeiwen.com/subject/ojcnsktx.html