بلاگ ابرفردوسی > آموزش ژوپیتر لب ابری : کد بازی ماشین در پایتون (سورس کامل + تحلیل)

کد بازی ماشین در پایتون (سورس کامل + تحلیل)

کد بازی ماشین در پایتون

کد بازی ماشین در پایتون معمولاً بر پایه کتابخانه قدرتمند Pygame توسعه داده می‌شود. منطق اصلی این کد بر یک حلقه بازی (Game Loop) استوار است که وظیفه به‌روزرسانی مداوم فریم‌ها، دریافت ورودی‌های صفحه کلید برای تغییر مختصات ماشین و تشخیص برخورد (Collision) با موانع را برعهده دارد.

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

پیش‌نیازهای اجرا

کد بازی ماشین در پایتون

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

برای ساخت بازی ماشین با پایتون، سه مؤلفه اصلی موردنیاز است:

۱. مفسر پایتون (Python Interpreter):

هسته اصلی کار ماست. اگر هنوز پایتون را نصب نکرده‌اید یا نمی‌دانید کدام نسخه مناسب است، ابتدا مقاله پایتون (Python) چیست؟ را مطالعه کنید. برای این پروژه، نسخه ۳.۶ به بالا توصیه می‌شود.

۲. کتابخانه Pygame:

وقتی صحبت از بهترین کتابخانه پایتون برای بازی سازی می‌شود، Pygame اولین گزینه‌ای است که به ذهن می‌رسد. این کتابخانه ابزارهای گرافیکی، صوتی و کنترلی را در اختیار ما می‌گذارد. برای نصب آن، ترمینال (یا CMD) را باز کنید و دستور زیر را بنویسید:

pip install pygame
نصب کتابخانه pygame

۳. محیط توسعه (IDE):

شما می‌توانید کد را در هر ویرایشگر متنی بنویسید، اما استفاده از محیط‌های حرفه‌ای مثل وی اس کد (VS Code) یا «ژوپیتر» سرعت توسعه را بالا می‌برد. به‌خصوص اگر قصد دارید بخش‌های مختلف کد را جداگانه تست کنید یا سیستم ضعیفی دارید، پیشنهاد ما استفاده از ژوپیتر لب ابری است. برای آشنایی بیشتر، مقاله ژوپیتر لب چیست؟-جامع و روان را ببینید.

نکته فنی: اگر در محیط‌های ابری یا سرورهای لینوکسی کار می‌کنید، مطمئن شوید که دسترسی به رابط گرافیکی (GUI) دارید، زیرا پروژه بازی پایتون برای نمایش پنجره بازی به خروجی تصویر نیاز دارد.

ساختار منطقی بازی

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

(تصویر: اینفوگرافیک با عنوان «چرخه حیات یک بازی در Pygame» – H2: ساختار Game Loop، H3ها: ۱- پردازش ورودی‌ها (Input)، ۲- آپدیت وضعیت (Update)، ۳- رندر کردن تصویر (Draw). این سه مرحله در یک دایره تکرار شونده نشان داده شوند.)

۱. حلقه بازی (Game Loop)

کدنویسی بازی ماشین یک حلقه بی‌نهایت (While Loop) دارد که تا زمانی که کاربر دکمه خروج را نزند، متوقف نمی‌شود. این حلقه در هر ثانیه ۳۰ تا ۶۰ بار (بسته به FPS) اجرا می‌شود و سه کار انجام می‌دهد:

  • می‌بیند کاربر چه کلیدی زده (چپ یا راست).
  • مکان ماشین و موانع را تغییر می‌دهد.
  • صفحه را پاک کرده و تصویر جدید را نقاشی می‌کند.

۲. سیستم مختصات (Coordinates)

در آموزش ساخت بازی ماشین در پایتون با pygame، سیستم مختصات کمی با ریاضیات مدرسه فرق دارد. نقطه (0,0) در گوشه بالا سمت چپ مانیتور است.

  • افزایش X: حرکت به سمت راست.
  • افزایش Y: حرکت به سمت پایین (دقت کنید! پایین رفتن یعنی Y مثبت).

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

۳. منطق برخورد (Collision Detection)

محیط اجرای بازی

چگونه بفهمیم باختیم؟ در بازی سازی با pygame، دور تمام عکس‌ها (ماشین و موانع) یک مستطیل نامرئی به نام rect می‌کشیم. دستور colliderect در هر لحظه چک می‌کند که آیا مستطیل ماشین با مستطیل مانع همپوشانی دارد یا خیر. اگر پاسخ مثبت بود، حلقه بازی متوقف شده و پیام “Game Over” نمایش داده می‌شود.

استفاده از مستطیل‌ها (Rect) سریع‌ترین روش برای پردازش در پروژه pygame پایتون است و فشار کمتری به پردازنده وارد می‌کند.

راه‌اندازی پروژه

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

۱. فراخوانی کتابخانه‌ها (Imports)

در ابتدای فایل پایتون (که می‌توانید نام آن را car_game.py بگذارید)، باید کتابخانه‌هایی که نصب کرده‌ایم را صدا بزنیم. در کدنویسی بازی ماشین، ما به سه ماژول اصلی نیاز داریم:

  • Pygame: موتور اصلی که گرافیک و صدا را مدیریت می‌کند.
  • Time: برای مدیریت زمان (مثلاً مکث کوتاه بعد از تصادف).
  • Random: حیاتی‌ترین بخش برای ایجاد تنوع؛ اگر جای موانع ثابت باشد، بازی خسته‌کننده می‌شود. ما از این ماژول برای تولید موقعیت‌های تصادفی موانع در این بازی مسابقه‌ای با پایتون استفاده می‌کنیم.

۲. تعریف رنگ‌ها و صفحه نمایش

کامپیوترها رنگ‌ها را با ترکیب سه عدد (قرمز، سبز، آبی) یا همان RGB می‌شناسند. برای اینکه در طول کدنویسی راحت باشیم، بهتر است رنگ‌ها را در متغیرها ذخیره کنیم. همچنین باید ابعاد پنجره بازی را مشخص کنیم. برای ساخت بازی ماشین ساده با پایتون، رزولوشن ۸۰۰ در ۶۰۰ پیکسل استاندارد و مناسب است.

به قطعه کد زیر دقت کنید (این بخش را در ابتدای فایل خود بنویسید):

import pygame
import time
import random

# راه‌اندازی اولیه ماژول‌های پای‌گیم
pygame.init()

# تنظیم ابعاد صفحه نمایش
display_width = 800
display_height = 600

# ساخت سطح (Surface) اصلی بازی
gameDisplay = pygame.display.set_mode((display_width, display_height))
pygame.display.set_caption('Ferdowsi Cloud Car Racing') # تیتر بالای پنجره

# تعریف رنگ‌ها (R, G, B)
black = (0, 0, 0)
white = (255, 255, 255)
red = (255, 0, 0)
block_color = (53, 115, 255) # رنگ موانع

# تنظیم ساعت بازی برای کنترل فریم‌ریت
clock = pygame.time.Clock()

نکته مهم درباره pygame.init()

شاید بپرسید چرا pygame.init() را نوشتیم؟ چون هنگام آموزش pygame برای ساخت بازی ماشین، می‌دانستیم که این دستور حیاتی است. این تابع تمام ماژول‌های سخت‌افزاری (مثل کارت صدا و گرافیک) را برای استفاده در پایتون بیدار می‌کند. بدون این خط، سورس کد بازی ماشین پایتون شما اجرا نخواهد شد.

همچنین متغیر clock بسیار مهم است. بازی‌ها برخلاف برنامه‌های عادی، باید با سرعت ثابتی اجرا شوند. اگر این ساعت را تنظیم نکنیم، بازی در کامپیوترهای قوی بسیار سریع و در کامپیوترهای ضعیف بسیار کند اجرا می‌شود. ما در ادامه از این متغیر برای ثابت نگه داشتن سرعت بازی (FPS) استفاده خواهیم کرد.

پیاده‌سازی ماشین و محیط بازی

اکنون که صفحه نمایش را آماده کرده‌ایم، باید المان‌های اصلی را وارد پروژه کنیم. در کد بازی ماشین در پایتون، ما دو عنصر اصلی داریم: ماشینی که بازیکن آن را کنترل می‌کند و موانعی که به‌صورت خودکار حرکت می‌کنند.

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

بارگذاری تصاویر و گرافیک

برای اینکه بازی جذابیت بصری داشته باشد، نمی‌توانیم فقط از مستطیل‌های رنگی استفاده کنیم. ما نیاز به تصویر یک ماشین مسابقه‌ای داریم.

در بازی دوبعدی ماشین با پایتون، فرمت تصویر بسیار مهم است. همیشه باید از تصاویر با فرمت PNG و پس‌زمینه شفاف (Transparent) استفاده کنید. اگر از فرمت JPG استفاده کنید، یک کادر سفید زشت دور ماشین شما نمایش داده می‌شود که حس واقع‌گرایانه بازی را خراب می‌کند.

برای بارگذاری تصویر در Pygame، از دستور image.load استفاده می‌کنیم. همچنین باید یک تابع اختصاصی تعریف کنیم که ماشین را در مختصات (x, y) روی صفحه رسم یا blit کند. ما برای این پروژه از عکس زیر استفاده کردیم که در سورس کدهای پروژه موجود است:

کد بازی ماشین در پایتون

به قطعه کد زیر دقت کنید:

# بارگذاری تصویر ماشین (فایل باید در کنار فایل پایتون باشد)
carImg = pygame.image.load('racecar.png')
# بدست آوردن عرض تصویر برای محاسبات بعدی
car_width = 73 

def car(x, y):
    # دستور blit تصویر را روی سطح اصلی بازی نقاشی می‌کند
    gameDisplay.blit(carImg, (x, y))

نکته: در پروژه pygame پایتون، وقتی دستوری مثل blit را اجرا می‌کنید، تصویر همان لحظه نمایش داده نمی‌شود؛ بلکه در حافظه آماده می‌شود و تنها زمانی که دستور pygame.display.update() اجرا شود، کاربر آن را می‌بیند.

کنترل حرکت و فیزیک ماشین

حالا می‌خواهیم به ماشین جان ببخشیم. چیزی که باید بدانید این است که حرکت معمولاً فقط در محور افقی (چپ و راست) انجام می‌شود. برای این کار، ما باید منطق تغییر موقعیت یا x_change را پیاده‌سازی کنیم.

منطق تغییر مختصات (Logic)

وقتی کاربر کلید چپ را فشار می‌دهد، ما نباید ماشین را پرتاب کنیم! بلکه باید بگوییم: «تا زمانی که دست کاربر روی کلید است، در هر فریم ۵ پیکسل از مختصات X کم کن». وقتی دستش را برداشت، تغییرات باید صفر شود.

این پروسه در کدنویسی بازی ماشین ازطریق “Event Handling” (مدیریت رویدادها) انجام می‌شود. ما تمام اتفاقات کیبورد را رصد می‌کنیم:

  1. رویداد KEYDOWN: دکمه فشار داده شد (شروع حرکت).
  2. رویداد KEYUP: دکمه رها شد (توقف حرکت).

محدودیت‌های زمین بازی (Boundaries)

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

  • اگر x < 0 شد (به لبه چپ خورد) -> متوقف شود یا ببازد.
  • اگر x > display_width – car_width شد (به لبه راست خورد) -> متوقف شود.

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

x = (display_width * 0.45) # شروع از وسط صفحه
y = (display_height * 0.8) # پایین صفحه
x_change = 0 # تغییرات لحظه‌ای

# داخل حلقه اصلی بازی (Game Loop)
for event in pygame.event.get():
    if event.type == pygame.QUIT:
        crashed = True

    # اگر کلیدی فشار داده شد
    if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_LEFT:
            x_change = -5 # حرکت به چپ
        elif event.key == pygame.K_RIGHT:
            x_change = 5 # حرکت به راست

    # اگر کلید رها شد
    if event.type == pygame.KEYUP:
        if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
            x_change = 0

# اعمال تغییرات روی مکان ماشین
x += x_change

این روش باعث می‌شود حرکت ماشین بسیار نرم (Smooth) و طبیعی به‌نظر برسد.

ایجاد موانع تصادفی

بازی بدون چالش معنی ندارد. در این مرحله می‌خواهیم موانعی (مثلاً ماشین‌های دیگر یا جعبه‌ها) را به بازی اضافه کنیم. برای سادگی کار شما، موانع را به‌صورت مستطیل‌های رنگی شبیه ماشین می‌کنیم، اما منطق آن برای عکس هم یکسان است.

محیط بازی به‌همراه مانع

الگوریتم تولید مانع

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

  1. یک مانع در مختصات Y منفی (بالای کادر دید کاربر) و یک X تصادفی ساخته می‌شود.
  2. در هر فریم، مقدار Y مانع اضافه می‌شود (به سمت پایین می‌آید).
  3. وقتی مانع از پایین صفحه خارج شد (یعنی y > display_height)، دوباره به بالای صفحه پرتاب می‌شود و یک X تصادفی جدید می‌گیرد.

این تکنیک باعث می‌شود با نوشتن کدِ تنها یک مانع، بی‌نهایت مانع در طول بازی داشته باشیم و حافظه سیستم اشغال نشود. این بهینه‌سازی در پروژه بازی ماشین برای تمرین پایتون بسیار مهم است.

تابع رسم مانع:

def things(thingx, thingy, thingw, thingh, color):
    # رسم مستطیل (مانع)
    pygame.draw.rect(gameDisplay, color, [thingx, thingy, thingw, thingh])

و منطق حرکت مانع در حلقه بازی:

thing_startx = random.randrange(0, display_width) # مکان تصادفی افقی
thing_starty = -600 # شروع از بیرون صفحه
thing_speed = 7 # سرعت سقوط مانع
thing_width = 100
thing_height = 100

# داخل حلقه بازی:
thing_starty += thing_speed # حرکت به پایین
things(thing_startx, thing_starty, thing_width, thing_height, block_color)

# بازنشانی مانع پس از خروج از صفحه
if thing_starty > display_height:
    thing_starty = 0 - thing_height
    thing_startx = random.randrange(0, display_width)

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

تشخیص برخورد و سیستم امتیازدهی

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

۱. منطق ریاضی تصادف (Collision Detection)

چگونه کامپیوتر می‌فهمد ماشین ما به مانع برخورد کرده است؟ در بازی سازی با pygame، همه‌چیز در نهایت به هندسه برمی‌گردد. ساده‌ترین و دقیق‌ترین روش برای تشخیص برخورد، استفاده از مفهوم مستطیل‌های محیطی یا Rect است. برای این کار، دور ماشین و دور مانع، یک خط‌چین نامرئی کشیده‌ایم. در هر لحظه از بازی، باید بررسی کنیم که آیا این دو مستطیل با هم تداخل (Overlap) دارند یا خیر.

در کتابخانه Pygame، متدی به نام colliderect وجود دارد که این کار را خودکار انجام می‌دهد. اما برای درک عمیق‌تر، منطق آن به زبان ساده این‌گونه است:

  • اگر ضلع راست ماشین > ضلع چپ مانع باشد و ضلع چپ ماشین < ضلع راست مانع باشد (تداخل افقی).
  • و همزمان: اگر بالای ماشین < پایین مانع باشد و پایین ماشین > بالای مانع باشد (تداخل عمودی).
  • نتیجه: تصادف رخ داده است!

وقتی شرط بالا True شد، تابع crash() صدا زده می‌شود که پیامی مثل “You Crashed” را نمایش داده و بازی را ریست می‌کند.

۲. نمایش امتیاز (Scoring)

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

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

نمایش این عدد روی صفحه با استفاده از تابع gameDisplay.blit و فونت‌های پیش‌فرض سیستم انجام می‌شود. کد زیر نمونه‌ای از تابع نمایش امتیاز است:

def things_dodged(count):
    font = pygame.font.SysFont(None, 25)
    text = font.render("Score: " + str(count), True, black)
    gameDisplay.blit(text, (0, 0)) # نمایش در گوشه بالا چپ

سورس کد کامل بازی ماشین

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

این کد نهایی شامل تمام ویژگی‌های زیر است:

  • حرکت روان ماشین با کیبورد
  • تولید موانع تصادفی و بی‌پایان
  • تشخیص دقیق برخورد و نمایش پیام باخت
  • شمارش امتیاز

کافی است کد زیر را کپی کنید، یک عکس با نام racecar.png کنار آن بگذارید و اجرا کنید. این کامل‌ترین سورس کد بازی ماشین پایتون برای سطح مقدماتی با منوی انگلیسی است.

import pygame
import time
import random

pygame.init()

# --- تنظیمات ابعاد و رنگ‌ها ---
display_width = 800
display_height = 600

black = (0, 0, 0)
white = (255, 255, 255)
gray = (50, 50, 50)     
line_color = (255, 255, 0) 
red = (200, 0, 0)
green = (0, 200, 0)
bright_red = (255, 0, 0)
bright_green = (0, 255, 0)
enemy_color = (150, 137, 27) 
grass_color = (0, 100, 0)

car_width = 50 
car_height = 100 

gameDisplay = pygame.display.set_mode((display_width, display_height))
pygame.display.set_caption('Ferdowsi Cloud Racing Pro')
clock = pygame.time.Clock()

carImg = pygame.image.load('racecar.png')
carImg = pygame.transform.scale(carImg, (car_width, car_height)) 

# --- توابع رابط کاربری ---
def text_objects(text, font, color):
    textSurface = font.render(text, True, color)
    return textSurface, textSurface.get_rect()

def things_dodged(count):
    font = pygame.font.SysFont(None, 30)
    text = font.render("Score: " + str(count), True, white)
    gameDisplay.blit(text, (20, 20))

def button(msg, x, y, w, h, ic, ac, action=None):
    mouse = pygame.mouse.get_pos()
    click = pygame.mouse.get_pressed()
    # تعامل موس (اختیاری)
    if x+w > mouse[0] > x and y+h > mouse[1] > y:
        pygame.draw.rect(gameDisplay, ac, (x, y, w, h))
    else:
        pygame.draw.rect(gameDisplay, ic, (x, y, w, h))

    smallText = pygame.font.SysFont("comicsansms", 20)
    textSurf, textRect = text_objects(msg, smallText, black)
    textRect.center = ((x + (w / 2)), (y + (h / 2)))
    gameDisplay.blit(textSurf, textRect)

# --- توابع رسم محیط ---
def draw_enemy(thingx, thingy, thingw, thingh, color):
    pygame.draw.rect(gameDisplay, color, [thingx, thingy, thingw, thingh])
    pygame.draw.rect(gameDisplay, (50,50,50), [thingx+5, thingy+10, thingw-10, 20])
    pygame.draw.rect(gameDisplay, (50,50,50), [thingx+5, thingy+60, thingw-10, 20])

def draw_road():
    pygame.draw.rect(gameDisplay, gray, (100, 0, 600, display_height))
    pygame.draw.rect(gameDisplay, white, (100, 0, 10, display_height))
    pygame.draw.rect(gameDisplay, white, (690, 0, 10, display_height))
    pygame.draw.rect(gameDisplay, line_color, (395, 0, 10, display_height))

def car(x, y):
    gameDisplay.blit(carImg, (x, y))

# --- توابع منطق بازی ---
def crash():
    largeText = pygame.font.SysFont(None, 115)
    TextSurf, TextRect = text_objects("You Crashed", largeText, red)
    TextRect.center = ((display_width / 2), (display_height / 2))
    gameDisplay.blit(TextSurf, TextRect)
    
    pygame.display.update()
    time.sleep(2)
    game_loop()

def paused():
    largeText = pygame.font.SysFont(None, 115)
    TextSurf, TextRect = text_objects("Paused", largeText, black)
    TextRect.center = ((display_width / 2), (display_height / 2))
    gameDisplay.blit(TextSurf, TextRect)
    
    # حلقه توقف
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_p: # زدن دوباره P برای ادامه
                    return 
                
        pygame.display.update()
        clock.tick(15)

def game_intro():
    intro = True
    while intro:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE: # شروع با اسپیس
                    intro = False
                    
        gameDisplay.fill(white)
        largeText = pygame.font.SysFont(None, 100)
        TextSurf, TextRect = text_objects("Car Racing", largeText, black)
        TextRect.center = ((display_width / 2), (display_height / 2))
        gameDisplay.blit(TextSurf, TextRect)
        
        # راهنما
        font = pygame.font.SysFont(None, 30)
        text = font.render("Press SPACE to Start | Press P to Pause", True, red)
        gameDisplay.blit(text, (200, 400))
        
        pygame.display.update()
        clock.tick(15)

def game_loop():
    x = (display_width * 0.45)
    y = (display_height * 0.8)
    
    x_change = 0
    y_change = 0

    thing_startx = random.randrange(110, 600)
    thing_starty = -600
    thing_speed = 6
    thing_width = 50 
    thing_height = 100
    
    dodged = 0
    gameExit = False

    while not gameExit:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
            
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    x_change = -5
                if event.key == pygame.K_RIGHT:
                    x_change = 5
                if event.key == pygame.K_UP:
                    y_change = -5
                if event.key == pygame.K_DOWN:
                    y_change = 5
                if event.key == pygame.K_p: # شرط توقف
                    paused()

            if event.type == pygame.KEYUP:
                if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                    x_change = 0
                if event.key == pygame.K_UP or event.key == pygame.K_DOWN:
                    y_change = 0

        x += x_change
        y += y_change

        if x > 690 - car_width: x = 690 - car_width
        if x < 110: x = 110
        if y < 0: y = 0
        if y > display_height - car_height: y = display_height - car_height
        
        gameDisplay.fill(grass_color) 
        draw_road() 
        draw_enemy(thing_startx, thing_starty, thing_width, thing_height, enemy_color)
        thing_starty += thing_speed
        car(x, y)
        things_dodged(dodged)

        if thing_starty > display_height:
            thing_starty = 0 - thing_height
            thing_startx = random.randrange(110, 600)
            dodged += 1
            thing_speed += 0.3

        if y < thing_starty + thing_height and y + car_height > thing_starty:
            if x > thing_startx and x < thing_startx + thing_width or x + car_width > thing_startx and x + car_width < thing_startx + thing_width:
                crash()

        pygame.display.update()
        clock.tick(60)

# شروع برنامه با منو
game_intro()
game_loop()
pygame.quit()
quit()

توسعه و شخصی‌سازی

تبریک می‌گویم! شما اکنون اسکلت کامل بازی ماشین در پایتون را ساخته‌اید. اما بیایید صادق باشیم؛ بازی بدون صدا و هیجان، خیلی زود خسته کننده می‌شود. اگر می‌خواهید پاسخ این سؤال که «آیا می‌توان با پایتون بازی ساخت که واقعاً سرگرم‌کننده باشد؟» مثبت باشد، باید جزئیات زیر را به کد خود اضافه کنید.

۱. افزودن صدا و موسیقی (Audio)

کتابخانه Pygame یک ماژول قدرتمند به نام mixer دارد. شما به دو نوع صدا نیاز دارید:

  • موسیقی پس‌زمینه: که مدام تکرار شود.
  • افکت صوتی (SFX): برای لحظه تصادف

کد زیر را قبل‌از حلقه بازی اضافه کنید:

pygame.mixer.music.load('background_jazz.mp3')
pygame.mixer.music.play(-1) # عدد منفی یک یعنی پخش بی‌نهایت
crash_sound = pygame.mixer.Sound('crash.wav')

و در تابع crash() خط pygame.mixer.Sound.play(crash_sound) را فراخوانی کنید.

۲. قابلیت شتاب (Nitro)

در کدنویسی بازی ماشین، کنترل سرعت دست بازیکن نیست. بیایید این را تغییر دهیم. می‌توانید تعریف کنید که اگر کاربر کلید SHIFT را نگه داشت، سرعت بازی (thing_speed) دو برابر شود. این کار ریسک بازی را بالا می‌برد اما امتیاز بیشتری هم دارد.

۳. تغییر گرافیک

به‌جای اینکه صفحه سفید باشد، می‌توانید یک عکس جاده که حرکت می‌کند (Scrolling Background) را جایگزین کنید. این تکنیک در بازی دوبعدی ماشین با پایتون، حس حرکت رو به جلو را بسیار واقعی‌تر می‌کند. کافیست دو عکس پس‌زمینه داشته باشید که یکی پس‌از دیگری نمایش داده شوند و Y آن‌ها تغییر کند.

نکته: برای مطالعه بیشتر درباره ماژول میکسر، مستندات Pygame Mixer را بررسی کنید.

اجرای بازی و پردازش در سرور

اجرای بازی و پردازش در سرور

شاید بپرسید وقتی سورس کد بازی ماشین پایتون را نوشتیم، چه نیازی به سرور ابری داریم؟

بازی‌هایی که با Pygame ساخته می‌شوند معمولاً نیاز به خروجی تصویر (Display) دارند و روی کامپیوتر شخصی اجرا می‌شوند. اما دو سناریوی مهم وجود دارد که شما را به سرور ابری و به خصوص ژوپیتر لب نیازمند می‌کند:

۱. آموزش هوش مصنوعی (AI): اگر بخواهید با الگوریتم‌های یادگیری ماشین (مثل NeuroEvolution) به کامپیوتر یاد بدهید که خودش بازی کند، نیاز به پردازش‌های سنگین CPU دارید که ممکن است لپ‌تاپ شما مناسب آن نباشد.

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

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

چرا سرور ژوپیتر لب ابر فردوسی؟

ما در ابر فردوسی، بهترین سرور ژوپیتر لب (Jupyter Lab) را بر بستر قدرتمندترین پردازنده‌های Intel Xeon و AMD EPYC ارائه می‌دهیم. شما می‌توانید بدون دغدغه نصب کتابخانه یا کندی سیستم، کدهای پایتون خود را اجرا کنید.

مزیت بزرگ این سرویس، مدل پرداخت Pay-as-you-go است؛ یعنی فقط به اندازه ساعاتی که روی کدتان کار می‌کنید هزینه می‌پردازید و پس‌از خاموشی سرور، هزینه‌ای برای CPU و RAM کسر نمی‌شود. همچنین با قابلیت مقیاس‌پذیری فوری، اگر پروژه شما بزرگ شد، در لحظه منابع را افزایش می‌دهید.

برای اینکه خیال‌تان راحت باشد، ۱۰۰ هزارتومان اعتبار رایگان نیز داریم که می‌توانید از آن برای تست امکانات استفاده کنید، بدون نیاز به پرداخت!

ژوپیتر لب

جمع‌بندی

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

این پروژه نقطه شروعی عالی برای ورود به دنیای بازی‌سازی است. پیشنهاد می‌کنم به کد قانع نباشید؛ رنگ‌ها را عوض کنید، برای ماشین بوق بگذارید و یا حتی سعی کنید یک هوش مصنوعی بسازید که خودش رانندگی کند. مهم‌ترین اصل در یادگیری برنامه‌نویسی، دستکاری کردن کدها و نترسیدن از خطاهاست. پیروز باشید!

 سؤالات متداول

چرا با ارور ModuleNotFoundError: No module named ‘pygame’ مواجه می‌شوم؟

این خطا یعنی کتابخانه Pygame روی سیستم شما نصب نیست یا در محیط مجازی (Virtual Environment) اشتباهی هستید. مطمئن شوید که دستور pip install pygame را در ترمینال یا CMD اجرا کرده‌اید.

چرا وقتی بازی را اجرا می‌کنم، پنجره سریع باز و بسته می‌شود؟

این اتفاق معمولاً زمانی می‌افتد که کدی برای نگه داشتن پنجره ننوشته‌اید یا خطایی در اجرا رخ داده است. مطمئن شوید که حلقه بازی (while not gameExit) به‌درستی نوشته شده است. اگر در محیط‌هایی غیر از IDLE اجرا می‌کنید، ممکن است لازم باشد خط input() را به انتهای کد اضافه کنید تا پنجره باز بماند.

چرا عکس ماشین یا موانع نشان داده نمی‌شود (صفحه سیاه است)؟

احتمالاً آدرس عکس اشتباه است. فایل عکس (racecar.png) باید دقیقاً در کنار فایل پایتون (در همان پوشه) باشد. همچنین مطمئن شوید که نام فایل در کد با نام واقعی عکس (بزرگی و کوچکی حروف) یکی باشد.

چطور می‌توانم بازی ساخته شده را به فایل exe تبدیل کنم تا برای دوستانم بفرستم؟

پایتون به‌صورت پیش‌فرض فایل اجرایی نمی‌دهد. برای این کار باید از کتابخانه جانبی PyInstaller استفاده کنید. کافیست آن را نصب کنید و دستور pyinstaller –onefile car_game.py را در ترمینال بزنید.

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

مشکل از تنظیم نبودن FPS است. دستور clock.tick(60) در انتهای حلقه بازی، سرعت را روی ۶۰ فریم بر ثانیه قفل می‌کند. با کم‌وزیاد کردن این عدد، سرعت اجرای بازی تغییر می‌کند.

آیا می‌توانم این بازی را روی اندروید اجرا کنم؟

کتابخانه Pygame اساساً برای سیستم عامل‌های دسکتاپ (ویندوز، لینوکس، مک) طراحی شده است. برای ساخت بازی موبایل با پایتون، بهتر است سراغ کتابخانه‌هایی مثل Kivy بروید.

یاسین اسدی

اگه می‌خوای زندگیت تغیر کنه کتاب نخون؛ نوشته‌های منو بخون!
پست های مرتبط

flask چیست؟ بررسی جامع میکرو فریم‌ ورک فلسک

Flask یک میکرو فریم‌ ورک متن‌باز برای زبان پایتون است که به توسعه‌دهندگان امکان می‌دهد وب‌سایت‌ها و اپلیکیشن‌های تحت وب را سریع و با انعطاف بالا بسازند. واژه «میکرو» به معنای کوچک یا محدود بودن نیست؛ بلکه…

۲۶ بهمن ۱۴۰۴

دانلود و نصب vs code وی اس کد (آموزش ۰ تا ۱۰۰ تصویری)

نصب Visual Studio Code) vs code) اولین قدم برای ورود به دنیای کدنویسی مدرن است. این ویرایشگر متن‌باز و سبک، که توسط مایکروسافت توسعه یافته، تقریباً روی هر سیستم‌عاملی اجرا می‌شود و گزینه‌ای عالی برای برنامه‌نویسی پایتون،…

نصب pip در پایتون و دستورات ضروری

نصب pip در پایتون اولین قدم برای مدیریت کتابخانه‌ها و اجرای پروژه‌های واقعی است. pip (مخفف Pip Installs Packages) استانداردترین ابزار مدیریت بسته پایتون است که به شما اجازه می‌دهد کتابخانه‌ها و کدهای آماده را مستقیماً از…

0 0 رای ها
به مقاله امتیاز بدید
0 نظرات
بازخورد (Feedback) های اینلاین
مشاهده همه نظرات