مقدمه
بازی ما اکنون تقریباً کامل است، اما هنوز یک بخش حیاتی را کم دارد: شرایط شکست. در حال حاضر، اگر
ناوگان بیگانگان به پایین صفحه برسد یا با سفینه بازیکن برخورد کند، هیچ اتفاقی نمیافتد. در این
درس، ما این منطق را پیادهسازی کرده و با مدیریت جان بازیکنان، بازی را به یک چالش واقعی تبدیل
میکنیم.
تشخیص برخورد سفینه و بیگانگان
ما باید به صورت مداوم بررسی کنیم که آیا هیچکدام از بیگانگان با سفینه بازیکن برخورد کردهاند یا
خیر. برای این کار، از تابع pygame.sprite.spritecollideany() استفاده
میکنیم. این تابع یک sprite و یک group را گرفته و در صورتی که sprite با هر کدام از اعضای
group برخورد داشته باشد، آن عضو را برمیگرداند و در غیر این صورت، None را برمیگرداند.
alien_invasion.py
if pygame.sprite.spritecollideany(self.ship, self.aliens):
self._ship_hit()
ما این بررسی را در متد _update_aliens انجام میدهیم. اگر برخوردی تشخیص داده شود، متد
جدیدی به نام _ship_hit را فراخوانی میکنیم.
مدیریت وضعیت بازی
برای مدیریت جان بازیکنان و وضعیت کلی بازی، ما یک کلاس جدید به نام GameStats ایجاد خواهیم کرد.
این کار به ما کمک میکند تا آمار بازی را از منطق اصلی جدا نگه داریم.
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
میتواند این آمار را بهروزرسانی کند.
alien_invasion.py
def _ship_hit(self):
"""Respond to the ship being hit by an alien."""
self.stats.ships_left -= 1
self.aliens.empty()
self.bullets.empty()
self._create_fleet()
self.ship.center_ship()
sleep(0.5)
پس از برخورد، ما تعداد جانهای باقیمانده را یکی کم میکنیم، صفحه را از بیگانگان و گلولههای
موجود پاک کرده، یک ناوگان جدید میسازیم و سفینه را به مرکز منتقل میکنیم. یک توقف کوتاه نیز به
بازیکن فرصت میدهد تا خود را برای موج بعدی آماده کند.
پایان بازی
در متد _ship_hit باید بررسی کنیم که آیا بازیکن دیگر جانی برای ادامه دادن دارد یا خیر.
اگر ships_left به صفر برسد، بازی باید به پایان برسد. ما این کار را با تنظیم یک پرچم
game_active انجام میدهیم.
PYTHON
self.game_active = True
if self.stats.ships_left > 0:
else:
self.game_active = False
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، سیستم امتیازدهی و سطحبندی خواهیم
پرداخت تا بازی خود را به یک محصول کامل و پولیششده تبدیل کنیم.