مقدمه

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

تشخیص برخورد سفینه و بیگانگان

ما باید به صورت مداوم بررسی کنیم که آیا هیچ‌کدام از بیگانگان با سفینه بازیکن برخورد کرده‌اند یا خیر. برای این کار، از تابع pygame.sprite.spritecollideany() استفاده می‌کنیم. این تابع یک sprite و یک group را گرفته و در صورتی که sprite با هر کدام از اعضای group برخورد داشته باشد، آن عضو را برمی‌گرداند و در غیر این صورت، None را برمی‌گرداند.

Copy Icon alien_invasion.py
# In _update_aliens() method:
# Look for alien-ship collisions.
if pygame.sprite.spritecollideany(self.ship, self.aliens):
    self._ship_hit()

ما این بررسی را در متد _update_aliens انجام می‌دهیم. اگر برخوردی تشخیص داده شود، متد جدیدی به نام _ship_hit را فراخوانی می‌کنیم.

مدیریت وضعیت بازی

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

Copy Icon PYTHON
class GameStats:
    """Track statistics for Alien Invasion."""
    def __init__(self, ai_game):
        """Initialize statistics."""
        self.settings = ai_game.settings
        self.reset_stats()
    
    def reset_stats(self):
        """Initialize statistics that can change during the game."""
        self.ships_left = self.settings.ship_limit

ما یک نمونه از این کلاس را در سازنده AlienInvasion ایجاد می‌کنیم. حالا متد _ship_hit می‌تواند این آمار را به‌روزرسانی کند.

Copy Icon alien_invasion.py
def _ship_hit(self):
    """Respond to the ship being hit by an alien."""
    # Decrement ships_left.
    self.stats.ships_left -= 1
    
    # Get rid of any remaining aliens and bullets.
    self.aliens.empty()
    self.bullets.empty()
    
    # Create a new fleet and center the ship.
    self._create_fleet()
    self.ship.center_ship()
    
    # Pause.
    sleep(0.5)

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

پایان بازی

در متد _ship_hit باید بررسی کنیم که آیا بازیکن دیگر جانی برای ادامه دادن دارد یا خیر. اگر ships_left به صفر برسد، بازی باید به پایان برسد. ما این کار را با تنظیم یک پرچم game_active انجام می‌دهیم.

Copy Icon PYTHON
# In __init__():
self.game_active = True

# In _ship_hit():
if self.stats.ships_left > 0:
    # ... (reset the level) ...
else:
    self.game_active = False

# In run_game():
while True:
    self._check_events()
    
    if self.game_active:
        self.ship.update()
        self._update_bullets()
        self._update_aliens()

    self._update_screen()

ما یک پرچم به نام game_active اضافه کرده‌ایم که وضعیت فعال بودن بازی را کنترل می‌کند. منطق اصلی بازی (مانند حرکت سفینه و بیگانگان) تنها زمانی اجرا می‌شود که این پرچم True باشد. وقتی جان بازیکن تمام می‌شود، این پرچم False شده و بازی در عمل متوقف می‌شود، اما حلقه اصلی همچنان برای مدیریت رویدادها (مانند خروج) به کار خود ادامه می‌دهد.

در این درس، ما با افزودن شرایط شکست، بازی خود را تکمیل کردیم. با مدیریت برخورد سفینه و بیگانگان و پیاده‌سازی سیستم جان، یک حلقه کامل گیم‌پلی را ایجاد کردیم. در فصل پایانی این پروژه، «ساخت بازی هجوم بیگانگان (۳)»، به افزودن ویژگی‌های نهایی مانند دکمه Play، سیستم امتیازدهی و سطح‌بندی خواهیم پرداخت تا بازی خود را به یک محصول کامل و پولیش‌شده تبدیل کنیم.