مقدمه

در این درس، ما یک سیستم امتیازدهی کامل برای بازی خود پیاده‌سازی می‌کنیم. این سیستم شامل نمایش امتیاز فعلی، بالاترین امتیاز کسب شده، و تعداد جان‌های باقی‌مانده بازیکن است. این اطلاعات به بازیکن کمک می‌کند تا پیشرفت خود را بسنجد و انگیزه بیشتری برای ادامه بازی داشته باشد.

ایجاد کلاس Scoreboard

برای مدیریت و نمایش تمام اطلاعات مربوط به امتیازات، یک کلاس جدید به نام Scoreboard در یک فایل جدید به نام scoreboard.py ایجاد می‌کنیم. این کلاس مسئولیت تبدیل متن امتیازات به تصویر و ترسیم آنها روی صفحه را بر عهده خواهد داشت.

Copy Icon scoreboard.py
import pygame.font

class Scoreboard:
    """A class to report scoring information."""

    def __init__(self, ai_game):
        """Initialize scorekeeping attributes."""
        self.screen = ai_game.screen
        self.screen_rect = self.screen.get_rect()
        self.settings = ai_game.settings
        self.stats = ai_game.stats
        
        # Font settings for scoring information.
        self.text_color = (30, 30, 30)
        self.font = pygame.font.SysFont(None, 48)

        # Prepare the initial score images.
        self.prep_score()
        self.prep_high_score()

    def prep_score(self):
        """Turn the score into a rendered image."""
        score_str = str(self.stats.score)
        self.score_image = self.font.render(score_str, True,
                self.text_color, self.settings.bg_color)
        
        # Display the score at the top right of the screen.
        self.score_rect = self.score_image.get_rect()
        self.score_rect.right = self.screen_rect.right - 20
        self.score_rect.top = 20

    def show_score(self):
        """Draw score to the screen."""
        self.screen.blit(self.score_image, self.score_rect)
        self.screen.blit(self.high_score_image, self.high_score_rect)

در این کد، ما متدی به نام prep_score داریم که مقدار عددی امتیاز را به یک رشته و سپس با استفاده از font.render به یک تصویر تبدیل می‌کند. ما موقعیت این تصویر را در گوشه بالا و راست صفحه تنظیم می‌کنیم. متد show_score نیز مسئول ترسیم این تصویر روی صفحه است. ما متدهای مشابهی (`prep_high_score`, `prep_level`, `prep_ships`) برای نمایش بالاترین امتیاز، شماره مرحله و تعداد جان‌های باقی‌مانده نیز ایجاد خواهیم کرد.

به‌روزرسانی امتیاز

امتیاز بازیکن باید با از بین بردن هر بیگانه افزایش یابد. ما این منطق را در کلاس AlienInvasion و در متد _check_bullet_alien_collisions پیاده‌سازی می‌کنیم.

Copy Icon alien_invasion.py
# In _check_bullet_alien_collisions():
collisions = pygame.sprite.groupcollide(
        self.bullets, self.aliens, True, True)

if collisions:
    self.stats.score += self.settings.alien_points
    self.sb.prep_score()

اگر برخوردی رخ دهد، ما امتیاز را به اندازه alien_points (که در Settings تعریف شده) افزایش داده و سپس بلافاصله متد prep_score را روی نمونه Scoreboard (که با نام sb ذخیره شده) فراخوانی می‌کنیم تا تصویر امتیاز جدید برای ترسیم در فریم بعدی، آماده شود.

مدیریت بالاترین امتیاز

ما باید در هر لحظه بررسی کنیم که آیا امتیاز فعلی از بالاترین امتیاز ثبت شده بیشتر است یا خیر. اگر چنین بود، باید بالاترین امتیاز را به‌روزرسانی کنیم. این بررسی را می‌توان در متد _check_bullet_alien_collisions انجام داد. همچنین باید بالاترین امتیاز را در یک فایل ذخیره کنیم تا در اجراهای بعدی بازی نیز باقی بماند.

در این درس، با ایجاد یک کلاس Scoreboard، سیستم کامل امتیازدهی را به بازی خود اضافه کردیم. ما اکنون می‌توانیم امتیاز فعلی، بالاترین امتیاز و جان‌های باقی‌مانده را به صورت زنده روی صفحه نمایش دهیم. با این قابلیت، پروژه ساخت بازی ما به پایان می‌رسد. شما اکنون یک بازی کامل و قابل بازی با قابلیت‌های پیشرفته مانند سطح‌بندی و امتیازدهی دارید. در فصل بعدی، به سراغ «تولید داده» خواهیم رفت و یاد می‌گیریم که چگونه با استفاده از کتابخانه‌هایی مانند Matplotlib و Plotly داده‌ها را مصورسازی کرده و نمودارهای زیبا ایجاد کنیم.