از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
آموزش PyGame – چگونه یک بازی Alien Abduction بسازیم
سرفصلهای مطلب
از زمانی که بچه بودم، دلم گرفته بود روی بازی های ویدیویی اولین تجربه من با کدنویسی شامل یک نوع پروژه وحشی بود – شبیه ساز مسابقات Tron در Quick Basic روی یک کامپیوتر قدیمی IBM (من تقریباً 6 ساله بودم، بنابراین واقعاً نمی فهمیدم چه کار می کنم).
با گذشت سالها از برنامه نویسی سریع به جلو بروید و اینجا هستم، هنوز نرم افزار می نویسم و وارد دنیای توسعه بازی می شوم.
با جاهای دیدنی من روی با تبدیل شدن به یک توسعه دهنده بازی مستقل، تصمیم گرفتم PyGame را کشف کنم، با توجه به تسلطم به Python با آموزش آن و همه چیز.
بعد از طوفان فکری فرود آمدم روی یک مفهوم عجیب و غریب: یک بازی که در آن شما به عنوان یک بیگانه در حال گشت و گذار در یک بشقاب پرنده بازی می کنید. ماموریت شما؟ هر هفته یک سهمیه آدم ربایی خاص را برای دور زدن تحریم های فدراسیون بین کهکشانی به دست آورید.
دروغ نمی گویم، من به شدت از “لونا لندر” قدیمی که در همان کامپیوتر قدیمی IBM داشتم الهام گرفتم.
چرا فکر میکنم ساخت بازیها از پروژه کدنویسی متوسط شما جالبتر است
بنابراین، تصور کنید که در حال کدنویسی هستید، و ناگهان به شما برخورد می کند – بازی ها! بله، ما در مورد چیزهایی صحبت می کنیم که صفحه نمایش را به یک جهان تعاملی تبدیل می کند که در آن شما فقط یک کدنویس نیستید – شما یک جادوگر هستید که جادوها (یا خطوط کد) را ایجاد می کند که باعث می شود اشیا حرکت کنند، شلیک کنند و بدون قانونی منفجر شوند. عواقب
چرا غواصی در توسعه بازی مانند یافتن سطح مخفی توسعه نرم افزار است:
- با یک هدف کد نویسی می کند: برنامه های خسته کننده را فراموش کنید – شما در حال ایجاد جهانی هستید که در آن بیگانگان گاو را می ربایند زیرا… چرا که نه؟
- دیگر خبری از کدنویسی گرگ تنها نیست: بازی ها به چیزی بیش از کد نیاز دارند. آنها همچنین به داستان ها، شخصیت ها و گرافیک های جالب نیاز دارند. ناگهان، شما فقط یک کدنویس نیستید – شما یک ارتش تک نفره هستید که بر طراحی، داستان سرایی و شاید کمی مهندسی صدا پیروز است.
- برای کدنویس ها مانند LEGO است: شما باید چیزهایی بسازید، بشکنید و دوباره بسازید! توسعه بازی تماماً در مورد آزمون و خطا است و آن را به LEGO پروژه های کدنویسی تبدیل می کند. چه کسی گفته است که اشکال زدایی نمی تواند سرگرم کننده باشد؟
- جشن خلاقیت: آیا تا به حال خواسته اید جهانی بسازید که گرانش به صورت یک طرفه کار کند و گاوها لباس فضایی بپوشند؟ در توسعه بازی، خلاقیت شما زیاد است.
- حل اسرار، نسخه کدنویسی: بازی ها با پازل همراه هستند. نه فقط برای بازیکنان، بلکه برای شما، مغز متفکر پشت صحنه. به این فکر کنید که رمان رمز نویسی خود را ایجاد می کنید که در آن هر اشکال یک پیچش طرح است که منتظر حل شدن است.
- با بازی یاد بگیرید: آن کتاب های درسی خسته کننده را به خاطر دارید؟ خب فراموششون کن با توسعه بازی، شما فقط در حال خواندن نیستید، بلکه در حال بازی هستید.
- مهارت های خود را نشان دهید: ساخت بازی فقط سرگرمی نیست. این در مورد خم کردن عضلات کدنویسی شماست. بازی شما جایزه شماست، نشان افتخار شما. تصور کنید که در یک مصاحبه شغلی با یک بازی که ساخته اید حاضر می شوید. حالا کی باحاله؟
بنابراین، وقتی میتوانید یک جهان بسازید، چرا به کدنویسی بسنده کنید؟ توسعه بازی جایی است که کدنویسی تبدیل به یک ماجراجویی حماسی می شود و شما، دوست من، قهرمان آن هستید. آماده ارتقاء سطح هستید؟
خوب، بیایید این بازی را با هم، گام به گام بسازیم و آن را به یک انفجار تبدیل کنیم! آیا نمی دانید وقتی همه چیز تمام شود، چگونه به نظر می رسد؟ این پیش نمایش جذاب را بررسی کنید:
فهرست مطالب:
- روش تنظیم محیط
- روش طراحی مفهوم بازی
- روش کدنویسی بازی
- نتیجه
روش تنظیم محیط
PyGame را نصب کنید
بیایید این سفر را با راه اندازی زمین بازی آغاز کنیم. ابتدا باید PyGame را نصب کنید. در اینجا یک راهنمای ساده برای شروع ارائه شده است.
1. یک دایرکتوری جدید ایجاد کنید
مورد علاقه خود را باز کنید terminal و به مکانی که می خواهید بازی خود را در آن نگه دارید بروید. یک دایرکتوری جدید برای پروژه خود ایجاد کنید. بیا اسمش را بگذاریم”بازی AlienAbduction.“
mkdir AlienAbductionGame
2. به دایرکتوری پروژه بروید
به دایرکتوری تازه ایجاد شده خود بروید.
cd AlienAbductionGame
3. PyGame را نصب کنید
pip install pygame
عالی! اکنون به PyGame مسلح شده اید و آماده ورود به کدنویسی هستید.
چه چیز دیگری برای شروع نیاز دارید؟
شما قبلا پایتون را با PyGame نصب کرده اید روی کامپیوتر شما. بنابراین، آخرین چیزی که نیاز دارید ویرایشگر کد مورد علاقه شماست. استفاده میکنم و توصیه میکنم Visual Studio Code، اما می توانید از هر ویرایشگر دیگری که دوست دارید یا با آن احساس راحتی می کنید استفاده کنید.
هنگامی که همه چیز را نصب کردید و ویرایشگر خود را آماده کردید، بیایید با درک مفهوم بازی و مکانیزم آن شروع کنیم.
روش طراحی مفهوم بازی
ایده بازی: ماجراجویی ربوده شدن بیگانه
این را تصور کنید: شما یک خلبان بیگانه هستید که با بشقاب پرنده قابل اعتماد خود در کیهان در حال گشت و گذار هستید. متأسفانه شما عقب افتاده اید روی سهمیه هفتگی آدم ربایی شما، و فدراسیون بین کهکشانی چندان راضی نیست. برای جلوگیری از جریمه کیهانی، باید اهداف مختلفی را ربودید روی زمین.
مکانیک
سهمیه و سطوح آدم ربایی:
در شروع هر سطح، یک سهمیه آدم ربایی مشخص به شما داده می شود. این نشان دهنده تعداد گاوهایی است که برای پیشرفت باید ربوده شوید.
این بازی از ده سطح تشکیل شده است که هر کدام دارای سهمیه فزاینده ای هستند. با تکمیل یک سطح، قفل بعدی باز می شود و شمارنده سهمیه مجدداً راه اندازی می شود.
کنترل یوفو:
از کلیدهای جهتنما یا کنترلهای دلخواه خود برای پیمایش UFO در سراسر صفحه بازی استفاده کنید.
حرکات دقیق برای آدم ربایی موفق بسیار مهم است. تسلط بر کنترل ها، دستیابی به هدف کارآمد را تضمین می کند.
اهداف – گاوهای شایان ستایش:
اهداف، گاوهای جذاب و پیکسلی هستند که سرگردان هستند روی سطح زمین شما به یک گاو نزدیک می شوید، پرتو تراکتور خود را فعال می کنید (نوار فاصله) و ناپدید شدن گاو را از صفحه نمایش خود تماشا می کنید.
مکانیک تیر تراکتور:
برای فعال کردن پرتو تراکتور، که از بشقاب پرنده شما تا زمین امتداد دارد، کلید فاصله را فشار می دهید.
هنگامی که پرتو به گاو برخورد می کند، باعث ربودن می شود process، و گاو ناپدید می شود و امتیاز و سهمیه آدم ربایی شما افزایش می یابد.
تایمر و فوریت:
هر سطح دارای یک تایمر شمارش معکوس است که به آدم ربایی های شما احساس فوریت می بخشد.
رسیدن موفقیت آمیز به سهمیه آدم ربایی قبل از اینکه تایمر به صفر برسد، پیشرفت به سطح بعدی را تضمین می کند.
روش تصمیم گیری روی عناصر بازی (سفینه فضایی، اهداف و غیره). روی)
وقتی نوبت به انتخاب عناصر بازی میرسد، سادگی مهم است. هر چه ساده تر، بهتر. بنابراین، بیایید نگاهی بیندازیم به آنچه برای کارکرد مکانیک بازی نیاز دارید.
- سفینه فضایی (UFO):
- به جای طرح های پیچیده، تمرکز کنید روی یک جن یوفو متمایز، یک جن زیبا
- حرکات صاف و پاسخگویی به کنترل های بازیکن را در اولویت قرار دهید.
2. اهداف (گاو):
- یک جن گاو بامزه را انتخاب کنید که با طنز بازی هماهنگ باشد.
- تغییر رنگ گاو را در هنگام ربوده شدن در نظر بگیرید – یک حباب قرمز به معنای ربوده شدن کدگذاری می کنید.
3. زمینه و محیط:
- یک پسزمینه تمیز و ساده داشته باشید، رنگبندی را مطابق با پیشرفت بازی تنظیم کنید.
- به تدریج رنگ ستاره را با هر سطح تغییر دهید تا به معنای پیشرفت باشد.
4. تیر تراکتور:
- مطمئن شوید که تیر تراکتور از نظر بصری قابل تشخیص است. شما می توانید با رنگ زرد ساده و در عین حال موثر آزمایش کنید.
5. شاخص های سطح:
- یک نشانگر سطح ساده برای نمایش سطح فعلی پیاده سازی کنید. این می تواند یک بخش کوچک در گوشه صفحه باشد.
6. صفحه نمایش بازی و پیروزی:
- صفحه نمایش های ساده ای را طراحی کنید که نشان دهنده موفقیت یا شکست است. یک «بازی تمام شد» و «شما برنده میشوید» ساده با متن همراه، مانند موارد زیر کافی است.
روش کدنویسی بازی
مرور بخشهای کلیدی کد
اکنون که مفهوم و درک واضحی از مکانیک بازی و عناصر آن دارید، وقت آن است که وارد کد شوید. ما از طریق بخش های کلیدی کد حرکت می کنیم.
ابتدا، بیایید با وارد کردن مواردی که برای کدنویسی بازی خود نیاز دارید، شروع کنیم:
import pygame
import random
import sys
در این بخش، سه ماژول را وارد میکنید: pygame
، random
، و sys
.
- pygame: این کتابخانه اصلی است که برای ایجاد بازی از آن استفاده می کنید. این توابع و ابزارهایی را برای مدیریت گرافیک، ورودی کاربر و موارد دیگر فراهم می کند.
- تصادفی: شما از این ماژول برای تولید اعداد تصادفی استفاده خواهید کرد. این زمانی مفید است که بخواهید اتفاقات غیرقابل پیش بینی رخ دهد، مانند موقعیت اولیه اهداف.
- sys: این ماژول دسترسی به برخی از متغیرهای مورد استفاده یا نگهداری شده توسط مفسر پایتون و توابعی که به شدت با مفسر تعامل دارند را فراهم می کند. شما از آن برای رسیدگی به رویدادهای سیستم استفاده خواهید کرد، مانند ترک بازی زمانی که بازیکن پنجره را می بندد.
بنابراین، شما اساساً با ابزارهای مورد نیاز خود آماده میشوید تا بازی را از نظر بصری جذاب، پویا و پاسخگو به ورودی بازیکن کنید.
روش کدنویسی صفحه شروع
def start_screen(screen):
# Constants
WIDTH, HEIGHT = 800, 600
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
FONT_SIZE = 30
# Font for displaying the text
font = pygame.font.Font(None, FONT_SIZE)
# Fill the screen with the background color
screen.fill(BLACK)
# Introduction text
intro_text = [
"Welcome, Alien Abductor!",
"You're behind on your weekly quota of abductions.",
"Help the alien catch up by abducting targets on Earth!",
"",
"----------------------------------------------------------------------------------------------",
"Move the UFO with ARROWS and",
"press SPACE to abduct cows with the track bean.",
"----------------------------------------------------------------------------------------------",
"",
"Press any key to start the game...",
"",
]
# Render and display the introduction text
y_position = HEIGHT // 4
for line in intro_text:
text = font.render(line, True, WHITE)
text_rect = text.get_rect(center=(WIDTH // 2, y_position))
screen.blit(text, text_rect)
y_position += FONT_SIZE
pygame.display.flip()
# Wait for a key press to start the game
wait_for_key()
def wait_for_key():
waiting = True
while waiting:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
waiting = False
توضیح کد:
- این
start_screen
تابع طول می کشدscreen
پارامتر، که پنجره Pygame است که در آن مقدمه ما را نمایش خواهید داد. برخی از ثابت ها را برای ابعاد صفحه نمایش، رنگ ها و اندازه فونت تنظیم می کند. - صفحه با پس زمینه سیاه پر شده است.
- یک متن مقدمه در تعریف شده است
intro_text
، یک پیام خوشامدگویی، دستورالعمل ها و یک اعلان برای شروع بازی ارائه می دهد. - با استفاده از قابلیت فونت Pygame، متن رندر و نمایش داده می شود روی صفحه نمایش
- سپس تابع منتظر می ماند تا با فشردن کلید، بازی را با فراخوانی شروع کند
wait_for_key
تابع. - این
wait_for_key
تا زمانی که یک کلید فشار داده شود یا کاربر پنجره را ببندد، عملکرد حلقه می شود. اگر یک کلید فشار داده شود، حلقه خارج می شود و صفحه معرفی ناپدید می شود.
بنابراین، در حال حاضر، شما باید چیزی شبیه به این داشته باشید:
روش ساخت متن روی عملکرد صفحه نمایش
حالا بیایید به بلوک کد زیر نگاه کنیم:
def show_text_on_screen(screen, text, font_size, y_position):
font = pygame.font.Font(None, font_size)
text_render = font.render(text, True, (255, 255, 255))
text_rect = text_render.get_rect(center=(WIDTH // 2, y_position))
screen.blit(text_render, text_rect)
این کد یک تابع را تعریف می کند show_text_on_screen
که یک پیام متنی را نمایش می دهد روی پنجره Pygame بیایید آن را تجزیه کنیم:
- تابع چهار پارامتر دارد:
screen
: پنجره Pygame که متن در آن نمایش داده می شودtext
: پیام یا رشته متنی که قرار است نمایش داده شود.font_size
: اندازه فونت برای متن.y_position
: موقعیت عمودی روی صفحه ای که متن در مرکز آن قرار می گیرد.
- یک شی فونت Pygame با اندازه مشخص شده ایجاد می کند.
- با استفاده از شی فونت، متن را با رنگ سفید (
(255, 255, 255)
نشان دهنده مقادیر RGB برای رنگ سفید). - این
get_rect
روش برای بدست آوردن ناحیه مستطیلی که متن رندر شده را در بر می گیرد استفاده می شود. مرکز این مستطیل قرار است در مرکز افقی و موقعیت عمودی مشخص شده باشد. - در نهایت، متن رندر شده در موقعیت مشخص شده بر روی صفحه نمایش داده می شود.
- این عملکرد یک راه راحت برای نمایش پیام های متنی فراهم می کند روی صفحه نمایش با اندازه فونت مشخص و موقعیت عمودی.
روش کدنویسی صفحه “Game Over”.
اکنون، یک بازی را روی صفحه کدنویسی میکنید، بنابراین ادامه دهید و بلوک کد بعدی را بررسی کنید:
def game_over_screen(screen):
screen.fill((0, 0, 0)) # Fill the screen with black
show_text_on_screen(screen, "Game Over", 50, HEIGHT // 3)
show_text_on_screen(screen, f"Your final score: {score}", 30, HEIGHT // 2)
show_text_on_screen(screen, "Press any key to exit...", 20, HEIGHT * 2 // 3)
pygame.display.flip()
wait_for_key()
جدا کردن بازی از روی صفحه نمایش:
screen.fill((0, 0, 0))
: کل پنجره Pygame را با پس زمینه سیاه پر می کند.show_text_on_screen(screen, "Game Over", 50, HEIGHT // 3)
: متن “Game Over” را با فونت 50 به صورت عمودی در یک سوم ارتفاع صفحه نمایش می دهد.show_text_on_screen(screen, f"Your final score: {score}", 30, HEIGHT // 2)
: امتیاز نهایی بازیکن را با فونت 30 به صورت عمودی در نیمی از ارتفاع صفحه نمایش می دهد.show_text_on_screen(screen, "Press any key to exit...", 20, HEIGHT * 2 // 3)
: دستورالعمل فشار دادن هر کلید برای خروج با فونت 20 را نشان می دهد که به صورت عمودی در دو سوم ارتفاع صفحه در مرکز قرار دارد.pygame.display.flip()
: نمایشگر را برای نمایش تغییرات به روز می کند.wait_for_key()
: قبل از ادامه کار منتظر فشردن کلید میماند، و عملاً باعث میشود صفحه تا زمانی که پخشکننده تعامل برقرار کند، باقی بماند.
این تابع برای نشان دادن یک بازی روی صفحه با اطلاعات مرتبط مانند امتیاز نهایی و دستورالعمل خروج استفاده می شود، چیزی که تا به حال باید شبیه به این باشد:
شما برنده می شوید! روش کدنویسی صفحه پیروزی 🙂
و در آخر، شما صفحه پیروزی را دارید، پس بیایید نگاهی به کد صفحه بیندازیم:
def victory_screen(screen):
screen.fill((0, 0, 0)) # Fill the screen with black
show_text_on_screen(screen, "Congratulations!", 50, HEIGHT // 3)
show_text_on_screen(screen, f"You've completed all levels with a score of {score}", 30, HEIGHT // 2)
show_text_on_screen(screen, "Press any key to exit...", 20, HEIGHT * 2 // 3)
pygame.display.flip()
wait_for_key()
توضیح کد:
screen.fill((0, 0, 0))
: کل پنجره Pygame را با پس زمینه سیاه پر می کند.show_text_on_screen(screen, "Congratulations!", 50, HEIGHT // 3)
: متن “تبریک!” با اندازه فونت 50، وسط عمودی در یک سوم ارتفاع صفحه نمایش.show_text_on_screen(screen, f"You've completed all levels with a score of {score}", 30, HEIGHT // 2)
: یک پیام تبریک با امتیاز نهایی بازیکن و اندازه فونت 30 به صورت عمودی در نیمی از ارتفاع صفحه نمایش را نمایش می دهد.show_text_on_screen(screen, "Press any key to exit...", 20, HEIGHT * 2 // 3)
: دستورالعمل فشار دادن هر کلید برای خروج با فونت 20 را نشان می دهد که به صورت عمودی در دو سوم ارتفاع صفحه در مرکز قرار دارد.pygame.display.flip()
: نمایشگر را برای نمایش تغییرات به روز می کند.wait_for_key()
: قبل از ادامه کار منتظر فشردن کلید میماند، و عملاً باعث میشود صفحه تا زمانی که پخشکننده تعامل برقرار کند، باقی بماند.
این تابع برای نمایش صفحه پیروزی با پیام تبریک و امتیاز نهایی بازیکن استفاده می شود.
بنابراین اکنون شما شروع بازی را دارید، صفحههایی که برای برقراری ارتباط با بازیکن استفاده میکنید.
بیایید چند اسپرایت بسازیم
در مرحله بعد، پارامترهای پایه مانند اندازه پنجره، اسپرایت ها (یوفو و گاو)، رنگ ها، ستاره ها و غیره را کدگذاری خواهید کرد. روی.
به بلوک کد زیر نگاهی بیندازید:
# Load spaceship and cow images
ovni = pygame.image.load("ovni.png")
cow = pygame.image.load("cow.png")
# Resize images if needed
ovni = pygame.transform.scale(ovni, (50, 50))
cow = pygame.transform.scale(cow, (40, 40))
# Initialize Pygame
pygame.init()
# Constants
WIDTH, HEIGHT = 800, 600
FPS = 60
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
YELLOW = (255, 255, 0)
GRAY = (169, 169, 169)
ORANGE = (255, 165, 0)
LIGHT_BLUE = (173, 216, 230) # Light blue color for the level indicator
SHIP_GREEN = (0, 255, 0) # Green color for the ship
GRASS_GREEN = (0, 100, 0) # Darker green color for the grass
STAR_COUNT = int(WIDTH * HEIGHT * 0.001)
توضیح کد:
ovni = pygame.image.load("ovni.png")
وcow = pygame.image.load("cow.png")
: سفینه فضایی (ovni) و تصاویر گاو را از فایل ها بارگیری کنید.ovni = pygame.transform.scale(ovni, (50, 50))
وcow = pygame.transform.scale(cow, (40, 40))
: در صورت نیاز اندازه تصاویر را تغییر دهید. در این حالت، اندازه سفینه فضایی به عرض و ارتفاع 50 پیکسل و اندازه گاو به عرض و ارتفاع 40 پیکسل تغییر می کند.pygame.init()
: Pygame را راه اندازی می کند.
ثابت ها:
WIDTH, HEIGHT = 800, 600
: عرض و ارتفاع پنجره بازی را تنظیم می کند.FPS = 60
: فریم در ثانیه بازی را تنظیم می کند.- رنگ ها:
BLACK, WHITE, RED, YELLOW, GRAY, ORANGE
: ثابت های رنگ را با استفاده از مقادیر RGB تعریف کنید.LIGHT_BLUE, SHIP_GREEN, GRASS_GREEN
: ثابت های رنگ اضافی برای عناصر خاص. STAR_COUNT
: تعداد ستاره ها را بر اساس محاسبه می کند روی اندازه پنجره
این بخش تنظیمات تصاویر سفینه فضایی و گاو را انجام می دهد و اندازه آنها را در صورت نیاز تنظیم می کند. همچنین ثابت هایی را برای جنبه های مختلف بازی ایجاد می کند.
مراحل بعدی شامل ایجاد پنجره بازی و پیاده سازی کنترل های بازیکن، تشخیص برخورد و سایر عناصر ضروری گیم پلی است.
روش کدنویسی پنجره بازی و تنظیم FPS
# Create the game window
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Alien Abduction Game")
# Clock to control the frame rate
clock = pygame.time.Clock()
# Player (alien spaceship)
player_rect = pygame.Rect(WIDTH // 2 - 25, 10, 50, 50)
player_speed = 5
# List to store targets (animals)
targets = []
# Set initial score
score = 0
# Font for displaying the score, level, and timer
font = pygame.font.Font(None, 36)
# Flag to track if spacebar is pressed
space_pressed = False
# List to store stars
stars = [{'x': random.randint(0, WIDTH), 'y': random.randint(0, HEIGHT), 'size': random.randint(1, 3),
'color': LIGHT_BLUE} for _ in range(STAR_COUNT)]
# Grassy area at the bottom
grass_rect = pygame.Rect(0, HEIGHT - 40, WIDTH, 40)
# Level and Countdown Variables
current_level = 1
abduction_target = 10 # Initial target
countdown_timer = 60 # Initial countdown timer in seconds
current_score = 0 # New counter to track the score for the current level
# Counter to control the pace of target appearances
target_spawn_counter = 0
TARGET_SPAWN_RATE = max(30, 120 - (current_level * 90)) # Adjust the rate based روی the current level
# List of colors for each level
level_colors = [
LIGHT_BLUE,
ORANGE,
RED,
YELLOW,
GRAY,
(0, 255, 0), # Green
(255, 0, 255), # Purple
(0, 255, 255), # Cyan
(255, 165, 0), # Orange
(128, 0, 128), # Indigo
]
توضیح کد:
ایجاد پنجره بازی:
screen = pygame.display.set_mode((WIDTH, HEIGHT))
: این خط پنجره بازی را با عرض و ارتفاع مشخص ایجاد می کند.pygame.display.set_caption("Alien Abduction Game")
: عنوان یا عنوان پنجره بازی را تنظیم می کند.
ساعت برای نرخ فریم:
clock = pygame.time.Clock()
: یک شی ساعت را برای کنترل نرخ فریم بازی راه اندازی می کند.
بازیکن (سفینه فضایی بیگانه):
player_rect = pygame.Rect(WIDTH // 2 - 25, 10, 50, 50)
: یک ناحیه مستطیلی برای بازیکن (سفینه فضایی بیگانه) در مرکز بالای پنجره تعریف می کند.player_speed = 5
: سرعت حرکت بازیکن را تنظیم می کند.
اهداف (حیوانات):
targets = []
: یک لیست خالی را برای ذخیره اهداف (حیوانات) راه اندازی می کند.
نمره:
score = 0
: امتیاز را صفر می کند.
فونت برای نمایش متن:
font = pygame.font.Font(None, 36)
: یک شی فونت برای نمایش امتیاز، سطح و تایمر ایجاد می کند.
پرچم فشار داده شده Spacebar:
space_pressed = False
: یک پرچم را برای ردیابی فشار دادن کلید فاصله راه اندازی می کند.
ستاره ها:
stars = [...]
: فهرستی از ستاره ها را با موقعیت ها، اندازه ها و رنگ های تصادفی ایجاد می کند. این برای ایجاد پس زمینه ستاره ای استفاده می شود.
منطقه علفزار در پایین:
grass_rect = pygame.Rect(0, HEIGHT - 40, WIDTH, 40)
: یک ناحیه مستطیلی در پایین برای پس زمینه چمنی تعریف می کند.
متغیرهای سطح و شمارش معکوس:
current_level = 1
: بازی را در سطح 1 راه اندازی می کند.abduction_target = 10
: هدف اولیه آدم ربایی را تعیین می کند.countdown_timer = 60
: تایمر شمارش معکوس اولیه را در چند ثانیه تنظیم می کند.current_score = 0
: یک شمارنده برای ردیابی امتیاز برای سطح فعلی راه اندازی می کند.
شمارشگر تخمگذاری هدف:
target_spawn_counter = 0
: یک شمارنده را برای کنترل سرعت ظاهر شدن هدف راه اندازی می کند.
نرخ تخم ریزی هدف:
TARGET_SPAWN_RATE = max(30, 120 - (current_level * 90))
: نرخ ظاهر هدف را بر اساس تنظیم می کند روی سطح فعلی
رنگ برای هر سطح:
level_colors = [...]
: لیستی از رنگ ها را برای هر سطح تعریف می کند که در بازی استفاده می شود.
این متغیرها و تنظیمات، وضعیت اولیه بازی را تعیین می کند، بازیکن، اهداف، سیستم امتیازدهی و عناصر بصری را تعریف می کند. بازی شما تکامل خواهد یافت و بر اساس اقدامات بازیکن پاسخ خواهد داد روی این شرایط اولیه
روش کدنویسی مکانیسم های بازی
به این توابع که برای اجرای بازی استفاده خواهید کرد نگاهی بیندازید. سعی کنید قبل از کپی و پیست کردن کد آن را خودتان کد کنید. این به شما در درک تفکر کمک می کند process بین مکانیک و کد واقعی.
# Function to display the start screen
start_screen(screen)
# Main game loop
running = True
game_started = False # Flag to track whether the game has started
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN:
if game_started:
game_started = True # Set the flag to True to avoid calling start_screen repeatedly
continue # Skip the rest of the loop until the game has started
elif event.key == pygame.K_SPACE:
space_pressed = True
elif event.type == pygame.KEYUP and event.key == pygame.K_SPACE:
space_pressed = False
keys = pygame.key.get_pressed()
# Move the player
player_rect.x += (keys[pygame.K_RIGHT] - keys[pygame.K_LEFT]) * player_speed
player_rect.y += (keys[pygame.K_DOWN] - keys[pygame.K_UP]) * player_speed
# Ensure the player stays within the screen boundaries
player_rect.x = max(0, min(player_rect.x, WIDTH - player_rect.width))
player_rect.y = max(0, min(player_rect.y, HEIGHT - player_rect.height))
# Spawn a new target based روی the counter
target_spawn_counter += 1
if target_spawn_counter >= TARGET_SPAWN_RATE:
target_rect = pygame.Rect(random.randint(0, WIDTH - 20), HEIGHT - 50, 50, 50)
targets.append(target_rect)
target_spawn_counter = 0
# Update star glow animation and color for the current level
for star in stars:
star['size'] += 0.05
if star['size'] > 3:
star['size'] = 1
star['color'] = level_colors[current_level - 1]
توضیح کد:
نمایش صفحه شروع:
start_screen(screen)
: تماس می گیردstart_screen
عملکرد برای نمایش صفحه شروع اولیه.
حلقه اصلی بازی:
running = True
: یک پرچم را برای کنترل حلقه اصلی بازی راه اندازی می کند.game_started = False
: یک پرچم را برای ردیابی اینکه آیا بازی شروع شده است یا خیر، راه اندازی می کند.
مدیریت رویداد:
- حلقه از طریق رویدادهای pygame تکرار می شود تا ورودی کاربر و رویدادهای پنجره را بررسی کند.
pygame.QUIT
: اگر کاربر پنجره بازی را ببندد،running
پرچم تنظیم شده استFalse
، خروج از بازیpygame.KEYDOWN
: اگر یک کلید فشار داده شود:- اگر بازی شروع شده است (
game_started
استTrue
) از حلقه رد می شود و از تماس های مکرر با صفحه شروع جلوگیری می کند. - اگر فاصله (
pygame.K_SPACE
) فشار داده شده و بازی شروع نشده است،space_pressed
تنظیم شده استTrue
. pygame.KEYUP
: اگر یک کلید آزاد شود:- اگر کلید آزاد شده کلید فاصله باشد،
space_pressed
تنظیم شده استFalse
.
حرکت بازیکن:
- موقعیت بازیکن (
player_rect
) بر اساس به روز رسانی می شود روی ورودی کلید فلش - مختصات x بازیکن با تفاوت بین کلیدهای جهت دار راست و چپ ضرب در سرعت بازیکن تنظیم می شود.
- مختصات y بازیکن با تفاوت بین کلیدهای جهت پایین و بالا ضربدر سرعت پخش کننده تنظیم می شود.
- موقعیت بازیکن محدود به ماندن در محدوده های صفحه است.
اهداف تخم ریزی:
- یک شمارنده (
target_spawn_counter
) در هر تکرار افزایش می یابد. - اگر شمارنده از نرخ تخم ریزی هدف تجاوز کند (
TARGET_SPAWN_RATE
، یک هدف جدید در یک مختصات x تصادفی در عرض صفحه و یک مختصات y ثابت بالای لبه پایین صفحه ایجاد می شود. - هدف با یک مستطیل (
target_rect
) بهtargets
فهرست - شمارنده تنظیم مجدد می شود.
به روز رسانی انیمیشن ستاره:
- انیمیشن ستاره ها با افزایش اندازه آنها به روز می شود. اگر اندازه از 3 بیشتر شود، به 1 بازنشانی می شود.
- رنگ هر ستاره بر اساس تنظیم می شود روی سطح فعلی
این بخش از کد ورودی کاربر، حرکت بازیکن، تخم ریزی هدف، و به روز رسانی انیمیشن ستاره را کنترل می کند. این یک جزء حیاتی از حلقه بازی است که از تعامل و پیشرفت بازیکن در بازی اطمینان می دهد.
روش رندر کردن عناصر بازی (بازیکن، دارایی ها و غیره). روی)
قسمت بعدی کد، رندر عناصر بازی را انجام می دهد روی صفحه نمایش، از جمله ستاره ها، منطقه چمن، سفینه فضایی بازیکن، و اهداف. همچنین ترسیم تیر تراکتور را مدیریت می کند و برخورد بین تیر تراکتور و اهداف را مدیریت می کند.
# Clear the screen
screen.fill(BLACK)
# Draw stars with level-based color
for star in stars:
pygame.draw.circle(screen, star['color'], (star['x'], star['y']), int(star['size']))
# Draw the grassy area
pygame.draw.rect(screen, GRASS_GREEN, grass_rect)
# Draw the player and targets
screen.blit(ovni, player_rect)
for target in targets:
screen.blit(cow, target)
# Draw the tractor beam when spacebar is pressed
if space_pressed:
tractor_beam_rect = pygame.Rect(player_rect.centerx - 2, player_rect.centery, 4, HEIGHT - player_rect.centery)
pygame.draw.line(screen, YELLOW, (player_rect.centerx, player_rect.centery),
(player_rect.centerx, HEIGHT), 2)
# Check for collisions with targets
for target in targets[:]:
if tractor_beam_rect.colliderect(target):
# Change the color of the tractor beam to yellow
pygame.draw.line(screen, YELLOW, (player_rect.centerx, player_rect.centery),
(player_rect.centerx, target.bottom), 2)
# Change the color of the target to red
pygame.draw.rect(screen, RED, target)
targets.remove(target)
current_score += 1
score += 1
توضیح کد:
پاک کردن صفحه:
screen.fill(BLACK)
: کل صفحه را با یک رنگ سیاه پر می کند و به طور موثر فریم قبلی را پاک می کند.
ترسیم ستاره ها:
- از طریق لیست ستاره ها تکرار می شود (
stars
) و هر ستاره را به صورت دایره ای ترسیم می کند روی صفحه نمایش - رنگ دایره با ویژگی رنگ ستاره تعیین می شود و موقعیت و اندازه آن بر اساس آن است روی مختصات و اندازه x و y ستاره.
ترسیم منطقه چمن:
pygame.draw.rect(screen, GRASS_GREEN, grass_rect)
: یک مستطیل که نمایانگر ناحیه چمنی در پایین صفحه است، ترسیم می کند. رنگ تنظیم شده استGRASS_GREEN
.
قرعه کشی بازیکن و اهداف:
screen.blit(ovni, player_rect)
: سفینه فضایی بازیکن را می کشد (ovni
) روی صفحه نمایش در موقعیت مشخص شده توسطplayer_rect
.for target in targets: screen.blit(cow, target)
: هر هدف (گاو) را ازtargets
فهرست روی صفحه نمایش در موقعیت های مربوطه خود.
ترسیم پرتو تراکتور (هنگامی که Spacebar فشار داده می شود):
- چک می کند که آیا کلید فاصله فشار داده شده است (
space_pressed
استTrue
). - اگر درست باشد،
tractor_beam_rect
: یک مستطیل به نمایندگی از تیر تراکتور ایجاد می کند روی موقعیت بازیکن pygame.draw.line
: یک خط زرد نشان دهنده پرتو تراکتور از مرکز بازیکن تا پایین صفحه میکشد.- بررسی برخورد بین تیر تراکتور و اهداف.
- در صورت تشخیص برخورد، هدف حذف می شود، رنگ پرتو تراکتور به زرد و رنگ هدف به قرمز تغییر می کند.
- امتیاز به روز می شود.
منطق بازی
اکنون تقریباً کارتان تمام شده است – اما ابتدا باید مقداری منطق به بازی اضافه کنید مانند تایمر شمارش معکوس که به شما یک دقیقه در هر سطح می دهد. شما همچنین باید مانند یک نوار ناوبری، یک نوار ساده با چهار عنصر که شامل امتیاز کلی، نشانگر سطح، تایمر و آدم ربایی است، بکشید.
در اینجا روش انجام همه این موارد آمده است:
info_line_y = 10 # Adjust the vertical position as needed
info_spacing = 75 # Adjust the spacing as needed
# Draw the score in an orange rectangle at the top left
score_text = font.render(f"Score: {score}", True, WHITE)
score_rect = score_text.get_rect(topleft=(10, info_line_y))
pygame.draw.rect(screen, ORANGE, score_rect.inflate(10, 5))
screen.blit(score_text, score_rect)
# Draw the level indicator in a light-blue rectangle at the top left (next to the score)
level_text = font.render(f"Level: {current_level}", True, WHITE)
level_rect = level_text.get_rect(topleft=(score_rect.topright[0] + info_spacing, info_line_y))
pygame.draw.rect(screen, LIGHT_BLUE, level_rect.inflate(10, 5))
screen.blit(level_text, level_rect)
# Draw the countdown timer in a red rectangle at the top left (next to the level)
timer_text = font.render(f"Time: {int(countdown_timer)}", True, WHITE)
timer_rect = timer_text.get_rect(topleft=(level_rect.topright[0] + info_spacing, info_line_y))
pygame.draw.rect(screen, RED, timer_rect.inflate(10, 5))
screen.blit(timer_text, timer_rect)
# Draw the targets to acquire for the current level in a gray rectangle at the top left (next to the timer)
targets_text = font.render(f"Abductions: {current_score}/{abduction_target}", True, WHITE)
targets_rect = targets_text.get_rect(topleft=(timer_rect.topright[0] + info_spacing, info_line_y))
pygame.draw.rect(screen, GRAY, targets_rect.inflate(10, 5))
screen.blit(targets_text, targets_rect)
# Update the display
pygame.display.flip()
# Cap the frame rate
clock.tick(FPS)
توضیح کد:
موقعیت یابی خط اطلاعات:
info_line_y = 10
: موقعیت عمودی خط اطلاعات در بالای صفحه را مشخص می کند.info_spacing = 75
: فاصله بین اطلاعات مختلف را تنظیم می کند روی خط
امتیاز قرعه کشی:
score_text
: متن امتیاز را با استفاده از فونت بازی ارائه می دهد.score_rect
: مستطیلی را که متن امتیاز ارائه شده را در بر می گیرد، بازیابی می کند.pygame.draw.rect
: یک مستطیل نارنجی در اطراف متن نمره می کشد و پس زمینه ایجاد می کند.screen.blit(score_text, score_rect)
: متن امتیاز را بر روی صفحه نمایش می دهد (رندر می کند).
نشانگر سطح ترسیم:
level_text
: متن نشانگر سطح را ارائه می دهد.level_rect
: مستطیل را برای متن نشانگر سطح بازیابی می کند.pygame.draw.rect
: یک مستطیل آبی روشن در اطراف متن نشانگر سطح رسم می کند.screen.blit(level_text, level_rect)
: متن نشانگر سطح را روی صفحه نمایش می دهد.
تایمر شمارش معکوس قرعه کشی:
timer_text
: متن تایمر شمارش معکوس را ارائه می دهد.timer_rect
: مستطیل متن تایمر شمارش معکوس را بازیابی می کند.pygame.draw.rect
: یک مستطیل قرمز در اطراف متن تایمر شمارش معکوس ترسیم می کند.screen.blit(timer_text, timer_rect)
: متن تایمر شمارش معکوس را روی صفحه نمایش می دهد.
قرعه کشی اهداف آدم ربایی:
targets_text
: متن را نشان می دهد که تعداد ربایش های مورد نیاز برای سطح فعلی را نشان می دهد.targets_rect
: مستطیل را برای متن اهداف آدم ربایی بازیابی می کند.pygame.draw.rect
: یک مستطیل خاکستری دور متن اهداف آدم ربایی می کشد.screen.blit(targets_text, targets_rect)
: متن هدف ربوده شده را بر روی صفحه نمایش می دهد.
به روز رسانی صفحه نمایش:
pygame.display.flip()
: نمایشگر را به روز می کند تا تغییرات ایجاد شده در این تکرار را منعکس کند.
سقف نرخ فریم:
clock.tick(FPS)
: نرخ فریم را به فریم های مشخص شده در ثانیه محدود می کند (FPS
). این تضمین می کند که بازی با سرعت ثابت در سیستم های مختلف اجرا می شود.
و اکنون ما برای آخرین بلوک کد آماده هستیم. این شامل منطق تایمر شمارش معکوس است که به منطق پیشرفت سطح و تنظیم مجدد آدم ربایی مربوط می شود. این بدان معنی است که شما باید هر بار که سطح بالا میروید، ربایشهای انجام شده توسط بازیکن را مجدداً شروع کنید و به صفر برسانید، به عنوان مثال:
- سطح 1: 0/10 آدم ربایی
- سطح 2: 0/20 آدم ربایی
و همینطور روی – حداکثر سهمیه آدم ربایی 100 آدم ربایی در سطح 10 است که برای هر سطح 10 آدم ربایی به سهمیه لازم اضافه می شود.
منطق تایمر و عملکرد خروج
آخرین بلوک کد را بررسی کنید:
# Countdown Timer Logic
countdown_timer -= 1 / FPS # Decrease the timer based روی the frame rate
if countdown_timer <= 0:
# Check if the player reached the abduction target for the current level
if current_score < abduction_target:
# Player didn't reach the abduction target, end the game
game_over_screen(screen)
running = False
else:
# Move to the next level
current_level += 1
if current_level <= 10:
current_score = 0
abduction_target = 10 * current_level
countdown_timer = 60 # Reset the countdown timer for the next level
# Reset the targets text for the next level
targets_text = font.render(f"Abductions: {current_score}/{abduction_target}", True, WHITE)
targets_rect = targets_text.get_rect(topleft=(timer_rect.topright[0] + info_spacing, info_line_y))
# Check if the player reached the abduction target for the current level
if current_score >= abduction_target:
# Move to the next level
current_level += 1
if current_level <= 10:
current_score = 0
abduction_target = 10 * current_level
countdown_timer = 60 # Reset the countdown timer for the next level
# Reset the targets text for the next level
targets_text = font.render(f"Abductions: {current_score}/{abduction_target}", True, WHITE)
targets_rect = targets_text.get_rect(topleft=(timer_rect.topright[0] + info_spacing, info_line_y))
else:
victory_screen(screen)
running = False
# Quit Pygame
pygame.quit()
منطق تایمر شمارش معکوس:
countdown_timer -= 1 / FPS
: تایمر شمارش معکوس را کسری کاهش می دهد1 / FPS
. این تنظیم تضمین می کند که تایمر به طور یکنواخت کاهش می یابد روی نرخ فریم
بررسی انقضای تایمر:
if countdown_timer <= 0:
: بررسی می کند که آیا تایمر شمارش معکوس به صفر رسیده یا به زیر صفر رسیده است.
بازیکن به هدف آدم ربایی نرسید:
if current_score < abduction_target:
: بررسی می کند که آیا امتیاز فعلی بازیکن کمتر از هدف ربوده شدن برای سطح فعلی است.game_over_screen(screen)
: عملکرد را برای نمایش بازی روی صفحه فراخوانی می کند.running = False
: تنظیم می کندrunning
پرچم بهFalse
، پایان دادن به حلقه بازی.
انتقال به سطح بعدی:
else:
: زمانی اجرا می شود که بازیکن به هدف ربوده شدن برای سطح فعلی رسیده باشد.current_level += 1
: سطح فعلی را افزایش می دهد.if current_level <= 10:
: بررسی می کند که آیا سطوح بیشتری برای ادامه وجود دارد یا خیر.current_score = 0
: امتیاز فعلی را برای سطح بعدی بازنشانی می کند.abduction_target = 10 * current_level
: هدف آدم ربایی را برای سطح بعدی تعیین می کند.countdown_timer = 60
: تایمر شمارش معکوس را برای سطح بعدی بازنشانی می کند.- متن هدف را برای سطح بعدی بازنشانی می کند.
targets_text = font.render(f"Abductions: {current_score}/{abduction_target}", True, WHITE)
targets_rect = targets_text.get_rect(topleft=(timer_rect.topright[0] + info_spacing, info_line_y))
بازیکن به هدف آدم ربایی برای همه سطوح رسیده است:
else:
: زمانی اجرا می شود که بازیکن تمام سطوح را با موفقیت به پایان رساند (به سطح 10 رسیده است).victory_screen(screen)
: عملکرد را برای نمایش صفحه پیروزی فراخوانی می کند.running = False
: تنظیم می کندrunning
پرچم بهFalse
، پایان دادن به حلقه بازی.
خروج از Pygame:
pygame.quit()
: پس از پایان حلقه بازی Pygame را پاک می کند و از آن خارج می شود.
اکنون، کار شما تمام شده است و می توانید با تایپ این مورد در پوسته خود، بازی را اجرا کنید:
python aliend_aductions_game.py
اگر همه چیز درست است، باید صفحه شروع را ببینید که به شما امکان می دهد پس از فشار دادن هر کلیدی بازی کنید.
نتیجه
ما در این آموزش موارد زیادی را پوشش داده ایم. شما با راه اندازی محیط توسعه، نصب PyGame و طراحی مفهوم بازی با مکانیک های ساده شروع به کار کردید.
سپس مرحله به مرحله را دنبال کردید process از کدگذاری بازی، از مقداردهی اولیه محیط گرفته تا اجرای کنترل های بازیکن، برخوردها و عناصر پویا. شما یاد گرفتید که چگونه تصاویر را برای سفینه فضایی و گاوها ادغام کنید و یک تجربه بصری جذاب ایجاد کنید.
بازی دارای سطوح مختلفی است که هر کدام چالش خاص خود را دارند و یک تایمر شمارش معکوس دارند که یک عنصر فوریت را اضافه می کند. شما یک سیستم امتیازدهی، پیشرفت سطح و گرافیک جذاب را برای بهبود تجربه بازیکن پیاده سازی کردید.
تشویق برای یادگیری بیشتر:
تبریک می گویم روی رسیدن به این نقطه! توسعه بازی یک مسیر یادگیری پویا و مفید است و همیشه چیزهای بیشتری برای یادگیری وجود دارد. همانطور که ادامه می دهید، به بررسی موضوعات پیشرفته تری مانند:
- گرافیک پیشرفته: بازی خود را با گرافیک، انیمیشن ها و جلوه های بصری دقیق تر تقویت کنید.
- صدا و موسیقی: جلوه های صوتی و موسیقی پس زمینه را برای ارتقای تجربه بازی ادغام کنید.
- فیزیک بازی: حرکات و تعاملات واقعی را در دنیای بازی کشف کنید.
- قابلیت چند نفره: یاد بگیرید که چگونه ویژگی های چند نفره را برای یک تجربه تعاملی تر پیاده سازی کنید.
- تکنیک های بهینه سازی: برای عملکرد بهتر، کد و گرافیک خود را بهینه کنید.
اگر به این نقطه رسیدید، ممنون که خواندید و امیدوارم از این پست به همان اندازه که من از انجام آن لذت بردم لذت ببرید، همچنین می توانید کد اصلی این بازی را بررسی کرده و دارایی ها را از اینجا دانلود کنید:
منتشر شده در 1403-01-03 10:31:05