Книга «Изучаем Python»



Pdf көрінісі
бет152/238
Дата07.01.2022
өлшемі7,86 Mb.
#18670
түріКнига
1   ...   148   149   150   151   152   153   154   155   ...   238
УПРАЖНЕНИЯ

14-3 .  Учебная  стрельба  с  нарастающей  сложностью:  начните  с  кода  упражнения  14-2 

(с .  288) .  Скорость  мишени  должна  увеличиваться  по  ходу  игры,  а  при  нажатии  игроком 

кнопки Play мишень должна возвращаться к исходной скорости .




Подсчет очков    291

Подсчет очков

Система подсчета очков позволит отслеживать счет игры в реальном времени; так-

же на экране будет выводиться текущий рекорд, уровень и количество оставшихся 

кораблей. Счет игры также относится к игровой статистике, поэтому мы добавим 

атрибут 


score

 в класс 

GameStats

:

game_stats.py

class GameStats():

...


def reset_stats(self):

"""Инициализирует статистику, изменяющуюся в ходе игры."""

self.ships_left = self.ai_settings.ship_limit

        self.score = 0

Чтобы счет сбрасывался при запуске новой игры, мы инициализируем 

score


 

в 

reset_stats()



 вместо 

__init__()

.

Вывод счета



Чтобы вывести счет на экран, мы сначала создаем новый класс 

Scoreboard

. Пока 

этот класс ограничивается выводом текущего счета, но мы используем его для вы-

вода рекордного счета, уровня и количества оставшихся кораблей. Ниже приведена 

первая часть класса; сохраните ее под именем 

scoreboard .py

:

scoreboard.py

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()



Так как 

Scoreboard

 выводит текст на экран, код начинается с импортирования 

модуля 


pygame.font

. Затем 


__init__()

 передаются параметры 

ai_settings

screen



 

и 

stats



, чтобы класс мог выводить информацию об отслеживаемых показателях . 

Далее назначается цвет текста  и создается экземпляр объекта шрифта .

Чтобы преобразовать выводимый текст в изображение, мы вызываем метод 

prep_


score()

 , который определяется следующим образом:



scoreboard.py

    def prep_score(self):

        """Преобразует текущий счет в графическое изображение."""



292    Глава 14  •  Ведение счета

        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



В методе 

prep_score()

 преобразуем числовое значение 

stats.score

 в строку ; эта 

строка передается методу 

render()

, создающему изображение . Чтобы счет был 

хорошо виден на экране, мы передаем 

render()


 цвет фона и цвет текста.

Счет размещается в правой верхней части экрана и расширяется влево с ростом 

значения и ширины числа. Чтобы счет всегда оставался выровненным по правой 

стороне, мы создаем прямоугольник 

rect

 с именем 



score_rect

  и смещаем его 

правую сторону на 20 пикселов от правого края экрана . Затем верхняя сторона 

прямоугольника смещается на 20 пикселов вниз от верхнего края экрана .

Остается создать метод 

show_score()

 для вывода построенного графического изо-

бражения:



scoreboard.py

def show_score(self):

    """Выводит счет на экран."""

    self.screen.blit(self.score_image, self.score_rect)

Метод выводит счет на экран в позиции, определяемой 

score_rect

.

Создание экземпляра Scoreboard



Чтобы вывести счет, мы создадим в 

alien_invasion .py

 экземпляр 

Scoreboard

:

alien_invasion.py

...


from game_stats import GameStats

from scoreboard import Scoreboard

...

def run_game():



...

    # Создание экземпляров GameStats и Scoreboard.

stats = GameStats(ai_settings)

    sb = Scoreboard(ai_settings, screen, stats)



...

# Запуск основного цикла игры.

while True:

...


        gf.update_screen(ai_settings, screen, stats, sb, ship,  

                           aliens,

            bullets, play_button)

run_game()



Подсчет очков    293

Мы импортируем новый класс 

Scoreboard

 и создаем экземпляр 

sb

 после создания 



экземпляра 

stats


 . Затем экземпляр 

sb

 передается методу 



update_screen()

, чтобы 


счет можно было вывести на экран .

Для отображения счета метод 

update_screen()

 изменяется следующим образом:



game_functions.py

def update_screen(ai_settings, screen, stats, sb, ship, aliens, bullets,

        play_button):

...


    # Вывод счета.

    sb.show_score()

    

# Кнопка Play отображается в том случае, если игра неактивна.



if not stats.game_active:

play_button.draw_button()

# Отображение последнего прорисованного экрана.

pygame.display.flip()

Мы добавляем 

sb

 в список параметров, определяющих 



update_screen()

, и вызыва-

ем 

show_score()



 непосредственно перед отображением кнопки 

Play


.

Если запустить Alien Invasion сейчас, в правом верхнем углу экрана отображается 

счет 0. (Пока мы просто хотим убедиться в том, что счет отображается в нужном 

месте, прежде чем заниматься дальнейшей доработкой системы подсчета очков.) 

На рис. 14.2 изображено окно игры перед ее началом.



Достарыңызбен бөлісу:
1   ...   148   149   150   151   152   153   154   155   ...   238




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет