مقدمات اولیه و شروع کار
اگر می خواهید این آموزش را روی سیستم عامل ویندوز خود امتحان کنید و مراحل ساخت بازی با پایتون را یاد بگیرید، باید Python را نصب کنید. اگر در سیستم شما پایتون نصب نشده، میتوانید از مقاله آموزش نصب پایتون با عنوان مقدمات برنامه نویسی پایتون کمک بگیرید. سعی کنید طبق این آموزش جلو بروید و قبل از هر کاری برنامه کوچکی بنویسید و اجرا کنید تا از درست کار کردن پایتون بر روی سیستم عامل خود اطمینان داشته باشید.
اگر از نصب پایتون روی سیستم خودتان مطمئن شدید با استفاده از ابزار pip، کتابخانه pygame را روی پایتون خود نصب کنید. اگر در مورد نصب کتابخانه بر روی پایتون، اشکال دارید میتوانید آموزش نصب کتابخانه بر روی پایتون را مطالعه کنید. دستوری که برای نصب کتابخانه pygame وجود دارد دستور ساده زیر است.
pip install pygame
البته اگر قبلاً با پایتون کار کردهاید حتما میدانید که پایتون دارای IDEها و محیطهای برنامه نویسی متفاوتی است که میتوانید گام به گام این آموزش را از طریق آنها انجام دهید در هیمن سایت هم در مورد محیط های برنامه نویسی پایتون به طور کامل صحبت شده است. اما بنا را بر این میگذاریم که هیچ IDE در سیستم شما نصب نیست و از محیط پیش فرض پایتون برای برنامه نویسی و ساخت بازی با پایتون استفاده میکنیم.
برای تأیید نصب کتابخانه، IDLE پایتون را باز کنید و دستور import 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.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 فقط بررسی میکند که گلوله خارج از محدوده باشد و اگر باشد، پیکان را حذف میکند. دومی برای عبارت از فلشها عبور کرده و آنها را با چرخش صحیح ترسیم میکند.
حالا وقت آن رسیده دوباره برنامه را اجرا کنید. بازیکن بازی با استفاده از کلیک ماوس میتواند پیکانها را شلیک کند.
مرحله ششم: ساخت گورکن های دشمن
تا الان شما ۴ قلعه و یک قهرمان دارید که می تواند حرکت و شلیک کند. پس چه چیزی کم است؟ بله دشمنانی که به قلعه حمله میکنند و قهرمان میتواند به سمت آن شلیک کند! در این مرحله از ساخت بازی با پایتون، گورکنها یا دشمنان تصادفی تولید میشوند تا به قلعهها حمله کنند. با ادامه بازی تعداد بیشتری از گورکنها وجود خواهند داشت؛ بنابراین، بیایید لیستی از آنچه برای انجام آن نیاز دارید تهیه کنیم.
- اضافه کردن گورکنها را به لیستی از یک آرایه
- بررسی و بروز کردن گورکنها در هر فریم
- نمایش گورکنها
ابتدا کد زیر را به انتهای بخش شماره ۲ اضافه کنید:
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 پاسخ
سلام لینک عکس هارو باز نمیکنهچیکار کنم؟
سلام چرا برای من لینک ها رو باز نمیکنه؟
سلام من چرا نمیتونم فایل رو دانلود کنم
بخاطر اینکه با گوشی هستم یا دلیل دیگه ای داره؟
سلام خسته نباشید من نتوانستم فایل و دانلود کنم خطا می دهد چه کنم؟
سلام ببخشید سرعت گورکن ها زیاده چطوری کمش کنم؟
سلام چطور سرعت گورکن هارو کاهش بدم؟
سلام
من تو آخر صفحه که نوشته دانلود سورس کل بازی که خود سایت گذاشته رو میخوام دانلود کنم خطای ۴۰۴ میده انگار پیدا نمیکنه فایل رو یا اصلا وجود خارجی ندارد لطفا پیگیری کنید و مشکل زودتر برطرف بشه
سلام و وقت بخیر
لینک دانلود بررسی و بروزرسانی شد.
سپاس فراوان
سلام برای من ارور میده
ممنون میشم زود تر جواب بدید
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\پایتون’.
سلام. پوشه بازی رو در محل صحیحی قرار بدید و از vs code جهت اجرای بازی استفاده کنید.
ارور میده
Could not find a version that satisfies the requirement pygame
اگر pygame ایمپورت نشد دستگاهت رو به اینترنت متصل کن بزن
import os
os.system(“pip install pygame”)
شاید مشکلت حل شه
سلام وقت بخیر من بازی درست کردم ولی کد حرکت بازیو مینویسم خطا میده لطفا کمک میکنید
اینم کد من
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()
سلام من وقتی اومدم برنامه رو اجرا کنم این ارور رو داد:Traceback (most recent call last):
File “C:\game\Game\game.py”, line 2, in <module>
import pygame
ModuleNotFoundError: No module named ‘pygame’
ممنون ممیشم سریع تر رسیدگی شود.
اول کتابخانه رو نصب کن داداش
اسم ماژول اشتباهه
سلام خسته نباشید من pygame رو از cmd دانلود کردم و وقتی دستور import pygame رو میزنم یه اروری میده.
جناب خیلی عالی بود خیلی خوشم اومد عالی بود بازم اموزش ساخت بازی بزارید برای درسم خیلی خوب است
سلام میخواستم بدونم که بازی ساخته شده رو میشه خروجی گرفت برای اجرای روش گوشی امکان پذیر هست یا نه ؟
سلام و وقت بخیر
بله می تونید با استفاده از فریم ورک kivy برای ساخت برنامه های موبایل با پایتون این کدها رو تبدیل کنید به برنامه های قایل اجرا در اندروید یا IOS. ولی خوب این کدها رو باید در ساختار فریم ورک Kivy بنویسید. پیشنهاد می کنیم دو مورد از آموزش های ما رو در این مورد مطالعه کنید.
سلام
چرا تو لینک عکس ها میرم میگه پرمیشن برای انجام کار میخواد..
سلام
ببخشید چطور میتونم بازی رو برای دیگران نصب کنم.
و اینکه آیا برای تمام صفحه شدن بازی کد هست؟
سلام خسته نباشید.
فایل هایی رو که لوکیشن عکس و صدا رو نوشتید کلش غلطه.
پشت تمامی فایل ها باید
c:/Game
باید اضافه کنید تا فایل هارو بخونه
مهندس باید فایل Game.py رو بغل resource بزاری تا دیگ C:/Game نخواد
آموزش رو درست بخون
سلام وقت بخیر
میخواستم بگم که نمشه فایل هارو دانلود کرد، اصلا به صفحه دانلود نمیره، لینک دیگه ایی وجود داره؟
سلام
لینک های این پست رو چک کردم مشکلی نداشتن، مجدد دانلود بفرمایید.
اگر هنوز موفق به دانلود نشدید به تلگرام شماره موجود در تماس با ما پیام بدید بهتون بفرستیم.
سلام من یک مشکلی دارم اینکه من اگر موس را تکان ندهم بازی می ایسته و وقتی حرکت میدهم بازی ادامه پیدا میکنه چیکار کنم؟
سلام خسته نباشید
دوتا مشکل داره
1_فایل صدا برای برنده و بازنده نداره یا فایلتون لود نشده
2_exitcode=0گذاشتین پس همیشه بازی در حالت گیم اوره
سلام
احتمالاً یکی از فایل ها رو جا انداختید یا پکیج مربوطه رو نصب نکردید چون ما دوباره امتحان کردیم هیچ مشکلی وجود نداشت.