بازی حشره‌کش با پایتون

Insecticide Game

05 آبان 1400
Insecticide-Game

پیش گفتار

این نخستین بازی است که با هم ساخت آن را یاد می گیریم. نام این بازی حشره کش است. در این بازی حشره هایی روی صفحه پدیدار می شوند که باید آن ها را با کلیک موس از بین ببریم. سطح این بازی ساده است.بازی های پیشرفته تری را در آینده خواهیم ساخت.

بازی حشره کش

همان طور که از نام این بازی می توان حدس زد قرار است حشره هایی را در بازی داشته باشیم و می خواهیم آن ها را بکشیم. تصویر بازی در زیر آمده است.

کد کامل بازی نیز در زیر آمده است:

import pygame, sys, random

pygame.init()

SCREEN = pygame.display.set_mode((1280,650))
Clock = pygame.time.Clock()
pygame.mouse.set_visible(False)

# images
WOOD_BG = pygame.image.load('Wood_BG.png')
FLY_SURFACE = pygame.image.load('fly.png')
CROSSHAIR = pygame.image.load('crosshair.png')

# font
GAME_FONT = pygame.font.Font(None,60)
TEXT_SURFACE = GAME_FONT.render('You Won!',True,(255,255,255))
TEXT_RECT = TEXT_SURFACE.get_rect(center = (640,300))


fly_list = []
for fly in range(20):
    fly_position_x = random.randrange(50,1200)
    fly_position_y = random.randrange(120,600)
    fly_rect = FLY_SURFACE.get_rect(center = (fly_position_x, fly_position_y))
    fly_list.append(fly_rect)

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        if event.type == pygame.MOUSEMOTION:
            CROSSHAIR_rect = CROSSHAIR.get_rect(center = event.pos)
        if event.type == pygame.MOUSEBUTTONDOWN:
            for index,fly_rect in enumerate(fly_list):
                if fly_rect.collidepoint(event.pos):
                    del fly_list[index]

    SCREEN.blit(WOOD_BG,(0,0))

    for fly_rect in fly_list:
        SCREEN.blit(FLY_SURFACE,fly_rect)

    if len(fly_list) <= 0:
        SCREEN.blit(TEXT_SURFACE,TEXT_RECT)

    SCREEN.blit(CROSSHAIR,CROSSHAIR_rect)
    
    pygame.display.update()
    Clock.tick(120)

کد را می توانید از نشانی دانلود کنید.

واردکردن کتابخانه ها

طبق معمول برای استفاده از یک کتابخانه باید آن را وارد برنامه کرد پس داریم:

import pygame, sys, random

از random برای تولید اعداد تصادفی استفاده می شود.در این بازی از آن برای تولید جای تصادفی برای حشره ها استفاده می کنیم. دوست داریم در هر بار که بازی را اجرا می کنیم حشره ها در مکان های متفاوتی ظاهر شوند. سپس pygame را init می کنیم. اگر این کار را نکنیم pygame کار نخواهد کرد.

pygame.init()

ساخت پنجره و تعیین نام آن

SCREEN = pygame.display.set_mode((1280,650))
Clock = pygame.time.Clock()
pygame.mouse.set_visible(False)

برای تعیین سرعت اجرای برنامه از ماژول pygame.time.Clock استفاده خواهیم کرد. ماژول pygame.mouse.set_visible برای پنهان یا آشکار کردن نشانگر موس استفاده می شود. برای پنهان کردن نشانگر موس مقدار False را به این ماژول می فرستیم.

وارد کردن تصاویر در برنامه

# images
WOOD_BG = pygame.image.load('Wood_BG.png')
FLY_SURFACE = pygame.image.load('fly.png')
CROSSHAIR = pygame.image.load('crosshair.png')

برای وارد کردن تصاویر در برنامه از ماژول pygame.image.load استفاده می کنیم و نام و محل عکس را به آن می فرستیم. نام عکس باید به صورت یک رشته باشد و داخل کوتیشن قرار بگیرد. عکس ها باید در همان جایی باشند که فایل پایتون قرار دارد.

فونت

# font
GAME_FONT = pygame.font.Font(None,60)
TEXT_SURFACE = GAME_FONT.render('You Won!',True,(255,255,255))
TEXT_RECT = TEXT_SURFACE.get_rect(center = (640,300))

بازیکن هنگامی برنده می شود که همه حشره ها را در صفحه بکشد. پس از پایان بازی و برنده شدن بازیکن باید پیام مناسب به او نشان داده شود. برای نمایش متن باید از pygame.font.Font  استفاده کنیم. برای نمایش متن باید سه گام بالا را طی کنیم. این سه گام به ترتیب زیر هستند:

  1. گام یک ایجاد شی فونت (این کار را با pygame.font.Font انجام می دهیم).
  2. گام دو رندر کردن متن و تعیین رنگ آن است. پارامتر اول متد render متنی است که می خواهیم نمایش دهیم. پارامتر دوم یک پارامتر بولی است. اگر این پارامتر False باشد کاراکترها لبه های صاف خواهند داشت. پارامتر سوم متد render برای تعیین رنگ است.
  3. گام سوم قرار دادن متن در یک مستطیل با متد get_rect است. در واقع دور متن یک مستطیل قرار می دهیم. در آینده در بازی های پیشرفته تر با دلیل این کار آشنا خواهید شد. سپس جای متن را تعیین می کنیم. متن را (640,300) قرار می دهیم.

ساختن حشره ها

fly_list = []
for fly in range(20):
    fly_position_x = random.randrange(50,1200)
    fly_position_y = random.randrange(120,600)
    fly_rect = FLY_SURFACE.get_rect(center = (fly_position_x, fly_position_y))
    fly_list.append(fly_rect)

در ابتدا یک آرایه برای همه حشره ها می سازیم. در بازی بیست حشره خواهیم داشت. پس عدد بیست را در تابع range قرار می دهیم. بازی دو بعدی است پس هر حشره دو مختصه خواهد داشت. نام این مختصه ها fly_position_x و fly_position_y خواهد بود. از random.randrange برای تولید مکان های گوناگون یا تصادفی برای حشره ها استفاده خواهیم کرد. مختصه x حشره ها را بین 50 و 1200 و مختصه y حشره ها را بین 120 و 600 قرار می دهیم:

fly_position_x = random.randrange(50,1200)
fly_position_y = random.randrange(120,600)

در بازی دور تصویر حشره یک مستطیل قرار می دهیم. زیرا تشخیص برخورد موس و حشره آسان تر خواهد چون تصویر crosshair و حشره دارای گوشه های صاف نیستند. اگر این کار را نکنیم تشخیص برخورد کار آسانی نخواهد بود.

fly_rect = FLY_SURFACE.get_rect(center = (fly_position_x, fly_position_y))

در آخر تصویر حشره ها که  بیست عدد هستند را به آرایه fly_list پیوست می کنیم.

fly_list.append(fly_rect)

حلقه بازی

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        if event.type == pygame.MOUSEMOTION:
            CROSSHAIR_rect = CROSSHAIR.get_rect(center = event.pos)
        if event.type == pygame.MOUSEBUTTONDOWN:
            for index,fly_rect in enumerate(fly_list):
                if fly_rect.collidepoint(event.pos):
                    del fly_list[index]

    SCREEN.blit(WOOD_BG,(0,0))

    for fly_rect in fly_list:
        SCREEN.blit(FLY_SURFACE,fly_rect)

    if len(fly_list) <= 0:
        SCREEN.blit(TEXT_SURFACE,TEXT_RECT)

    SCREEN.blit(CROSSHAIR,CROSSHAIR_rect)
    
    pygame.display.update()
    Clock.tick(120)

کارهای اصلی بازی در این حلقه انجام می شوند. رویدادها در این جا مدیریت می شوند. رویدادهایی که در این جا داریم عبارتند از رویداد QUIT برای خروج از بازی، رویداد MOUSEMOTION برای حرکت موس و رویداد MOUSEBUTTONDOWN برای کلیک موس. اگر رویداد QUIT رخ دهد از بازی خارج می شویم.

if event.type == pygame.QUIT:
    pygame.quit()
    sys.exit()

اگر رویداد MOUSEMOTION رخ دهد یعنی موس حرکت است. در هر لحظه از حرکت موس موقعیت آن را در CROSSHAIR_rect قرار می دهیم. جای موس مهم است. از این متغیر برای تشخیص برخورد موس و حشره استفاده می کنیم.

if event.type == pygame.MOUSEMOTION:
    CROSSHAIR_rect = CROSSHAIR.get_rect(center = event.pos)

اگر رویداد MOUSEBUTTONDOWN رخ دهد یعنی موس کلیک کرده است. باید تشخیص دهیم که آیا موس روی حشره کلیک کرده است یا نه. اگر موس روی حشره کلیک کرده باشد، حشره کلیک شده باید حذف شود. برای تشخیص برخورد باید از متد collidepoint استفاده کنیم. باید بررسی کنیم ببینیم آیا fly_rect با موس برخورد می کند یا نه. از خط if fly_rect.collidepoint(event.pos) برای این کار استفاده می کنیم. اگر برخورد رخ داده باشد با خط del fly_list[index] حشره را حذف می کنیم. index در کد زیر به اندیس حشره در آرایه fly_list اشاره می کند. برای هر آیتم fly_rect و اندیس index در آرایه fly_list باید برخورد را بررسی کنیم. هر حشره ای نباید حذف شود. تنها آن حشره ای که روی آن کلیک کرده ایم باید حذف شود.

if event.type == pygame.MOUSEBUTTONDOWN:
    for index,fly_rect in enumerate(fly_list):
        if fly_rect.collidepoint(event.pos):
            del fly_list[index]
در گام بعدی تصویرها را در صفحه می کشیم:
SCREEN.blit(WOOD_BG,(0,0))

for fly_rect in fly_list:
    SCREEN.blit(FLY_SURFACE,fly_rect)

if len(fly_list) <= 0:
    SCREEN.blit(TEXT_SURFACE,TEXT_RECT)

SCREEN.blit(CROSSHAIR,CROSSHAIR_rect)

در آخر همه تغییرها را به روز می کنیم و آن ها را نمایش می دهیم. این حلقه در هر ثانیه 120 بار اجرا می شود. با Clock.tick(120) کار سرعت بازی را تعیین می کنیم.

pygame.display.update()
Clock.tick(120)
تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری بازی‌سازی با پایتون توصیه می‌کند:
نویسنده شوید

دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.