این نخستین بازی است که با هم ساخت آن را یاد می گیریم. نام این بازی حشره کش است. در این بازی حشره هایی روی صفحه پدیدار می شوند که باید آن ها را با کلیک موس از بین ببریم. سطح این بازی ساده است.بازی های پیشرفته تری را در آینده خواهیم ساخت.
همان طور که از نام این بازی می توان حدس زد قرار است حشره هایی را در بازی داشته باشیم و می خواهیم آن ها را بکشیم. تصویر بازی در زیر آمده است.
کد کامل بازی نیز در زیر آمده است:
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 استفاده کنیم. برای نمایش متن باید سه گام بالا را طی کنیم. این سه گام به ترتیب زیر هستند:
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)
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.