مقدمه

به فصل سیزدهم خوش آمدید! در این فصل، ما دشمنان بازی، یعنی بیگانگان، را به بازی اضافه خواهیم کرد. هدف ما ایجاد یک ناوگان کامل از بیگانگان است که در بالای صفحه در یک شبکه منظم قرار می‌گیرند. این فرآیند شامل ایجاد یک کلاس جدید برای بیگانگان و نوشتن منطقی برای محاسبه و قرار دادن آنها در موقعیت‌های صحیح است.

کلاس Alien

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

Copy Icon alien.py
import pygame
from pygame.sprite import Sprite

class Alien(Sprite):
    """A class to represent a single alien in the fleet."""

    def __init__(self, ai_game):
        """Initialize the alien and set its starting position."""
        super().__init__()
        self.screen = ai_game.screen
        
        # Load the alien image and set its rect attribute.
        self.image = pygame.image.load('images/alien.bmp')
        self.rect = self.image.get_rect()

        # Start each new alien near the top left of the screen.
        self.rect.x = self.rect.width
        self.rect.y = self.rect.height

این کلاس یک تصویر بیگانه را بارگذاری کرده و rect آن را تنظیم می‌کند. ما موقعیت اولیه هر بیگانه را در نزدیکی گوشه بالا و چپ صفحه قرار می‌دهیم.

ایجاد ناوگان

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

محاسبه تعداد بیگانگان در یک ردیف

برای این کار، ما به عرض صفحه و عرض یک بیگانه نیاز داریم. ما فضایی را برای هر بیگانه در نظر می‌گیریم که برابر با دو برابر عرض آن است (یک عرض برای خود بیگانه و یک عرض برای فضای خالی سمت راست).

Copy Icon alien_invasion.py
# In __init__() method:
self.aliens = pygame.sprite.Group()
self._create_fleet()

# New method in AlienInvasion class:
def _create_fleet(self):
    """Create the fleet of aliens."""
    # Create an alien and find the number of aliens in a row.
    alien = Alien(self)
    alien_width, alien_height = alien.rect.size
    available_space_x = self.settings.screen_width - (2 * alien_width)
    number_aliens_x = available_space_x // (2 * alien_width)
    
    # Determine the number of rows of aliens that fit on the screen.
    ship_height = self.ship.rect.height
    available_space_y = (self.settings.screen_height - 
                            (3 * alien_height) - ship_height)
    number_rows = available_space_y // (2 * alien_height)

    # Create the full fleet of aliens.
    for row_number in range(number_rows):
        for alien_number in range(number_aliens_x):
            self._create_alien(alien_number, row_number)

def _create_alien(self, alien_number, row_number):
    """Create an alien and place it in the row."""
    alien = Alien(self)
    alien_width, alien_height = alien.rect.size
    alien.x = alien_width + 2 * alien_width * alien_number
    alien.rect.x = alien.x
    alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number
    self.aliens.add(alien)

در متد _create_fleet ما ابتدا یک نمونه موقت از Alien می‌سازیم تا ابعاد آن را به دست آوریم. سپس فضای افقی و عمودی موجود را محاسبه کرده و بر اساس آن، تعداد بیگانگان در هر ردیف و تعداد کل ردیف‌ها را تعیین می‌کنیم.

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

نمایش ناوگان

آخرین قدم، ترسیم تمام بیگانگان روی صفحه است. ما این کار را با فراخوانی متد draw روی گروه aliens در متد _update_screen انجام می‌دهیم.

Copy Icon alien_invasion.py
# In _update_screen() method:
self.aliens.draw(self.screen)

متد draw روی یک گروه، به صورت خودکار متد draw را برای هر Sprite داخل آن گروه فراخوانی می‌کند. این یک راه بسیار کارآمد برای ترسیم تمام عناصر یک گروه است.

اکنون با اجرای بازی، باید یک ناوگان کامل از بیگانگان را در بالای صفحه مشاهده کنید. در این درس، ما با موفقیت دشمنان بازی را به صحنه اضافه کردیم. با ایجاد یک کلاس Alien و نوشتن منطقی برای ایجاد یک شبکه منظم، ساختار اصلی بازی خود را تکمیل کردیم. در درس بعدی، به سراغ «حرکت ناوگان» خواهیم رفت و به بیگانگان جان خواهیم بخشید تا به سمت پایین و طرفین حرکت کنند.