تخفیف نوروزی پی استور

کد تخفیف: PR1404

شامل تمامی آثار
روز
ساعت
دقیقه
ثانیه

با خرید اشتراک ویژه ، با هزینه بسیار کمتر به فایل های پاورپوینت دسترسی داشته باشید!

آموزش رایگان ساخت بازی با پایتون – ساخت بازی با کتابخانه Pygame پایتون در ۱۰ مرحله

آموزش رایگان ساخت بازی با پایتون - ساخت بازی با کتابخانه Pygame پایتون در 11 مرحله
اگر علاقه مند به برنامه نویسی و بازی های کامپیوتری هستید پس به این موضوع فکر کرده‌اید که بازی‌های ویدئویی چگونه ساخته می‌شوند؟ باید گفت این کار آنقدرها هم پیچیده نیست. در این پست قصد داریم تا ساخت بازی با پایتون را آموزش دهیم. زبان برنامه نویسی پایتون با داشتن کتابخانه‌های متنوع برای گیم نویسی، یک ابزار برای ساخت و توسعه بازی‌های کامپیوتری است. کتابخانه pygame پایتون به بهترین نحو، امکانات جالبی را برای ساخت بازی‌های کامپیوتری به شما ارائه می‌دهد. در این آموزش گام به گام در 10 مرحله، نحوه کدنویسی بازی خرگوش‌ها و گورکن‌ها را با پایتون به شما عزیزان آموزش خواهیم داد.

فهرست مطالب

مقدمات اولیه و شروع کار

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

اگر از نصب پایتون روی سیستم خودتان مطمئن شدید با استفاده از ابزار pip، کتابخانه pygame را روی پایتون خود نصب کنید. اگر در مورد نصب کتابخانه بر روی پایتون، اشکال دارید می‌توانید آموزش نصب کتابخانه بر روی پایتون را مطالعه کنید. دستوری که برای نصب کتابخانه pygame وجود دارد دستور ساده زیر است.

pip install pygame

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

IDLE پایتون را باز کنید!

برای تأیید نصب کتابخانه، IDLE پایتون را باز کنید و دستور import pygame را تایپ کنید اگر نتیجه این دستور، خطایی در بر نداشت و ورژن pygame نشان داده شد، پس همه چیز خوب است پس از اطمینان از نصب pygame می‌توانیم به سراغ کد نویسی ساخت بازی با پایتون بریم.

اطمینان از نصب pygame

اجرای کد پایتون از فایل

در حالی که می‌توانید قطعات کوتاهی از کد پایتون را در IDLE پایتون اجرا کنید اما اگر می‌خواهید روی برنامه‌های بزرگتری کار کنید (مانند ساخت بازی با پایتون)، احتمالاً می‌خواهید کد خود را در یک فایل ذخیره کنید تا مجبور نباشید هر بار آن را تایپ و اجرا کنید. روش‌های مختلفی برای اجرای برنامه پایتون به صورت فایل وجود دارد. یک راه این است که از ویرایشگر متن ساده مانند Notepad (Windows) استفاده کنید.

برای شروع، یک فایل متنی جدید باز کنید و کد پایتون خود را وارد کنید. برای شروع در IDEL shell از قسمت File گزینه New File را بزنید و کد ساده مثلاً چاپ Hello World را بزنید و F5 را برای اجرا بزنید و پس از ذخیره کردن فایل در یک مکان (در درایو C یک فولدر با نام Game ایجاد کنید) با نام game می‌توانید پیام Hello World را در IDEL shell مشاهده کنید. محتویات پوشه Game در درایو C هم یک فایل هست با نام game و پسوند py که در ادامه کار، کدنویسی را روی این فایل انجام خواهیم داد.

در لینک زیر پاورپوینت در مورد بازی سازی قرار داده شده که می خواهیم شما را با طراحی و مدل‌سازی بازی، روش‌های بازی سازی و انواع شرکت‌های بازی سازی آشنا کنیم.

اضافه کردن منابع بازی

تا الان شما تقریباً آماده ساخت بازی با پایتون هستید. اما یک بازی بدون جلوه‌های گرافیکی و صوتی چنگی به دل نخواهد زد؛ پس یک فایل Zip آماده شده‌ای را از طریق این لینک (+) دانلود کنید و به پوشه Game داخل درایو C منتقل کنید و آن را از حالت فشرده خارج کنید تا لیستی از منابع استفاده شده در ساخت بازی با پایتون، اعم از تصاویر و صداها برای پروژه بازی وجود داشته باشد.

محتویات پوشه Game

مرحله اول: ساختار اولیه کد

به سراغ فایل game.py ایجاد شده بروید و محتویات قبلی آن را پاک کنید و کد زیر را به آن اضافه کنید.

# ۱ - Import library
import pygame
from pygame.locals import *

# ۲ - Initialize the game
pygame.init()
width, height = 640, 480
screen=pygame.display.set_mode((width, height))

# ۳ - Load images
player = pygame.image.load("resources/images/dude.png")

# ۴ - keep looping through
while 1:
    # ۵ - clear the screen before drawing it again
    screen.fill(0)
    # ۶ - draw the screen elements
    screen.blit(player, (100,100))
    # ۷ - update the screen
    pygame.display.flip()
    # ۸ - loop through the events
    for event in pygame.event.get():
        # check if the event is the X button 
        if event.type==pygame.QUIT:
            # if it is quit the game
            pygame.quit() 
            exit(0)

فایل را در پوشه بازی خود ذخیره کنید (پوشه ای که زیر پوشه منابع در آن قرار دارد) و با F5 آن را اجرا کنید. بیایید ۸ بخش کد را که در سورس آن نشانه گذاری شده، بخش به بخش مرور کنیم:

  • بخش ۱: import کردن کتابخانه PyGame

این بخش به شما امکان می‌دهد از توابع کتابخانه pygame و کتابخانه‌های مورد نیاز خود در برنامه استفاده کنید.

  • بخش ۲: تنظیمات اولیه

در این بخش تنظیمات اولیه PyGame انجام می‌شود و پنجره نمایش و سایر موارد قابل تنظیم خواهد بود.

  • بخش ۳: بارگذاری فایل ها و تصاویر

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

  • بخش ۴: حلقه اصلی بازی

در بخش چهارم حلقه اصلی بازی وجود دارد و درون این حلقه عملیات‌های مخلفی انجام خواهد شد.

*** توجه: در مواردی که زبان‌های دیگر مانند Objective-C ، Java یا PHP از براکت‌های حلقه‌ای برای نشان دادن یک بلوک از کد برای اجرا در حلقه while یا دستور if استفاده می‌کنند، پایتون از تو رفتگی برای شناسایی بلوک‌های کد استفاده می‌کند. بنابراین تورفتگی مناسب در پایتون بسیار مهم است – این مهم را در ساخت بازی با پایتون در نظر داشته باشید.

  • بخش ۵: پاک کردن صفحه نمایش قبل از ترسیم

قبل از ترسیم یا نمایش هر چیزی، صفحه نمایش با رنگ سیاه مقدار دهی شده است ولی در مراحل بعدی تصاویری به این قسمت اضافه خواهد شد.

  • بخش ۶: اضافه کردن تصاویر به صفحه نمایش

در این بخش تصویر بارگذاری شده خرگوش، روی صفحه با مختصات x = 100 و y = 100 اضافه شده است.

  • بخش ۷: بروز کردن صفحه نمایش

در این بخش در هر مرحله صفحه نمایش به روز می‌شود.

  • بخش ۸: بررسی شرایط توقف برنامه

در این بخش هر رویداد جدید بررسی می‌شود و در صورت برقراری شرط یا شرایط خاتمه برنامه، خروج یا ادامه بازی صادر می‌شود.

اگر کد را اکنون اجرا می‌کنید (از طریق Run \ Run Module در منوی Idle) یا F5 باید صفحه‌ای مشابه تصویر زیر را مشاهده کنید:

اجرای کد پایتون مرحله اول ساخت بازی با پایتون

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

مرحله دوم: اضافه کردن منظره به بازی

در ادامه ساخت بازی با پایتون بیایید کمی شکل بازی رو با افزودن منظره زیبا کنیم. این کار را می‌توان با دستور screen.blit انجام داد. در پایان بخش شماره ۳ یعنی Load images، پس از بارگذاری تصویر قبلی، کد زیر را اضافه کنید:

grass = pygame.image.load("resources/images/grass.png")
castle = pygame.image.load("resources/images/castle.png")

این کار باعث بارگذاری تصاویر و قرار دادن آنها در متغیرهای خاص می‌شود. حالا این تصاویر (یعنی تصویر چمن grass و قلعه castle) باید روی صفحه نمایش قرار داده شوند. اما اگر تصویر چمن را بررسی کنید، متوجه می‌شوید که کل سطح صفحه نمایش را پوشش نمی‌دهد، یعنی باید کل تصویر در صفحه نمایش ۶۴۰*۴۸۰ نمایش داده شود تا طور کامل آن را بپوشاند برای این کار کد زیر را به game.py در ابتدای قسمت شماره ۶ (قبل از دستور screen.blit(player, (100,100))) اضافه کنید:

for x in range(int(width/grass.get_width()+1)):
    for y in range(int(height/grass.get_height()+1)):
        screen.blit(grass,(x*100,y*100))
screen.blit(castle,(0,30))
screen.blit(castle,(0,135))
screen.blit(castle,(0,240))
screen.blit(castle,(0,345 ))

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

اضافه کردن منظره به بازی

حالا منظره و شکل بازی کمی دلپذیر شد در ادامه به مراحل بعدی ساخت بازی با پایتون می‌پردازیم.

مرحله سوم: حرکت قهرمان بازی با صفحه کلید

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

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

keys = [False, False, False, False]
playerpos=[100,100]

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

screen.blit(player, (100,100))

به جای این دستور بالا، دستور زیر را قرار دهید.

screen.blit(player, playerpos)

در مرحله بعد، آرایه کلیدها را بر اساس فشردن کلیدها به روز کنید. PyGame با افزودن توابع event.key تشخیص فشارهای کلید را آسان می‌کند. در انتهای بخش شماره ۸، بلافاصله پس از بررسی بلاک event.type == pygame.QUIT، این کد را (در همان سطح تورفتگی pygame.QUIT if block پس از دستور exit(0)) قرار دهید:

if event.type == pygame.KEYDOWN:
    if event.key==K_UP:
        keys[0]=True
    elif event.key==K_LEFT:
        keys[1]=True
    elif event.key==K_DOWN:
        keys[2]=True
    elif event.key==K_RIGHT:
        keys[3]=True
if event.type == pygame.KEYUP:
    if event.key==pygame.K_UP:
        keys[0]=False
    elif event.key==pygame.K_LEFT:
        keys[1]=False
    elif event.key==pygame.K_DOWN:
        keys[2]=False
    elif event.key==pygame.K_RIGHT:
        keys[3]=False

شاید فکر کنید این کدها در ساخت بازی با پایتون پیچیده هستند اما اگر آن‌ها را به عبارات if تقسیم کنید، چندان پیچیده نیست. ابتدا بررسی کنید که آیا کلید فشار داده شده، آزاد شده است یا خیر؟ سپس بررسی می‌کنید که کدام کلید فشرده یا آزاد می‌شود، و اگر کلید فشرده یا آزاد شده، یکی از کلیدهایی است که از آن استفاده می‌کنید، متغیر کلیدها را متناسب با آن به روز می‌کنید.

در نهایت، شما باید متغیر playerpos را در پاسخ به فشارهای کلید به روز کنید. کد زیر را به پایان game.py اضافه کنید (با یک سطح تورفتگی، آن را در همان سطح حلقه for قرار دهید):

# ۹ - Move player
if keys[0]:
    playerpos[1]-=5
elif keys[2]:
    playerpos[1]+=5
if keys[1]:
    playerpos[0]-=5
elif keys[3]:
    playerpos[0]+=5

این کد به سادگی بررسی می‌کند که کدام یک از کلیدها فشرده می‌شوند و از موقعیت x یا y خرگوش (بسته به کلید فشرده شده) اضافه یا کم می‌کند تا بازیکن حرکت کند. بازی را اجرا کنید و باید بتوانید با جهت‌های کیبرد خرگوش را حرکت دهید.

حرکت خرگوش با صفحه کلید

مرحله چهارم: چرخش خرگوش

خوب تا الان خرگوش می‌تواند با فشار دادن کلیدها حرکت کند، اما اگر بتوان از ماوس برای چرخاندن خرگوش به جهت مورد نظر استفاده کرد، عالی خواهد بود. برای اجرای این عمل نیاز به محاسبات مثلثاتی داریم. به تصویر زیر توجه کنید:

چرخش خرگوش

در تصویر بالا، اگر مختصات (۵،۳) موقعیت خرگوش و مختصات (۲،۴) موقعیت فعلی ماوس باشد، می توان با اعمال تابع مثلثاتی atan2 به تفاوت در زاویه چرخش (z) را پیدا کنید. پس با فاصله بین دو نقطه و تابع tan به سادگی خرگوش بازی در جهت ماوس خواهد چرخید.

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

برای انجام این کار، می‌توانید از تابع PyGame Surface.rotate (degree) استفاده کنید. به خاطر داشته باشید که مقدار Z در رادیان است. تابع atan2 در کتابخانه ریاضی پایتون وجود دارد؛ بنابراین ابتدا کد زیر را به انتهای بخش شماره ۱ اضافه کنید:

import math

سپس، آخرین خط در بخش ۶ (خط player.blit) را با کد زیر جایگزین کنید:

# ۶.۱ - Set player position and rotation
position = pygame.mouse.get_pos()
angle = math.atan2(position[1]-(playerpos[1]+32),position[0]-(playerpos[0]+26))
playerrot = pygame.transform.rotate(player, 360-angle*57.29)
playerpos1 = (playerpos[0]-playerrot.get_rect().width/2, playerpos[1]-playerrot.get_rect().height/2)
screen.blit(playerrot, playerpos1)

بیایید ساختار اساسی کد بالا را مرور کنیم. ابتدا موقعیت ماوس و خرگوش را دریافت می‌کنید. سپس آن‌ها را وارد تابع atan2 می‌کنید. پس از آن، زاویه دریافتی از تابع atan2 را از رادیان به درجه تبدیل می‌کنید (رادیان را تقریباً در ۵۷.۲۹ یا ۳۶۰/۲π ضرب کنید). از آنجا که خرگوش چرخانده می‌شود، موقعیت آن تغییر می‌کند. بنابراین اکنون موقعیت جدید خرگوش را محاسبه کرده و خرگوش را روی صفحه نمایش ترسیم می‌کنیم.

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

چرخش خرگوش در ساخت بازی در پایتون

مرحله پنجم: تیراندازی خرگوش

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

acc=[0,0]
arrows=[]

متغیر اول صحت بازیکن یا خرگوش بازی را ردیابی می‌کند و آرایه دوم تمام پیکان‌ها را ردیابی می‌کند. متغیر دقت در اصل لیستی از تعداد شلیک‌های شلیک شده و تعداد گورکن‌های اصابت شده است. بعداً، ما از این اطلاعات برای محاسبه درصد دقت استفاده خواهیم کرد. در این مرحله، تصویر پیکان یا bullet را در انتهای بخش شماره ۳ بارگذاری کنید:

arrow = pygame.image.load("resources/images/bullet.png")

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

if event.type==pygame.MOUSEBUTTONDOWN:
    position=pygame.mouse.get_pos()
    acc[1]+=1
    arrows.append([math.atan2(position[1]-(playerpos1[1]+32),position[0]-(playerpos1[0]+26)),playerpos1[0]+32,playerpos1[1]+32])

این کد بررسی می کند که آیا ماوس کلیک شده است یا خیر؛ موقعیت ماوس را می‌گیرد و چرخش پیکان را بر اساس موقعیت چرخانده شده خرگوش و موقعیت مکان نما محاسبه می‌کند. این مقدار چرخش در آرایه arrows ذخیره می‌شود. در مرحله بعد، باید پیکان‌ها را روی صفحه ترسیم کنید. کد زیر را پس از بخش شماره ۶.۱ اضافه کنید:

# ۶.۲ - Draw arrows
for bullet in arrows:
    index=0
    velx=math.cos(bullet[0])*10
    vely=math.sin(bullet[0])*10
    bullet[1]+=velx
    bullet[2]+=vely
    if bullet[1]<-64 or bullet[1]>640 or bullet[2]<-64 or bullet[2]>480:
        arrows.pop(index)
    index+=1
    for projectile in arrows:
        arrow1 = pygame.transform.rotate(arrow, 360-projectile[0]*57.29)
        screen.blit(arrow1, (projectile[1], projectile[2]))

مقادیر velyx و velx با استفاده از مثلثات محاسبه می‌شود و ۱۰ سرعت پیکان‌ها است. دستور if فقط بررسی می‌کند که گلوله خارج از محدوده باشد و اگر باشد، پیکان را حذف می‌کند. دومی برای عبارت از فلش‌ها عبور کرده و آن‌ها را با چرخش صحیح ترسیم می‌کند.

حالا وقت آن رسیده دوباره برنامه را اجرا کنید. بازیکن بازی با استفاده از کلیک ماوس می‌تواند پیکان‌ها را شلیک کند.

تیراندازی خرگوش

مرحله ششم: ساخت گورکن های دشمن

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

  1. اضافه کردن گورکن‌ها را به لیستی از یک آرایه
  2. بررسی و بروز کردن گورکن‌ها در هر فریم
  3. نمایش گورکن‌ها

ابتدا کد زیر را به انتهای بخش شماره ۲ اضافه کنید:

badtimer=100
badtimer1=0
badguys=[[640,100]]
healthvalue=194

موارد فوق یک تایمر یا زمان سنج (و همچنین چند مقدار دیگر) را تنظیم می‌کند تا در بازی پس از گذشت مدتی یک گورکن جدید اضافه شود. شما badtimer را در هر قاب کاهش می‌دهید تا صفر شود و سپس یک badger یا گورکن جدید ایجاد می‌کنید. حالا موارد زیر را به انتهای بخش شماره ۳ اضافه کنید:

badguyimg1 = pygame.image.load("resources/images/badguy.png")
badguyimg=badguyimg1

خط اول بالا شبیه به تمام کد بارگیری تصویر قبلی است. خط دوم یک کپی از تصویر را تنظیم می‌کند تا بتوانید به راحتی گورکن‌ها را حرکت دهید. پس از آن باید گورکن‌ها را به روز کنید و در صفحه نمایش نشان دهید. این کد را بلافاصله پس از بخش شماره ۶.۲ اضافه کنید:

# ۶.۳ - Draw badgers
if badtimer==0:
    badguys.append([640, random.randint(50,430)])
    badtimer=100-(badtimer1*2)
    if badtimer1>=35:
        badtimer1=35
    else:
        badtimer1+=5
index=0
for badguy in badguys:
    if badguy[0]<-64:
        badguys.pop(index)
    badguy[0]-=7
    index+=1
for badguy in badguys:
    screen.blit(badguyimg, badguy)

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

اولین حلقه for مختصات x گورکن را بررسی می‌کند که آیا از صفحه خارج شده است و اگر گورکن خارج از صفحه است آن را حذف می‌کند. حلقه دوم بر اساس حذف احتمالی گورکن‌ها دوباره همه گورکن‌ها را روی صفحه نمایش ترسیم می‌کند.

برای استفاده از تابع تصادفی در کد بالا، باید کتابخانه random را نیز import کنید. بنابراین موارد زیر را به انتهای بخش شماره ۱ اضافه کنید:

import random

در نهایت، این خط کد زیر را بلافاصله بعد از عبارت while (بخش ۴) اضافه کنید تا مقدار badtimer برای هر فریم کاهش یابد:

badtimer-=1

با اجرای بازی تمام این کد را امتحان کنید. اکنون باید گیم پلی واقعی را مشاهده کنید – می‌توانید شلیک کنید، حرکت کنید، بپیچید و گورکن‌ها سعی می‌کنند به سمت قلعه‌ها حمله کنند.

ساخت گورکن های دشمن

اما صبر کنید! چرا گورکن‌ها به قلعه‌ها آسیب نمی‌زنند؟ بیایید سریع کد این قسمت را اضافه کنیم. این کد را درست قبل از index+= 1 در حلقه اول در بخش ۶.۳ اضافه کنید:

# ۶.۳.۱ - Attack castle
badrect=pygame.Rect(badguyimg.get_rect())
badrect.top=badguy[1]
badrect.left=badguy[0]
if badrect.left<64:
    healthvalue -= random.randint(5,20)
    badguys.pop(index)
# ۶.۳.۳ - Next bad guy

این کد نسبتاً ساده است. اگر مقدار x گورکن کمتر از ۶۴ در سمت راست باشد، آن گورکن را حذف کرده و مقدار سلامتی یا همان جان بازی را به صورت تصادفی بین ۵ تا ۲۰ کاهش می‌دهد (بعداً، مقدار جان یا سلامتی را روی صفحه نمایش خواهید دید) اگر برنامه اجرا کنید، باید گورکن‌های مهاجم، هنگام برخورد با قلعه ناپدید شوند. اگرچه شما نمی‌توانید آن را ببینید، اما گورکن‌ها در واقع از جان شما کم می‌کنند.

مرحله هفتم: برخورد تیر پیکان با گورکن

گورکن‌ها به قلعه شما حمله می‌کنند اما تیرهای شما تاثیری بر آنها ندارد! چگونه باید یک خرگوش از خانه خود دفاع کند؟

زمان آن است که پیکان‌ها را برای کشتن گورکن‌ها آماده کنید تا بتوانید از قلعه خود محافظت کرده و برنده بازی باشید! باید بررسی کرد که آیا تیرها و گورکن‌ها با هم برخورد می‌کنند یا خیر؟ اگر برخورد انجام شود، پس گورکن و پیکان را حذف کنید و یک واحد را به نسبت دقت یا همان امتیاز خود اضافه کنید. درست بعد از بخش ۶.۳.۱ ، این را اضافه کنید:

#۶.۳.۲ - Check for collisions
index1=0
for bullet in arrows:
    bullrect=pygame.Rect(arrow.get_rect())
    bullrect.left=bullet[1]
    bullrect.top=bullet[2]
    if badrect.colliderect(bullrect):
        acc[0]+=1
        badguys.pop(index)
        arrows.pop(index1)
    index1+=1

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

مرحله هشتم: اضافه کردن متریک زمان و مقدار جان

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

ساده‌ترین راه برای انجام این کار اضافه کردن یک HUD (Heads Up Display) است که سطح سلامت فعلی قلعه‌ها را نشان می‌دهد. همچنین می‌توانید یک ساعت اضافه کنید تا نشان دهد که قلعه چقدر زنده مانده است. ابتدا ساعت را اضافه کنید. کد زیر را درست قبل از شروع قسمت شماره ۷ اضافه کنید:

# ۶.۴ - Draw clock
font = pygame.font.Font(None, 24)
survivedtext = font.render(str(int((90000-pygame.time.get_ticks())/60000))+":"+str(int((90000-pygame.time.get_ticks())/1000%60)).zfill(2), True, (0,0,0))
textRect = survivedtext.get_rect()
textRect.topright=[635,5]
screen.blit(survivedtext, textRect)        

کد بالا به سادگی یک فونت جدید با استفاده از قلم PyGame پیش فرض تنظیم شده روی اندازه ۲۴ ایجاد می‌کند. سپس از آن فونت برای نمایش متن زمان بر روی سطح استفاده می‌شود. پس از آن، متن روی صفحه قرار می‌گیرد و ترسیم می‌شود. بعد نوار سلامتی health bar یا میزان جان را اضافه کنید. اما قبل از رسم health bar، باید تصاویر را برای نوار بارگذاری کنید. کد زیر را به انتهای بخش شماره ۳ اضافه کنید:

healthbar = pygame.image.load("resources/images/healthbar.png")
health = pygame.image.load("resources/images/health.png")

اولی تصویر قرمز رنگی است که برای نوار سلامت کامل استفاده می‌شود. تصویر دوم سبز است که برای نشان دادن سطح سلامت فعلی استفاده می‌شود. حالا کد زیر را بلافاصله بعد از بخش ۶.۴ (که به تازگی اضافه کرده اید) اضافه کنید تا نوار سلامت روی صفحه ترسیم شود:

# ۶.۵ - Draw health bar
screen.blit(healthbar, (5,5))
for health1 in range(healthvalue):
    screen.blit(health, (health1+8,8))

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

اضافه کردن متریک زمان و مقدار جان

مرحله نهم: برنده یا بازنده

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

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

اگر زمان تمام شد (۹۰۰۰۰ میلی ثانیه یا ۹۰ ثانیه) پس:

  • اجرای بازی را متوقف کنید
  • تیجه بازی را ۱ قرار دهید یعنی برنده شده‌اید

در صورت تخریب قلعه، موارد زیر را دنبال کنید:

  • اجرای بازی را متوقف کنید
  • نتیجه بازی را ۰ قرار دهید یعنی بازنده شده‌اید

دقت را در هر آخر محاسبه کنید و این خطوط را به انتهای game.py اضافه کنید:

    #۱۰ - Win/Lose check
    if pygame.time.get_ticks()>=90000:
        running=0
        exitcode=1
    if healthvalue<=0:
        running=0
        exitcode=0
    if acc[1]!=0:
        accuracy=acc[0]*1.0/acc[1]*100
    else:
        accuracy=0
# ۱۱ - Win/lose display        
if exitcode==0:
    pygame.font.init()
    font = pygame.font.Font(None, 24)
    text = font.render("Accuracy: "+str(accuracy)+"%", True, (255,0,0))
    textRect = text.get_rect()
    textRect.centerx = screen.get_rect().centerx
    textRect.centery = screen.get_rect().centery+24
    screen.blit(gameover, (0,0))
    screen.blit(text, textRect)
else:
    pygame.font.init()
    font = pygame.font.Font(None, 24)
    text = font.render("Accuracy: "+str(accuracy)+"%", True, (0,255,0))
    textRect = text.get_rect()
    textRect.centerx = screen.get_rect().centerx
    textRect.centery = screen.get_rect().centery+24
    screen.blit(youwin, (0,0))
    screen.blit(text, textRect)
while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit(0)
    pygame.display.flip()

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

البته، اگر می‌خواهید تصاویر را برای صفحه‌های برد و باخت نمایش دهید، ابتدا باید این تصاویر بارگذاری شوند. بنابراین کد زیر را به انتهای بخش شماره ۳ اضافه کنید:

gameover = pygame.image.load("resources/images/gameover.png")
youwin = pygame.image.load("resources/images/youwin.png")

و در بخش چهار تغییرات زیر را انجام دهید.

# ۴ - keep looping through
while 1:
    badtimer-=1

به جای کدهای بالا کدهای پایین را جایگزین کنید.

# ۴ - keep looping through
running = 1
exitcode = 0
while running:
    badtimer-=1

متغیر در حال اجرا بودن بازی را پیگیری می‌کند و متغیر کد خروجی پیروزی یا باخت بازیکن را پیگیری می‌کند. بازی را دوباره اجرا کنید و اکنون می‌توانید پیروز شوید یا ببازید.

برنده یا بازنده

مرحله دهم: اضافه کردن جلوه های صوتی

بازی بسیار خوب طراحی شده  اما سکوت در این بازی بسیار پر رنگ است! افزودن جلوه‌های صوتی می‌تواند کل احساس بازی را تغییر دهد. PyGame بارگیری و پخش صداها را بسیار ساده کرده است. ابتدا، این کد در انتهای بخش شماره ۲ وارد کنید کنید:

pygame.mixer.init()

سپس صداها را بارگذاری کرده و سطح صدا را در انتهای قسمت شماره ۳ تنظیم کنید:

# ۳.۱ - Load audio
hit = pygame.mixer.Sound("resources/audio/explode.wav")
enemy = pygame.mixer.Sound("resources/audio/enemy.wav")
shoot = pygame.mixer.Sound("resources/audio/shoot.wav")
hit.set_volume(0.05)
enemy.set_volume(0.05)
shoot.set_volume(0.05)
pygame.mixer.music.load('resources/audio/moonlight.wav')
pygame.mixer.music.play(-1, 0.0)
pygame.mixer.music.set_volume(0.25)

اکثر کدهای بالا به سادگی بارگیری فایل‌های صوتی و پیکربندی سطوح حجم صدا است. اما به خط pygame.mixer.music.load توجه کنید – آن خط موسیقی پس زمینه بازی را بارگذاری می‌کند و خط بعدی موسیقی پس زمینه را برای همیشه تکرار می‌کند. اکنون تنها کاری که باید انجام دهید این است که در صورت نیاز جلوه‌های صوتی مختلف را پخش کنید. طبق دستورات موجود در کد زیر این کار را انجام دهید:

# section 6.3.1 after if badrect.left<64:
hit.play()
# section 6.3.2 after if badrect.colliderect(bullrect):
enemy.play()
# section 8, after if event.type==pygame.MOUSEBUTTONDOWN:
shoot.play()

بازی را یکبار دیگر اجرا کنید. متوجه خواهید شد که اکنون موسیقی پس زمینه و جلوه‌های صوتی برای برخورد و تیراندازی دارید. با این کار بازی بسیار زنده‌تر به نظر می‌رسد.

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

سخن آخر

در این آموزش سعی شد نحوه ساخت بازی با پایتون آموزش داده شود. یک سناریو کامل از نحوه حرکت قهرمان بازی و حمله دشمنان پیاده سازی شد و در نهایت در ۱۰ مرحله بازی ساخته و اجرا شد. لازم به ذکر است کتابخانه قدرتمند pygame پایتون ابزارها و امکاناتی متنوعی برای بازی سازی دارد که شما در این آموزش تنها گوشه‌ای از این امکانات را مشاهده کردید.

در ضمن هدف از تکه تکه گذاشتن کدها و اضافه کردن کدهای برنامه در هر مرحله، فقط برای آموزش بهتر شما عزیزان بود اگر کدهای کامل این بازی در پایتون رو یکجا می‌خواهید می‌توانید از طریق این لینک (+) آن را دریافت کنید. در پایان خوشحال می‌شویم نظرات و پیشنهادات خود را با ما درمیان بگذارید. موفق و پیروز باشید.

30 پاسخ

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

  2. سلام برای من ارور میده
    ممنون میشم زود تر جواب بدید
    Traceback (most recent call last):
     File “C:\Users\Elecomp\Desktop\پایتون\game.py”, line 20, in <module>
      player = pygame.image.load(“resources/images/dude.png”)
    FileNotFoundError: No file ‘resources/images/dude.png’ found in working directory ‘C:\Users\Elecomp\Desktop\پایتون’.

  3. سلام وقت بخیر من بازی درست کردم ولی کد حرکت بازیو مینویسم خطا میده لطفا کمک میکنید
    اینم کد من
    import pygame,sys
    import pygame.locals as GAME_GLOBALS
    import pygame.event as GAME_EVENTS
    pygame.init()

    window=pygame.display.set_mode((500,600))
    pygame.display.set_caption('game1')

    x=0
    y=0
    speedx=2
    speedy=10

    a=10
    b=0

    wX=10
    wY=10

    flg=0

    wA=10
    wB=10

    while True:
      window.fill((50,205,50))
      pygame.draw.rect(window,(138,43,255),(x,y,wX,wY))
      pygame.draw.rect(window,(255,0,0),(a,b,10,10))

      x+=speedx

      if x > 499 - wX:
        y+=0
        speedx = -10

      if x < 0:
        y+=speedy
        speedx = +10

      if y > (1000 - 500):
        y = 0

      if b > (1000- 500):
        b = 0

      if x + 10 < a :
        wX+=1
        print(wX)
        print(x)
        b+=speedy
        flg=1

      print(y)

         
       
      #y+=speedy
      #print(x)
      #print(y)
      for event in GAME_EVENTS.get():
          if event.type==GAME_GLOBALS.QUIT:
             pygame.quit()
             sys.exit()

      pygame.display.update()

  4. سلام من وقتی اومدم برنامه رو اجرا کنم این ارور رو داد:Traceback (most recent call last):
     File “C:\game\Game\game.py”, line 2, in <module>
       import pygame
    ModuleNotFoundError: No module named ‘pygame’
    ممنون ممیشم سریع تر رسیدگی شود.

  5. جناب خیلی عالی بود خیلی خوشم اومد عالی بود بازم اموزش ساخت بازی بزارید برای درسم خیلی خوب است

    1. سلام و وقت بخیر
      بله می تونید با استفاده از فریم ورک kivy برای ساخت برنامه های موبایل با پایتون این کدها رو تبدیل کنید به برنامه های قایل اجرا در اندروید یا IOS. ولی خوب این کدها رو باید در ساختار فریم ورک Kivy بنویسید. پیشنهاد می کنیم دو مورد از آموزش های ما رو در این مورد مطالعه کنید.

  6. سلام خسته نباشید.
    فایل هایی رو که لوکیشن عکس و صدا رو نوشتید کلش غلطه.
    پشت تمامی فایل ها باید
    c:/Game
    باید اضافه کنید تا فایل هارو بخونه

    1. سلام
      لینک های این پست رو چک کردم مشکلی نداشتن، مجدد دانلود بفرمایید.
      اگر هنوز موفق به دانلود نشدید به تلگرام شماره موجود در تماس با ما پیام بدید بهتون بفرستیم.

  7. سلام من یک مشکلی دارم اینکه من اگر موس را تکان ندهم بازی می ایسته و وقتی حرکت میدهم بازی ادامه پیدا میکنه چیکار کنم؟

  8. سلام خسته نباشید
    دوتا مشکل داره
    1_فایل صدا برای برنده و بازنده نداره یا فایلتون لود نشده
    2_exitcode=0گذاشتین پس همیشه بازی در حالت گیم اوره

    1. سلام
      احتمالاً یکی از فایل ها رو جا انداختید یا پکیج مربوطه رو نصب نکردید چون ما دوباره امتحان کردیم هیچ مشکلی وجود نداشت.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

14 + هفده =