ساخت بازی با پایتون و پای گیم
می خوای اولین بازی ماشینت رو خودت بسازی؟ یه سوال: تا حالا موقع بازی کردن با یک ماشین مسابقه ای به این فکر کردی که چه کسی تصمیم می گیره ماشین چقدر تند حرکت کنه، مانع از کجا بیاد و چه زمانی بازی تموم بشه؟ خب، قرار نیست فقط جواب این سوال ها رو حفظ […]

می خوای اولین بازی ماشینت رو خودت بسازی؟
یه سوال: تا حالا موقع بازی کردن با یک ماشین مسابقه ای به این فکر کردی که چه کسی تصمیم می گیره ماشین چقدر تند حرکت کنه، مانع از کجا بیاد و چه زمانی بازی تموم بشه؟ خب، قرار نیست فقط جواب این سوال ها رو حفظ کنی. توی این آموزش بازی سازی با پایتون می خوایم یک بازی ماشین ساده بسازیم و از نزدیک ببینیم پشت صحنه یک بازی دو بعدی چه خبره.
من توی نابغه ها این پروژه رو توی ۱۰ قسمت ویدیویی رایگان آموزش دادم. بازی ما از زاویه بالا دیده می شه: یک ماشین داریم که باید از موانع جاخالی بده و هرچه بیشتر دوام بیاره، رکورد بهتری ثبت می کنه. اسم فعلی پروژه CarRace هست؛ توی ویدیوها هم گاهی ماشین رو به شوخی «کفشدوزک» صدا می زنم. سورس و فایل های اصلی پروژه رو هم داخل GitHub رسمی نابغه ها گذاشتم تا بتونی کنار آموزش باهاشون تمرین کنی.
اینجا از صفر می گم Pygame چیه، چه پیش نیازی لازم داری، چطور بازی رو روی ویندوز یا لینوکس اجرا کنی، هر قسمت ویدیو چه مسئله ای رو حل می کنه و اگه وسط کار خطا خوردی چطور پیداش کنی. کنار ویدیوها یک نسخه کوچک مستقل هم گذاشتم که فقط با Python و Pygame بالا میاد و برای آزمایش منطق بازی به عکس و آهنگ احتیاج نداره.
اگه برای اولین بار می خوای ساخت بازی با پایتون رو تجربه کنی، همین بازی ماشین نقطه شروع خوبیه؛ چون خیلی زود نتیجه رو می بینی. اما یه شرط داره: فقط ویدیو نگاه نکن. هر بار یک قابلیت رو خودت اضافه کن، یک بار خرابش کن و بعد عیبش رو پیدا کن. دقیقا همین جاست که از دیدن کد به فهمیدن برنامه نویسی می رسی.

ساخت بازی با پایتون دقیقا به چه دردی می خوره؟
بعضی ها فکر می کنن بازی سازی یعنی اول باید مدل سه بعدی بسازی، فیزیک حرفه ای بلد باشی یا کارت گرافیک خیلی گرونی داشته باشی. برای شروع اصلا این طور نیست. وقتی یک ماشین رو با دکمه چپ و راست تکون می دی، در واقع داری متغیر، شرط، حلقه، ورودی کاربر و مختصات صفحه رو به یک کار قابل دیدن تبدیل می کنی. برای همین آموزش Pygame فقط آموزش بازی نیست؛ یک روش جذاب برای یادگیری واقعی پایتونه.
مثلا توی همین پروژه، یک عدد برای سرعت ماشین داری، یک لیست برای مانع ها، یک شرط برای برخورد و یک حلقه که چند ده بار در ثانیه اجرا می شه. وقتی این ها رو بفهمی، توی ساخت یک ابزار اتوماسیون، یک رابط گرافیکی یا حتی برنامه سمت سرور هم راحت تر فکر می کنی؛ چون منطق حل مسئله رو تمرین کردی.
البته یه واقعیت رو هم از همین اول بگم: ساخت یک بازی دوبعدی با Pygame با ساخت یک بازی سه بعدی بزرگ در Unreal یا Unity فرق داره. این پروژه برای یاد گرفتن منطق، کنترل، برخورد و رندر دوبعدی عالیه؛ قرار نیست ادعا کنیم با چند جلسه یک استودیوی بازی سازی حرفه ای ساختیم.
Pygame چیه و فرقش با موتور بازی سازی چیه؟
پای گیم یا Pygame مجموعه ای از ماژول های پایتونه که ساخت پنجره، گرفتن ورودی از کیبورد و ماوس، نمایش تصویر، مدیریت زمان و پخش صدا رو ساده تر می کنه. خودش بازی رو به جای تو طراحی نمی کنه. تو باید تصمیم بگیری بازیکن چطور حرکت کنه، مانع کجا ساخته بشه و چه زمانی برنده یا بازنده بشیم.
بازی سازی گرافیکی با پایتون معمولا با مفهوم Game Loop شروع می شه؛ یعنی حلقه ای که مرتب ورودی ها رو می خونه، موقعیت ها رو عوض می کنه، برخوردها رو حساب می کنه و تصویر جدید رو به صفحه می فرسته. Pygame روی SDL بنا شده، اما این به معنی اون نیست که هر دستور رسم به شکل خودکار و مستقیم با GPU شتاب می گیره. نوع سطح نمایش، روش رندر و مسیر گرافیکی روی عملکرد اثر می ذاره. برای شروع، فهمیدن همین چرخه از حفظ کردن اسم ده ها تابع مهم تره.
برای پروژه ماشین بازی، چهار مفهوم رو از همین اول توی ذهنت نگه دار: Surface جاییه که روی اون تصویر می کشیم؛ Rect موقعیت و ابعاد اشیا رو نگه می داره؛ Event خبر می ده کاربر چه کاری کرده؛ و Clock کمک می کنه سرعت اجرای حلقه بازی کنترل بشه. همین چهار تا رو بفهمی، نصف راه ساخت بازی با Pygame رو رفتی.
برای شروع چه چیزهایی باید بلد باشی؟
اگه هنوز با متغیر، if، حلقه while، لیست و تابع آشنا نیستی، پیشنهاد می کنم اول پایه ها رو یاد بگیری. لازم نیست شش ماه صبر کنی؛ همین که بتونی یک عدد رو تغییر بدی، یک شرط بنویسی و تابع تعریف کنی، برای این پروژه کافیه. از مسیر رایگان یادگیری پایتون شروع کن و بعد برگرد سراغ بازی.
از نظر ابزار هم به یک نسخه پشتیبانی شده از Python 3، یک ویرایشگر مثل VS Code و کتابخانه Pygame نیاز داری. می تونی روی ویندوز، لینوکس یا مک کار کنی. بازی کردن با پنجره گرافیکی روی سرور بدون محیط دسکتاپ موضوع دیگه ایه و ممکنه نمایشگر در دسترس نباشه.
| چیزی که لازم داری | برای چی لازم می شه | باید حرفه ای باشی؟ |
|---|---|---|
| Python 3 | اجرای منطق بازی و ماژول ها | نه، آشنایی با اصول کافیه |
| Pygame | پنجره، رویداد، تصویر و صدا | نه، قدم به قدم یاد می گیریم |
| VS Code یا ویرایشگر مشابه | نوشتن و اجرای فایل های py | نه |
| GitHub و فایل ZIP | دریافت کد و فایل های پروژه | نه، فقط دانلود و استخراج |
| حوصله عیب یابی | حل خطاهای مسیر فایل، نسخه و نصب | این مهارت رو همین جا می سازی |
نصب Pygame روی ویندوز، لینوکس و مک
اول مطمئن شو دستور Python توی ترمینال کار می کنه. برای ویندوز، معمولا py --version جواب می ده؛ روی لینوکس و مک بیشتر python3 --version استفاده می شه. بعد یک پوشه مخصوص پروژه بساز. پیشنهاد من اینه که از یک محیط مجازی جداگانه استفاده کنی تا بسته های این بازی با پروژه های دیگه قاطی نشن.
این دستورها برای Windows PowerShell هستن. اگه سیاست اجرای اسکریپت جلوی فعال سازی محیط مجازی رو گرفت، لازم نیست بی دلیل امنیت ویندوز رو پایین بیاری؛ می تونی مستقیم از فایل Python داخل .venv استفاده کنی.
py -m venv .venv
.venv\Scripts\python.exe -m pip install --upgrade pip
.venv\Scripts\python.exe -m pip install pygame
.venv\Scripts\python.exe -m pygame.examples.aliensاین نسخه برای لینوکس و مک مناسبه. روی بعضی توزیع های لینوکس، نصب بسته های سیستمی Python با pip محدود شده؛ محیط مجازی این مشکل رو برای پروژه های شخصی بهتر مدیریت می کنه. اگه دانلود در ایران با خطای اتصال یا Timeout روبه رو شد، اول DNS، دسترسی به PyPI و مسیر شبکه رو بررسی کن؛ هر خطا به معنی تحریم نیست.
python3 -m venv .venv
.venv/bin/python -m pip install --upgrade pip
.venv/bin/python -m pip install pygame
.venv/bin/python -m pygame.examples.aliensاگه مثال آماده Pygame باز شد، یعنی نصب و نمایش پنجره تا اینجا کار می کنه. اگه توی VS Code خطای No module named pygame دیدی، لزوما به معنی نصب نشدن نیست؛ ممکنه ویرایشگر داره از یک Python دیگه استفاده می کنه. پایین تر روش تشخیصش رو قدم به قدم می گم.
اول بفهمیم بازی ماشین دقیقا چطور کار می کنه
منطق پروژه خیلی ساده تر از چیزیه که از ظاهرش تصور می کنی. ماشین بازیکن نزدیک پایین صفحه قرار می گیره. مانع ها از بالا میان پایین و بازیکن با دکمه های چپ و راست ازشون فرار می کنه. هر بار که مانع از صفحه خارج می شه، یعنی تو ازش جان سالم به در بردی؛ حالا می تونی امتیاز رو بیشتر کنی یا سرعت بازی رو بالا ببری.
اینجا سه نکته مهم داریم. اول اینکه مختصات صفحه توی بیشتر کتابخانه های گرافیکی از گوشه بالا و چپ شروع می شه و جهت y رو به پایینه. دوم اینکه حرکت باید با زمان واقعی هماهنگ باشه، نه اینکه فقط به تعداد فریم ها وابسته بمونه. سوم اینکه برای تشخیص برخورد در مرحله اول نیازی به محاسبات عجیب نداریم؛ برخورد مستطیلی کفایت می کنه.
مثلا اگه ماشین با سرعت ۳۰۰ پیکسل در ثانیه حرکت می کنه و هر فریم یک شصتم ثانیه طول می کشه، باید حدود ۵ پیکسل جابه جا بشه. حالا اگه بازی یک لحظه افت فریم داشت، استفاده از زمان سپری شده یا dt کمک می کنه رفتار بازی تا حد زیادی پایدارتر بمونه. این همون نکته ایه که بازی رو از یک تمرین خیلی خام جدا می کنه.
ویدیوی کوتاه بالا نمایی از ماشین بازی رو نشون می ده. می تونی قبل از رفتن سراغ کدنویسی، از همین پیش نمایش حدس بزنی کدوم قسمت ها باید متغیر داشته باشن: جای ماشین، جای مانع، سرعت حرکت، زمان ظاهر شدن مانع ها و وضعیت باخت.
مختصات، حرکت و تشخیص برخورد با یک مثال کوچک
قبل از دیدن ویدیوهای ده قسمتی، بهتره با یک نمونه کوتاه آشنا بشی. این کد یک پنجره باز می کنه، ماشین آبی رو با کلیدهای جهت دار حرکت می ده و وقتی به مانع قرمز بخوره، عنوان پنجره تغییر می کنه. هدف این تکه کد ساخت بازی کامل نیست؛ فقط می خوام تفاوت رویداد، حرکت و برخورد رو توی چند خط ببینی.
import pygame
pygame.init()
screen = pygame.display.set_mode((600, 400))
clock = pygame.time.Clock()
player = pygame.Rect(270, 310, 60, 65)
obstacle = pygame.Rect(285, 90, 30, 70)
running = True
while running:
dt = clock.tick(60) / 1000
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
keys = pygame.key.get_pressed()
player.x += round((keys[pygame.K_RIGHT] - keys[pygame.K_LEFT]) * 250 * dt)
player.clamp_ip(screen.get_rect())
pygame.display.set_caption("Collision!" if player.colliderect(obstacle) else "Car Game")
screen.fill((20, 26, 39))
pygame.draw.rect(screen, (40, 180, 255), player)
pygame.draw.rect(screen, (255, 80, 90), obstacle)
pygame.display.flip()
pygame.quit()اگه کد رو اجرا کردی و صفحه ثابت بود، طبیعیه؛ هنوز به مانع دستور حرکت ندادیم. خودت امتحان کن مانع رو هر فریم چند پیکسل جابه جا کنی یا کلیدهای A و D رو هم اضافه کنی. این نوع تمرین باعث می شه صرفا کد رو کپی نکنی و دلیل رفتار بازی رو بفهمی.
سورس اصلی ماشین بازی رو از GitHub بگیر
برای همراه شدن با آموزش ویدیوها، اول وارد مخزن CarRace نابغه ها شو. فایل RaceCarGame.zip همون آرشیوی هست که برای پروژه گذاشتم. دانلودش کن، از حالت ZIP خارجش کن و بعد پوشه پروژه رو توی VS Code باز کن. اگر چند فایل Python یا پوشه تصویر و صدا داخلش بود، موقع اجرا ساختار پوشه ها رو به هم نریز.
حواست باشه توی پروژه های قدیمی، بعضی تصویرها یا آهنگ ها با مسیر نسبی لود می شن. یعنی ممکنه بازی فقط وقتی درست اجرا بشه که پوشه کاری ترمینال همون پوشه پروژه باشه. پس اولین کار بعد از استخراج، پیدا کردن فایل ورودی برنامه و بررسی مسیر فایل هاست؛ نه اینکه بی هدف همه فایل ها رو از هم جدا کنی.
فایل ZIP روی GitHub پروژه اصلی ویدیوهاست. کد مستقلی که پایین همین مقاله گذاشتم، یک نمونه تازه برای تمرین مفاهیمه و قرار نیست جای سورس اصلی رو بگیره. اگه خواستی دقیقا همون بازی داخل ویدیو رو اجرا کنی، نسخه مخزن رو استفاده کن.
آموزش تصویری ساخت بازی ماشین با پایتون؛ ۱۰ قسمت
حالا بریم سراغ اصل کار. این مجموعه ساخت بازی با پایتون رو طوری جلو می بره که اول محیط رو آماده می کنی، بعد ماشین رو به حرکت در میاری، بعد به سراغ مانع و برخورد می ری و در آخر ظاهر و صدای بازی رو کامل می کنی. هر قسمت رو ببین، همون تغییر رو خودت روی پروژه اجرا کن و قبل از رفتن به قسمت بعد امتحانش کن.
قسمت ۱: نصب پایتون و آماده کردن محیط
توی قسمت اول فضای کارمون رو درست می کنیم. Python و ویرایشگر رو می شناسیم و مطمئن می شیم فایل های پروژه آماده اجرا هستن. مهم ترین نتیجه این جلسه اینه که بین نصب شدن Python و شناخته شدنش در ترمینال تفاوت بذاری؛ چون خیلی از خطاهایی که تازه کارها می بینن از همین جا شروع می شه.
تمرین بعد از این قسمت: بعد از دیدن ویدیو، ترمینال رو باز کن و نسخه Python رو بگیر. یک پوشه برای ماشین بازی بساز و یک فایل با پسوند py داخلش اجرا کن.
قسمت ۲: نصب Pygame و باز کردن پنجره بازی
حالا می رسیم به اولین نتیجه تصویری. با Pygame یک پنجره می سازیم و می فهمیم چرا بازی باید حلقه اصلی داشته باشه. اینجا موضوع فقط باز شدن یک صفحه خالی نیست؛ باید یاد بگیری پنجره رو درست ببندی، رویدادها رو دریافت کنی و حلقه بی پایان سیستم رو قفل نکنه.
تمرین بعد از این قسمت: بعد از این قسمت، رنگ پس زمینه و اندازه پنجره رو خودت عوض کن. اگه برنامه هنگ کرد، بررسی کن داخل حلقه از دریافت رویدادها و به روز کردن تصویر استفاده کردی یا نه.
قسمت ۳: اضافه کردن ماشین به صفحه
توی این قسمت شکل ماشین یا همون کفشدوزک رو وارد بازی می کنیم. کار اصلی شناخت تصویر، اندازه و جای قرار گرفتن اون توی پنجره است. اینجا باید تفاوت فایل تصویری با مستطیلی که موقعیتش رو نگه می داره بفهمی؛ چون همین فرق بعدا برای برخورد خیلی مهم می شه.
تمرین بعد از این قسمت: ماشین رو یک بار سمت چپ و یک بار سمت راست بذار، بعد اندازه اش رو تغییر بده. اگه تصویر خطا داد، اول مسیر فایل و اسم دقیقش رو بررسی کن.
قسمت ۴: حرکت ماشین با کیبورد
دیگه بازی از حالت عکس ثابت خارج می شه. حالا با دکمه های جهت دار ماشین رو حرکت می دیم و جلو رفتنش رو توی صفحه می بینیم. نکته مهم اینه که بازیکن نباید از جاده بیرون بره و بهتره سرعت حرکت به وضعیت اجرای بازی وابسته نباشه.
تمرین بعد از این قسمت: این بار حرکت رو با کلیدهای A و D هم آزمایش کن. یک شرط اضافه کن که ماشین از لبه های جاده بیرون نزنه.
قسمت ۵: صفحه باخت و شروع دوباره
وقتی برخورد اتفاق می افته، باید بازی واکنش مشخصی داشته باشه. این قسمت درباره حالت باخت و نمایش پیامیه که کاربر می بینه. فرق یک پروژه قابل بازی با یک انیمیشن ساده اینه که بازی وضعیت داره: شروع، در حال اجرا، باخت و شروع دوباره.
تمرین بعد از این قسمت: بعد از این جلسه، یک راه برای ریست بازی تعریف کن. موقع ریست باید جای ماشین، مانع ها و امتیاز همگی به حالت اول برگردن.
قسمت ۶: ساخت مانع های تصادفی
از اینجا بازی چالش پیدا می کنه. مانع ها وارد مسیر می شن و بازیکن باید ازشون جاخالی بده. برای اینکه هر بار همه چیز تکراری نباشه، می تونی مسیر یا زمان ظاهر شدن مانع رو با عدد تصادفی کنترل کنی؛ البته تصادفی بودن باید توی محدوده جاده و با فاصله منطقی باشه.
تمرین بعد از این قسمت: بعد از دیدن قسمت ششم، تعداد مانع ها و فاصله زمانی پیداشدنشون رو تغییر بده. حواست باشه مانع های خارج از صفحه از حافظه حذف بشن.
قسمت ۷: تشخیص برخورد ماشین و مانع
این قسمت یکی از مهم ترین جاهای آموزش Pygame است. چون فقط کشیدن ماشین کافی نیست؛ باید بفهمیم چه زمانی دو شی به هم می خورن. برای شروع از برخورد مستطیلی استفاده می کنیم. این روش ساده و سریع هست، اما برای تصویرهایی که دورشون فضای شفاف زیادی دارن همیشه دقیق ترین نتیجه رو نمی ده.
تمرین بعد از این قسمت: بعد از ویدیو، مرز برخورد رو آزمایش کن: ماشین رو فقط از گوشه به مانع بزن و ببین چه اتفاقی می افته. بعدا می تونی روش Mask رو برای دقت بیشتر بررسی کنی.
قسمت ۸: رسم شکل ها و ظاهر بازی
حالا دستت برای طراحی ظاهر بازی بازتر می شه. رسم خط، شکل و سطح های مختلف کمک می کنه جاده، خطوط وسط، امتیاز یا جلوه های ساده رو بسازی. این قسمت بهترین فرصته که بفهمی چرا طراح بازی علاوه بر منطق، به ترتیب رسم اشیا و رنگ بندی هم توجه می کنه.
تمرین بعد از این قسمت: یک خط وسط جاده بکش و چند رنگ متفاوت رو امتحان کن. اگه خط ها پشت پس زمینه ناپدید شدن، ترتیب دستورهای رسم رو بررسی کن.
قسمت ۹: ساخت صفحه شروع بازی
یک بازی خوب قبل از شروع باید به کاربر بگه چیکار کنه. توی این قسمت صفحه شروع رو طراحی می کنیم تا بازیکن بدونه چه کلیدی رو بزنه و هدفش چیه. همین صفحه ساده روی حس کامل بودن پروژه خیلی اثر می ذاره و تمرین خوبیه برای مدیریت حالت های مختلف برنامه.
تمرین بعد از این قسمت: برای صفحه شروع یک متن کوتاه بنویس، کلید شروع رو مشخص کن و نذار قبل از شروع، مانع ها حرکت کنن.
قسمت ۱۰: صدا و موسیقی بازی
توی قسمت آخر سراغ موسیقی و افکت صوتی می ریم. فرق یک فایل صوتی کوتاه برخورد با موسیقی پس زمینه رو می فهمیم و درباره بارگذاری فایل، بلندی صدا و خطای مسیر صحبت می کنیم. اگه سیستم صدا نداشت، اول مسیر و فرمت فایل و بعد مقداردهی اولیه Mixer رو بررسی کن.
تمرین بعد از این قسمت: یک کلید برای قطع و وصل صدا اضافه کن. حواست باشه صدای پیش فرض خیلی بلند نباشه و فقط از فایل هایی استفاده کنی که حق استفاده ازشون رو داری.
چطور منطق بازی ماشین رو کامل تر کنیم؟
تا اینجا با ۱۰ قسمت اصلی ساخت بازی با پایتون آشنا شدی. حالا اگه می خوای از پروژه ویدیویی یک قدم جلوتر بری، سه کار خیلی نتیجه می ده: سیستم امتیاز بر اساس موانع رد شده، سخت تر شدن تدریجی بازی و امکان شروع دوباره بدون بستن پنجره. این سه ویژگی باعث می شن بازی از یک نمایش ساده به چیزی تبدیل بشه که آدم دلش بخواد دوباره امتحانش کنه.
برای امتیازدهی دو راه داری: مدت زمانی که بازیکن زنده مونده یا تعداد موانعی که رد کرده. من برای تمرین دوم رو دوست دارم؛ چون می شه خیلی واضح دید کدوم مانع از پایین صفحه رد شده. برای سخت تر شدن هم می تونی سرعت مانع رو کمی زیاد کنی، ولی بهتره یک سقف مشخص داشته باشه تا بازی بعد از چند ثانیه غیرمنصفانه نشه.
موضوع بعدی برخورد دقیق تره. colliderect فقط مستطیل ها رو بررسی می کنه؛ برای شروع خوبه و سریع اجرا می شه. ولی اگه ماشین تصویر شفاف با گوشه های عجیب داشته باشه، ممکنه پیش از تماس واقعی با بدنه، برخورد ثبت بشه. اون وقت می تونی سراغ pygame.mask بری و تفاوت برخورد مستطیلی و پیکسلی رو با مثال تست کنی.
import pygame
car = pygame.Rect(120, 240, 45, 70)
wall = pygame.Rect(135, 180, 60, 65)
if car.colliderect(wall):
print("Collision detected")یک بازی ماشین کوچک با کد کامل و بدون فایل اضافه
برای اینکه آموزش ساخت بازی با Pygame فقط به تماشای ویدیو وابسته نباشه، یک نمونه مستقل هم آماده کردم. این یکی تصویر خارجی نمی خواد؛ ماشین و جاده با شکل های ساده رسم می شن. با کلیدهای چپ و راست یا A و D حرکت می کنی، با Space بازی رو شروع می کنی و بعد از باخت دوباره از اول می ری. این نمونه از نظر هدف آموزشی با پروژه GitHub یکسانه، اما سورس اصلی ویدیو نیست.
کد زیر رو داخل فایل mini_car_race.py ذخیره کن. بهتره از فایلی که همراه بسته این مقاله گذاشتم استفاده کنی تا موقع کپی کردن تورفتگی ها به هم نریزه. قبل از اجرا Pygame رو نصب کرده باش. اگر از داخل VS Code اجرا می کنی، همون Python محیط مجازی رو انتخاب کن.
import random
import pygame
WIDTH, HEIGHT = 480, 680
ROAD_LEFT, ROAD_RIGHT = 80, 400
FPS = 60
pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Mini Car Race")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 36)
small_font = pygame.font.Font(None, 28)
player = pygame.Rect(WIDTH // 2 - 20, HEIGHT - 120, 40, 72)
obstacles = []
score = 0
spawn_timer = 0.0
speed = 230.0
state = "start"
def reset_game():
global score, spawn_timer, speed, state
player.centerx = WIDTH // 2
obstacles.clear()
score = 0
spawn_timer = 0.0
speed = 230.0
state = "playing"
def draw_text(text, y, color=(245, 245, 245), small=False):
surface = (small_font if small else font).render(text, True, color)
screen.blit(surface, surface.get_rect(center=(WIDTH // 2, y)))
running = True
while running:
dt = min(clock.tick(FPS) / 1000.0, 0.05)
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
running = False
elif event.key == pygame.K_SPACE and state != "playing":
reset_game()
if state == "playing":
keys = pygame.key.get_pressed()
direction = int(keys[pygame.K_RIGHT] or keys[pygame.K_d]) - int(
keys[pygame.K_LEFT] or keys[pygame.K_a]
)
player.x += round(direction * 310 * dt)
player.left = max(ROAD_LEFT + 7, player.left)
player.right = min(ROAD_RIGHT - 7, player.right)
spawn_timer += dt
if spawn_timer >= max(0.40, 1.05 - score * 0.012):
spawn_timer = 0.0
lane = random.choice([135, 220, 305])
obstacles.append([pygame.Rect(lane - 21, -90, 42, 70), -90.0])
for item in obstacles[:]:
rect, y = item
y += speed * dt
item[1] = y
rect.y = round(y)
if rect.colliderect(player):
state = "game_over"
elif rect.top > HEIGHT:
obstacles.remove(item)
score += 1
speed = min(470, speed + 5)
screen.fill((23, 38, 54))
pygame.draw.rect(screen, (52, 58, 65), (ROAD_LEFT, 0, ROAD_RIGHT - ROAD_LEFT, HEIGHT))
pygame.draw.line(screen, (240, 240, 235), (ROAD_LEFT, 0), (ROAD_LEFT, HEIGHT), 5)
pygame.draw.line(screen, (240, 240, 235), (ROAD_RIGHT, 0), (ROAD_RIGHT, HEIGHT), 5)
for x in (185, 295):
for y in range(-20, HEIGHT, 90):
pygame.draw.line(screen, (205, 208, 200), (x, y), (x, y + 42), 3)
pygame.draw.rect(screen, (55, 170, 240), player, border_radius=9)
pygame.draw.rect(screen, (165, 225, 255), player.inflate(-16, -27), border_radius=5)
for rect, _ in obstacles:
pygame.draw.rect(screen, (240, 80, 80), rect, border_radius=7)
pygame.draw.rect(screen, (115, 23, 29), rect.inflate(-18, -30), border_radius=4)
label = font.render(f"Score: {score}", True, (255, 255, 255))
screen.blit(label, (12, 10))
if state == "start":
draw_text("MINI CAR RACE", HEIGHT // 2 - 45)
draw_text("SPACE = START", HEIGHT // 2, small=True)
draw_text("ARROWS / A-D = MOVE", HEIGHT // 2 + 36, small=True)
elif state == "game_over":
draw_text("GAME OVER", HEIGHT // 2 - 40, color=(255, 105, 105))
draw_text("SPACE = TRY AGAIN", HEIGHT // 2 + 8, small=True)
pygame.display.flip()
pygame.quit()این کد برای تمرین خواندن و تغییر دادن ساخته شده و روی سیستم مجهز به Pygame باید پنجره گرافیکی باز کنه. من نحوه درست بودن نحوی Python رو بررسی کردم، اما چون توی محیط بررسی، Pygame نصب نبود، اجرای واقعی پنجره رو ادعا نمی کنم. برای تست، اول با Space شروع کن، با A و D جاخالی بده و بعد از برخورد دوباره Space رو بزن.
اگه کد خیلی بلند به نظر میاد، به جای اینکه همه اش رو یک جا حفظ کنی، به سه تکه نگاه کن: بخش اول تنظیمات اولیه است؛ بخش دوم رویداد و تغییر وضعیت بازی رو انجام می ده؛ بخش آخر هر فریم تصویر تازه رو رسم می کنه. وقتی این سه قسمت رو تشخیص بدی، خواندن سورس های دیگه ساخت بازی با پایتون هم برات راحت تر می شه.
رفع خطاهای رایج نصب و اجرای Pygame
حالا برسیم به بخشی که خیلی ها توی گوگل سرچ می کنن. معمولا مشکل اصلی تازه کارها خود بازی نیست؛ برنامه یک خطا می ده، پنجره باز نمی شه یا عکس ماشین لود نمی شه. من پیشنهاد می کنم هر وقت خطا گرفتی، متن کاملش رو بخونی و اول مشخص کنی مشکل از نصب بسته است، مسیر فایل، ورودی برنامه یا منطق بازی.
ارور No module named pygame
این خطا یعنی Python که فایل رو اجرا کرده کتابخانه Pygame رو توی محیط خودش پیدا نکرده. ممکنه نصبش کرده باشی، ولی روی یک Python دیگه. اول این دو دستور رو با همون ترمینالی اجرا کن که بازی رو ازش باز می کنی. خروجی مسیر اجرایی Python و محل نصب بسته رو می بینی.
python -c "import sys; print(sys.executable)"
python -m pip show pygame
python -m pip install pygameاگه توی ویندوز به جای python از py استفاده می کنی، همه دستورها رو یکدست با همون اجرا کن. در VS Code هم از بخش Python: Select Interpreter محیط درست رو انتخاب کن. برای نصب در محیط مجازی لازم نیست نصب سراسری رو دستکاری کنی.
Pygame نصب نمی شه یا pip خطای SSL و Timeout می ده
برای کاربران ایران باید اول بین چند نوع مشکل فرق بذاریم. Read timed out بیشتر از اینکه نشان دهنده خطای کد باشه، نشون می ده ارتباط با سرور بسته در زمان مقرر برقرار نشده. SSL certificate verify failed می تونه به گواهی، پراکسی یا تنظیمات شبکه مربوط باشه. No matching distribution found هم ممکنه از نسخه نامناسب Python یا نبود بسته سازگار بیاد. پس هر سه رو با یک VPN یا یک دستور تصادفی درمان نکن.
اول نسخه Python و pip رو چک کن. اگر اتصال به PyPI از اینترنتت دچار محدودیت یا اختلاله، با یک اتصال سالم یا VPN معتبر که واقعا ترافیک ترمینال رو پوشش می ده، دوباره امتحان کن. اگر فقط مرورگرت VPN داره، ممکنه ترمینال همچنان از مسیر قبلی بره. از دانلود فایل wheel ناشناس از کانال های تلگرامی هم خودداری کن.
python --version
python -m pip --version
python -m pip install --upgrade pip
python -m pip install pygameعکس ماشین یا موسیقی پیدا نمی شه
ارور FileNotFoundError معمولا یعنی برنامه دنبال فایل اشتباه می گرده، نه اینکه Pygame خراب شده باشه. حروف بزرگ و کوچک مسیر روی لینوکس مهمن. اگر پوشه asset رو جا به جا کردی یا از یک پوشه دیگه فایل Python رو اجرا می کنی، مسیر نسبی می تونه به هم بخوره. راه درست برای کد جدید، ساخت مسیر از کنار خود فایل برنامه است.
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent
CAR_IMAGE = BASE_DIR / "assets" / "car.png"
print(CAR_IMAGE, CAR_IMAGE.exists())اسم فایل نمونه بالا صرفا مثاله؛ باید با اسم واقعی فایل های پروژه خودت یکی باشه. برای فایل ZIP قدیمی قبل از عوض کردن کد، ساختار پوشه ها و نام فایل ها رو بررسی کن. اگر از PyInstaller خروجی می گیری، مسیر فایل های همراه برنامه نیاز به توجه جداگانه داره.
بازی سیاه می مونه، هنگ می کنه یا پنجره بسته نمی شه
اینجا اول حلقه اصلی بازی رو چک کن. اگه رویدادهای سیستم رو با pygame.event.get() بررسی نکنی، ممکنه پنجره جواب نده. اگه هم pygame.display.flip() یا pygame.display.update() رو فراموش کنی، تغییرات همیشه روی تصویر نمایش داده نمی شن. برای تنظیم نرخ فریم هم Clock.tick کمک می کنه، ولی خودش تمام مشکل های عملکرد رو حل نمی کنه.
ماشین خیلی سریع یا خیلی کند حرکت می کنه
اگر سرعت رو فقط به تعداد فریم گره بزنی، روی دو سیستم مختلف ممکنه حرکت متفاوت به نظر برسه. راه معمول اینه که زمان بین فریم ها رو با dt حساب کنی و سرعت رو بر حسب پیکسل در ثانیه بنویسی. توی نمونه مستقل همین کار رو کردم. البته برای برخوردهای خیلی دقیق یا فیزیک پیچیده، ممکنه به قدم زمانی ثابت هم نیاز پیدا کنی.
موسیقی پخش نمی شه
قبل از اینکه فکر کنی سیستم خراب شده، ببین فایل صوتی واقعا وجود داره و قابل خوندنه، دستگاه خروجی صدا فعال هست و Mixer درست مقداردهی شده. توی بعضی محیط های سروری یا نشست های بدون دستگاه صدا، راه اندازی صوتی ممکنه انجام نشه. برای شروع بازی بهتره خطای صدا کل برنامه رو از کار نندازه.
چطور از بازی پایتون فایل EXE بگیریم؟
ساخت بازی با پایتون وقتی جذاب تر می شه که بتونی فایل اجرایی رو به دوستت نشون بدی. PyInstaller یکی از ابزارهای رایج این کاره. روی ویندوز می تونی با دستور زیر یک خروجی جداگانه بگیری؛ اما حواست باشه اگر پروژه از تصویر و صدا استفاده می کنه، این دستور به تنهایی همیشه کافی نیست و باید فایل های داده رو هم همراه خروجی بسته بندی کنی.
python -m pip install pyinstaller
python -m PyInstaller --onefile --windowed mini_car_race.pyبرای نمونه مستقل این مقاله که عکس و آهنگ خارجی نداره، موضوع ساده تره. فایل اجرایی معمولا در پوشه dist قرار می گیره. برای ساخت خروجی ویندوز، روی ویندوز بیلد بگیر؛ خروجی لینوکس و مک هم باید روی همون پلتفرم ساخته بشه. خروجی رو روی یک سیستم دوم هم امتحان کن تا مطمئن بشی چیزی از قلم نیفتاده.
فرق Pygame با Flutter، Flame، Godot و Unity چیه؟
بعضی از دانشجوها بعد از ساخت بازی ماشین می پرسن: حالا اگه بخوام گرافیک بهتر و خروجی موبایل داشته باشم باید همه چیز رو دور بریزم؟ نه. اتفاقا مفاهیمی که اینجا یاد گرفتی، مثل حلقه بازی، برخورد، حالت برنامه و مدیریت ورودی توی ابزارهای دیگه هم به کارت میان. ولی انتخاب ابزار باید به چیزی که می خوای بسازی بستگی داشته باشه، نه صرفا اسم یک فریم ورک.
| هدف تو | انتخاب منطقی برای بررسی | دلیل |
|---|---|---|
| اولین بازی دوبعدی با کدنویسی ساده | Python + Pygame | فهم سریع منطق و کنترل مستقیم کد |
| بازی دوبعدی سبک کنار اپ موبایل | Flutter + Flame | استفاده از اکوسیستم Flutter برای اپ و بازی |
| بازی دوبعدی یا سه بعدی با ادیتور آماده | Godot | صحنه، انیمیشن، ابزارهای مخصوص بازی |
| بازی سه بعدی بزرگ تر و اکوسیستم گسترده | Unity یا Unreal | موتور تخصصی، ابزارهای رندر و توسعه تیمی |
یه نکته مهم: Flutter و Flame می تونن برای بازی های دوبعدی سبک و Casual مناسب باشن و خروجی موبایل، وب یا دسکتاپ بدن. ولی اینکه با Flutter گرافیک «بهتر» بگیری، قانون ثابت نیست. کیفیت تصویر به طراحی، موتور رندر، دارایی های گرافیکی و معماری بازی هم وابسته است. اگه هدفت ساخت اپ موبایل و بازی های سبک کنارش باشه، یادگیری Dart و Flutter می تونه مسیر ارزشمندی باشه.
توی مسیر آموزش فلاتر نابغه ها بیشتر درباره ساخت اپ واقعی، مدیریت State، اتصال به API و معماری پروژه حرف می زنیم؛ این ها برای ساخت یک محصول قابل ارائه مهمن، حتی اگر بخشی از اپ تو یک بازی ساده باشه. برای شروع هم دوره دارت پایه زبانی رو روشن می کنه. اگه فقط بازی سه بعدی سنگین می خوای، بهتره مستقیم درباره Godot، Unity و Unreal تحقیق کنی، نه اینکه به زور Flutter رو به همه پیشنهاد بدیم.
این بازی چطور می تونه به برنامه نویسی واقعی ربط پیدا کنه؟
یه مثال واقعی از فضای ایران بزنم. فرض کن یک آموزشگاه می خواد برای بچه ها بازی آموزشی بسازه یا یک شرکت می خواد توی اپ خودش یک مینی گیم تبلیغاتی داشته باشه. ساختن نسخه اولیه بازی می تونه یک نمونه کار خوب باشه، اما برای تحویل کار به مشتری باید چیزهای دیگه ای هم بلد باشی: ذخیره امتیاز، مدیریت خطا، اجرای پایدار و گاهی ارتباط با سرور. اینجاست که تفاوت «بازی راه افتاد» با «محصول آماده استفاده است» رو می فهمی.
مثلا می تونی بعد از تمام شدن این آموزش بازی سازی گرافیکی با پایتون، امتیازها رو در یک فایل JSON یا دیتابیس SQLite ذخیره کنی. بعد یک صفحه رکورد بسازی و نشان بدی آخرین بازی ها چه امتیازی گرفتن. برای این کار از منطق اولیه بازی فراتر می ری و وارد مدیریت داده، ساختار پروژه و تست می شی؛ مهارت هایی که توی کار واقعی هم لازم می شن.
اگر حس کردی مبانی Python یا طراحی پروژه رو پراکنده یاد گرفتی، اینجا وقت خوبیه که سراغ آموزش پایتون نابغه ها بری و از متغیر و تابع تا شی گرایی، فایل و دیتابیس رو منظم جلو ببری. ولی حتی بدون خرید دوره هم همین بازی رایگان می تونه محک خوبی باشه: آیا می تونی یک قابلیت تازه رو بدون کپی کردن تمام سورس اضافه کنی؟
از طرف دیگه، اگه روی لینوکس کار می کنی، راه انداختن محیط Python و نصب بسته ها تمرین خوبی برای یاد گرفتن ترمیناله. توی آموزش های رایگان Linux Essentials با همین مبانی آشنا می شی. اگر هم به هک و امنیت علاقه داری، همین بازی بهت یاد می ده ورودی رو اعتبارسنجی کنی، فایل ناشناس رو بی دلیل اجرا نکنی و فرق کد قابل اعتماد و فایل EXE دانلودشده از منبع نامعلوم رو بفهمی؛ برای ادامه می تونی مسیر تست نفوذ قانونی رو بخونی. لازم نیست هر مقاله بازی سازی رو به زور به هک ربط بدیم؛ این ها مهارت های مکملن.

۵ تمرین که بعد از ویدیوها باید خودت انجام بدی
من معمولا موقع یادگیری برنامه نویسی یک قانون ساده دارم: هر وقت پروژه آموزشی تموم شد، تازه تمرین واقعی شروع می شه. تا وقتی بازی دقیقا همونیه که توی ویدیو دیدی، هنوز معلوم نیست چقدر از منطقش رو فهمیدی. پیشنهاد می کنم از پنج تغییر زیر شروع کنی و هر کدوم رو جدا تست کنی.
تمرین اول: سه درجه سختی
برای بازی حالت آسون، معمولی و سخت بساز. تفاوتشون می تونه سرعت مانع یا فاصله بین مانع ها باشه. مقدارها رو توی چند متغیر نگه دار که بعدا لازم نباشه ده جای کد رو عوض کنی.
تمرین دوم: رکورد شخصی
امتیاز بالاترین بازی رو توی فایل JSON ذخیره کن. موقع اجرای بعدی رکورد رو بخون و به بازیکن نشون بده. حواست باشه فایل ممکنه وجود نداشته باشه یا محتوای خراب داشته باشه.
تمرین سوم: صفحه Pause
با کلید P بازی رو متوقف کن، ولی پنجره همچنان پاسخگو بمونه. یعنی رویدادها باید پردازش بشن؛ فقط حرکت ماشین و مانع ها موقتا متوقف بشه.
تمرین چهارم: کنترل با موبایل
اگه بعدا سراغ Flutter و Flame رفتی، همین منطق رو با دکمه های لمسی و صفحه موبایل پیاده کن. این کار تمرین خوبیه برای جدا کردن ورودی از منطق بازی.
تمرین پنجم: تست سه خطای عمدی
نام یکی از تصویرها رو اشتباه بنویس، یک مانع رو خارج از صفحه نگه دار و یک بار هم حلقه رو بدون محدودیت سرعت اجرا کن. حالا هر خطا رو از روی پیام و رفتار برنامه پیدا و رفع کن.
اشتباه های رایج موقع ساخت بازی با پایتون
یک مشکل تکراری موقع ساخت بازی با پایتون اینه که همه چیز رو توی یک حلقه بلند می نویسیم. تا وقتی بازی فقط ماشین و یک مانع داره، این موضوع خیلی به چشم نمیاد؛ اما همین که صفحه شروع، امتیاز، موسیقی و دکمه ریست اضافه می شه، یک تغییر کوچک می تونه سه بخش دیگه رو خراب کنه. برای همین از همون اول سعی کن مسئولیت قسمت های مختلف رو از هم جدا نگه داری.
به نظرم بازی سازی با پایتون وقتی واقعا بهت چیزی یاد می ده که بتونی برای هر رفتار یک تابع مشخص بسازی. مثلا تابع reset_game فقط وظیفه ریست داشته باشه، تابع spawn_obstacle مانع بسازه و تابع draw تصویر رو روی صفحه بیاره. اگه این الگو رو یاد بگیری، بعدا رفتن به سمت پروژه های بزرگ تر کمتر گیجت می کنه.
توی آموزش Pygame لازم نیست از روز اول ده کلاس بسازی و همه چیز رو شی گرا کنی. اول رفتارها رو بفهم، بعد وقتی برنامه بزرگ شد اون ها رو جدا کن. برای همین در نمونه مستقل این صفحه یک تابع برای شروع دوباره و یک تابع برای نمایش متن گذاشتم، ولی هنوز ساختار بازی رو برای خواننده تازه کار قابل دنبال کردن نگه داشتم.
چطور ماشین بازی رو نرم و روان حرکت بدیم؟
وقتی می خوای ساخت بازی ماشین با پایتون رو جدی تر تمرین کنی، به یک چیز دقت کن: نگه داشتن کلید با یک بار فشار دادنش فرق داره. برای حرکت پیوسته باید وضعیت دکمه رو در طول حلقه بازی بخونی؛ اما برای شروع بازی یا ورود به منو، معمولا رویداد KEYDOWN انتخاب منطقی تریه. این تفاوت جلوی کلی رفتار عجیب رو می گیره.
در ساخت بازی با پایتون، مشکل کند یا تند شدن حرکت معمولا از این میاد که هر فریم یک عدد ثابت به مختصات اضافه می کنیم. اگر به جای اون زمان بین فریم ها رو حساب کنی، حرکت روی دستگاه های مختلف قابل پیش بینی تر می شه. برای آزمایش، محدودیت clock.tick(60) رو به ۳۰ تغییر بده و تفاوت دو روش حرکت رو با چشم ببین.
برای بازی سازی گرافیکی با پایتون روی سیستم های ضعیف هم بهتره تعداد تصویرهای خیلی بزرگ، افکت های بی مورد و بارگذاری فایل داخل حلقه اصلی رو محدود کنی. تصویر و صدا رو قبل از حلقه بارگذاری کن؛ داخل حلقه فقط چیزی رو تغییر بده که واقعا به روز می شه. این تکنیک ساده توی یک بازی دوبعدی سبک هم تاثیر محسوسی می تونه داشته باشه.
چرا مانع ها باید تصادفی اما منصفانه باشن؟
اگر ساخت بازی با پایتون رو فقط با random.randint جلو ببری، ممکنه مانع ها روی هم ظاهر بشن یا هیچ راه فراری برای ماشین باقی نذارن. تصادفی بودن به معنی بی قانون بودن نیست. بهتره مسیرهای مشخص یا Lane داشته باشی و فاصله زمانی ظاهر شدن مانع رو بر اساس سرعت واقعی بازی تعیین کنی.
توی پروژه ساخت بازی ماشین با پایتون می تونی سه لاین تعریف کنی و هر بار یکی رو انتخاب کنی. بعد برای سخت تر شدن بازی، به جای پر کردن تمام مسیر، سرعت موانع رو کمی بیشتر کن. مهم اینه که بازیکن وقتی می بازه حس کنه می تونسته با تصمیم بهتر فرار کنه، نه اینکه بازی از اول شانس برد نداشته.
این قسمت از آموزش Pygame یک تمرین عالی برای آزمودن فرضیه است. ده بار بازی رو اجرا کن و فقط لحظه های باخت رو یادداشت کن. اگر چند بار پشت سر هم مانع ها طوری ظاهر شدن که هیچ حرکتی جواب نمی ده، تنظیمات تولید مانع رو بازبینی کن. این نگاه تجربی بعدها توی تست نرم افزار و حتی امنیت برنامه هم به کارت میاد.
چطور بازی رو برای دیگران قابل استفاده کنیم؟
هدف ساخت بازی با پایتون فقط این نیست که روی لپ تاپ خودت پنجره باز بشه. اگر می خوای به دوستت بدی بازی کنه، باید مشخص باشه کدوم کلید شروعه، کدوم کلید برای حرکت استفاده می شه و بعد از باخت چطور دوباره بازی کنه. یک صفحه شروع خوب از ده جلوه تزئینی بی دلیل کاربردی تره.
از نظر بازی سازی با پایتون، یک مرحله مهم دیگه هم آزمایش با آدم واقعیه. بازی رو بدون توضیح دادن جلوی یکی بذار و فقط نگاه کن چه کار می کنه. اگر هیچ کس نمی فهمه چطور باید بازی رو شروع کنه، مشکل لزوما از بازیکن نیست؛ احتمالا رابط بازی راهنمای کافی نداره.
اگر تصمیم گرفتی سراغ ساخت بازی گرافیکی با پایتون و فایل اجرایی بری، فقط اجرا شدن برنامه روی سیستم خودت رو معیار قرار نده. روی یک سیستم تمیز هم تست کن؛ ببین فونت، تصویر، صدا و فایل های ذخیره امتیاز پیدا می شن یا نه. این مرحله همون چیزیه که پروژه تمرینی رو به نمونه کاری قابل ارائه نزدیک می کنه.
آموزش Pygame از روی کد، نه حفظ کردن ویدیو
بهترین روش من برای آموزش Pygame اینه که هر بار فقط یک موضوع رو یاد بگیری و بلافاصله باهاش چیزی بسازی. مثلا بعد از یاد گرفتن Rect، فقط برخورد رو تست کن. بعد از فهمیدن Clock، سرعت رو تغییر بده. وقتی چند مفهوم تازه رو یک دفعه قاطی می کنی، تشخیص اینکه خطا از کجا اومده سخت می شه.
ساخت بازی با پایتون یک فرصت خوبه تا با دیباگر هم آشنا بشی. به جای ده بار print گذاشتن، روی خط تغییر امتیاز یا ایجاد مانع Breakpoint بذار و مقدار متغیر رو ببین. وقتی بفهمی چرا مانع دقیقا در یک مختصات ظاهر شده، دیگه برای هر تغییر کوچک مجبور نیستی دنبال یک ویدیوی تازه بگردی.
اگر قصد داری بعدا آموزش ساخت بازی با پایتون رو ادامه بدی، بهتره از همین پروژه یک مخزن Git شخصی بسازی. هر بار که یک ویژگی رو سالم کردی، یک Commit با توضیح واضح ثبت کن. این کار هم برگشت به نسخه سالم رو آسان می کنه، هم وقتی نمونه کارت رو نشون می دی، معلومه واقعا روی پروژه وقت گذاشتی.
مسیر بعد از این آموزش بازی سازی با پایتون چیه؟
وقتی ده ویدیو و تمرین ها رو تموم کردی، سه راه جلوت هست. اگر از منطق بازی و الگوریتم خوشحال شدی، ساخت بازی با پایتون رو با پروژه های مار، پینگ پنگ یا فلاپی برد ادامه بده. اگر از طراحی صفحه و تجربه موبایل خوشت اومد، Flutter و Flame رو امتحان کن. اگر هم گرافیک سه بعدی و دنیای بزرگ می خوای، زودتر با موتورهای اختصاصی بازی آشنا شو.
نکته اینجاست که بازی سازی با پایتون قرار نیست تنها شغل یا تنها مسیر برنامه نویسی تو باشه. همین پروژه ممکنه بهت نشون بده بیشتر از طراحی بازی، عاشق کار با الگوریتم، فایل، رابط کاربری یا ساخت ابزار هستی. این کشف ارزشمنده؛ چون قبل از هزینه کردن برای دوره ها و ابزارهای متعدد، با یک تجربه واقعی سلیقه خودت رو می شناسی.
پس اگه دنبال آموزش ساخت بازی با پایتون هستی، از همین ماشین بازی شروع کن و خروجی رو با تمرین خودت تغییر بده. برای قدم بعدی هم عجله نکن؛ اول ببین از کدوم قسمت بیشتر لذت بردی. مسیر درست یادگیری برنامه نویسی از همین سوال ها شکل می گیره، نه از اینکه صرفا یک اسم معروف رو شنیدی.
از کجا بفهمی ساخت بازی با پایتون رو واقعا یاد گرفتی؟
جواب این سوال فقط تعداد ساعت ویدیویی نیست که دیدی. وقتی بدون نگاه کردن به جواب بتونی جای مانع ها رو تغییر بدی، بازی رو ریست کنی، خطای فایل رو پیدا کنی و یک قابلیت تازه اضافه کنی، یعنی داری از مرحله تقلید عبور می کنی. برای ساخت بازی با پایتون مهم تر از حفظ کردن توابع، همین توانایی عیب یابی و تغییر دادنه.
اگه این پروژه برات لذت بخش بود، پیشنهاد می کنم بعدش آموزش ساخت فلاپی برد با پایتون رو هم ببینی. اونجا به جای ماشین و مانع افقی، با جاذبه، پرش و لوله ها سروکار داری. کنار هم گذاشتن این دو بازی، تفاوت مدل حرکت و برخورد رو خیلی خوب نشون می ده.
سوالات متداول ساخت بازی با پایتون و Pygame
با پایتون میشه بازی ساخت؟
بله. برای شروع بازی های دوبعدی، Pygame انتخاب خوبیه. می تونی حرکت، برخورد، امتیاز، صدا و تصویر رو با Python کنترل کنی. فقط برای پروژه سه بعدی بزرگ، احتمالا موتور تخصصی مناسب تری لازم داری.
Pygame چیه؟
یک کتابخانه برای کار با پنجره، گرافیک دوبعدی، ورودی و صدا در Python هست. خودت منطق بازی رو می نویسی و Pygame ابزار لازم رو در اختیارت می ذاره.
ساخت بازی با پایتون سخته؟
برای شروع نه، به شرط اینکه با متغیر، شرط و حلقه آشنا باشی و پروژه رو مرحله مرحله جلو ببری. یک بازی ماشین ساده می تونه تمرین خوبی باشه.
آموزش Pygame برای چه سطحیه؟
اگه Python پایه رو تا حد شرط و حلقه بلدی، می تونی شروع کنی. برای فهم کدهای بلندتر، تابع و لیست هم به کارت میاد.
ساخت بازی ماشین با پایتون چقدر طول می کشه؟
به تجربه و وقتی که می ذاری بستگی داره. یک نمونه خیلی کوچک رو شاید ظرف یک روز بسازی؛ اما برای اضافه کردن صدا، امتیاز، رفع خطا و ظاهر تمیز معمولا تمرین بیشتری لازم داری.
چطور Pygame رو نصب کنم؟
توی محیط مجازی پروژه، دستور python -m pip install pygame رو اجرا کن و بعد python -m pygame.examples.aliens رو امتحان کن. اگر نصب نشد، نسخه Python و اتصال شبکه رو بررسی کن.
چرا No module named pygame می گیرم؟
معمولا بازی با یک Python اجرا می شه ولی Pygame در محیط دیگه ای نصب شده. مسیر Python فعال و Interpreter انتخاب شده در VS Code رو بررسی کن.
چرا پنجره Pygame سیاهه؟
ممکنه هنوز چیزی رسم نکرده باشی، دستور به روز کردن نمایشگر رو نزده باشی یا حلقه رویداد درست اجرا نشه. اول یک مستطیل ساده روی صفحه رسم کن.
چطور ماشین رو با کیبورد حرکت بدم؟
از pygame.key.get_pressed برای خواندن کلیدهای نگه داشته شده استفاده کن و موقعیت ماشین رو بر اساس جهت و زمان سپری شده تغییر بده.
چطور برخورد ماشین و مانع رو تشخیص بدم؟
برای شروع از pygame.Rect.colliderect استفاده کن. برای تصویرهایی که شکل نامنظم دارن، روش های دقیق تر مثل ماسک هم وجود داره.
چطور سرعت بازی رو زیاد کنم؟
می تونی با بالا رفتن امتیاز، سرعت حرکت مانع ها رو بیشتر کنی. بهتره سرعت سقف مشخص داشته باشه و حرکت به dt وابسته باشه.
آیا میشه با پایتون بازی آنلاین ساخت؟
بله، اما Pygame به تنهایی همه بخش های شبکه و سرور بازی آنلاین رو آماده نمی کنه. برای چند نفره شدن باید تبادل پیام، وضعیت بازی و همگام سازی رو جدا طراحی کنی.
چطور از بازی پایتون EXE بگیرم؟
PyInstaller یک گزینه رایجه. روی ویندوز اجراش کن و اگر بازی تصویر یا صدا داره، فایل های همراهش رو هم بسته بندی کن. خروجی رو روی سیستم دیگه تست کن.
چرا فایل عکس بازی پیدا نمیشه؟
نام فایل و پوشه، مسیر کاری ترمینال و حروف بزرگ و کوچک رو چک کن. بهتره مسیر رو از کنار فایل py با pathlib بسازی.
چطور صدا به بازی اضافه کنم؟
با pygame.mixer می تونی افکت و موسیقی پخش کنی. اول مطمئن شو فایل وجود داره و دستگاه صدای سیستم در دسترسه.
آیا برای بازی سازی با پایتون باید ریاضی قوی داشته باشم؟
برای ماشین بازی دوبعدی، جمع و تفریق، مختصات و کمی منطق کافیه. برای فیزیک پیشرفته، حرکت سه بعدی و موتورهای سنگین تر ریاضی بیشتر لازم می شه.
Pygame روی لینوکس کار می کنه؟
بله، اگر Python و وابستگی های سازگار نصب باشن و محیط گرافیکی داشته باشی. در توزیع هایی که pip سراسری محدود شده، محیط مجازی بساز.
Pygame برای ساخت بازی اندروید خوبه؟
مسیر اصلی این آموزش بازی دسکتاپه. اگر هدفت بازی دوبعدی سبک داخل اپ موبایله، Flutter و Flame هم گزینه های قابل بررسی هستن؛ برای بازی سه بعدی یا پروژه بزرگ بهتره موتور تخصصی رو مقایسه کنی.
فرق Pygame با Unity و Godot چیه؟
Pygame کتابخانه ای سبک تره و بخش زیادی از مدیریت بازی رو خودت می نویسی؛ Unity و Godot ابزارهای جامع تر و ادیتور مخصوص بازی دارن.
با Flutter هم میشه بازی ساخت؟
بله، برای بازی های دوبعدی و Casual می تونی از Flutter و موتور Flame استفاده کنی. اما گرافیک بهتر یا عملکرد عالی خودکار تضمین نمی شه.
آیا باید برای فایل های پروژه هزینه بدم؟
نه، ویدیوهای همین مقاله رایگانن و فایل اصلی CarRace در مخزن GitHub نابغه ها قرار داره. فایل های جانبی رو از منبع مشخص بگیر.
فایل RaceCarGame.zip رو از کجا دانلود کنم؟
از مخزن NABEGHEHACOM/CarRace در GitHub. فایل ZIP رو دانلود و استخراج کن و ساختار پوشه ها رو نگه دار.
کد کوتاه این مقاله با سورس ویدیو یکیه؟
نه. نمونه کوچک برای تمرین مستقل نوشته شده. اگه می خوای دقیقا پروژه ویدیویی رو اجرا کنی، فایل GitHub همون پروژه رو بگیر.
برای ساخت بازی با پایتون از کجا شروع کنم؟
از اصول Python مثل شرط و حلقه شروع کن، بعد پنجره بازی رو بساز، حرکت رو اضافه کن، مانع و برخورد رو پیاده کن و در آخر سراغ صدا و امتیاز برو.
بعد از این پروژه چه بازی دیگه ای بسازم؟
فلاپی برد، مار یا یک بازی ساده جمع کردن سکه انتخاب های خوبی هستن. هدف اینه که یک منطق تازه رو بدون کپی کامل پروژه قبلی حل کنی.
آیا برای این آموزش اینترنت دائمی لازم دارم؟
برای دانلود Python، Pygame، ویدیوها و سورس به اینترنت نیاز داری. بعد از نصب وابستگی ها، اجرای بازی محلی معمولا به اتصال دائمی وابسته نیست.
چرا توی ایران نصب کتابخانه خطا می ده؟
اول متن خطا رو بخون. Timeout، خطای گواهی SSL و ناسازگاری نسخه Python دلیل های متفاوت دارن. اگر دسترسی به مخزن از مسیر شبکه مختله، اتصال یا VPN معتبر رو بررسی کن.
آموزش ساخت بازی با پایتون برای نوجوان ها مناسبه؟
بله، اگر اصول شرط، متغیر و حلقه رو کم کم یاد بگیرن و با یک بازی دو بعدی کوچک شروع کنن. لازم نیست از روز اول سراغ پروژه خیلی بزرگ برن.
برای بازی سازی گرافیکی با پایتون لپ تاپ قوی لازم دارم؟
برای همین پروژه ساده معمولا سخت افزار خیلی قدرتمندی لازم نیست، ولی نسخه Python، درایور گرافیک و سیستم عامل مناسب مهمن. برای بازی سه بعدی سنگین داستان فرق می کنه.
آموزش Pygame در سال ۲۰۲۶ هنوز کاربرد داره؟
برای یادگیری اصول بازی دوبعدی، حلقه بازی، مدیریت ورودی و برخورد بله. بهتره از مستندات نسخه نصب شده استفاده کنی و انتظار یک موتور سه بعدی کامل رو نداشته باشی.
ساخت بازی ماشین با پایتون بدون عکس هم ممکنه؟
بله، نمونه مستقلی که کنار این آموزش گذاشتم ماشین، جاده و مانع ها رو با شکل های ساده رسم می کنه و به فایل تصویری خارجی احتیاج نداره.
برای ساخت بازی با پایتون از چه تصویری استفاده کنم؟
می تونی تصویر خودت رو طراحی کنی یا سراغ دارایی های دارای مجوز مناسب بری. قبل از انتشار بازی، شرایط مجوز تصاویر و صداهای دانلودی رو بررسی کن.
بازی سازی با پایتون می تونه درآمد داشته باشه؟
ممکنه، مثلا با آموزش، نمونه کار یا ساخت ابزار و پروژه سفارشی. اما درآمد خودکار یا تضمینی نیست و برای تحویل پروژه واقعی باید طراحی، تست و نگهداری رو هم بلد باشی.
آموزش ساخت بازی با پایتون بهتره یا موتور بازی سازی؟
برای فهم منطق و اولین پروژه، Python و Pygame انتخاب خوبی هستن. برای محصول پیچیده تر، ابزار مناسب به هدف، پلتفرم و نیاز گرافیکی تو بستگی داره.
چطور بازی سازی گرافیکی با پایتون رو به رزومه اضافه کنم؟
توضیح بده خودت چه امکاناتی اضافه کردی، یک ویدیوی کوتاه از اجرا بگیر، کد تمیز توی GitHub بذار و روش نصب و تست بازی رو در README بنویس.
می تونم این بازی رو نمونه کار بذارم؟
بله، اگر روشن توضیح بدی کدوم بخش آموزشی بوده و چه قابلیت هایی رو خودت اضافه کردی. نمونه کاری که خودت عیب یابی و توسعه دادی از یک کپی ساده ارزشمندتره.
خب، حالا توپ تو زمین توئه. قسمت اول رو ببین، محیطت رو راه بنداز و از همون روز اول کد رو دستکاری کن. اگر بازی اجرا نشد، خطای دقیق رو یادداشت کن. اگر اجرا شد، یک تغییر کوچیک بهش بده. توی کامنت های همین مقاله هم می تونی بگی کدوم بخش ساخت بازی ماشین با پایتون برات سخت تر بود و چه قابلیتی بهش اضافه کردی.
اگه میخوای این موضوع رو جدیتر یاد بگیری، مسیر کاملش اینجاست.
دورهها موضوع رو از پایه تا اجرای واقعی، پروژه و نکتههایی که وسط کار بهشون میرسی جلو میبرن.
نظرها و تجربهها
سؤال، تجربه یا نکتهای درباره این مقاله داری؟ اینجا بنویس تا گفتوگو برای بقیه هم مفید بمونه.
عالی عالی ادامه بده دمت گرم
خیلی عالیه ولی اگه آموزش بازی سازی سه بعدی با پایتون رو هم بدهید خیلی ممنون میشیم به این خاطر که چنین آموزشی به زبان فارسی موجود نیست (فکر میکنم با کتابخانه panda3D)
من حوصله نظر دادن ندارم ولی واقعا خوب بود دل نیومد نگم ادامه بده
مثل پکیج پایتون عالیه
اقا امیرحسین سلام میگم که من هر کاری میکنم که با cmder بازی رو باز کنم اصلا نمیره توش مثلا وقتی میخوام وارد پوشه users بشم تا u رو نوشتم یه تب بزنم میشناسه ولی اسم برنامه رو نه و حتی یه پوشم ساختم بردمش تو پوشه اونجوریم باز فقط میرفت تو پوشه و تو برنامه یا همون بازی نمیرفت لطفا راهنمایی کنید ممنونم.
سلام وست عزیز حتما مسیری که desktop هست یا هر مسیر دیگه رو اشتباه میدی منم همین مشکل رو داشتم واسه من هم نمی اورد بعد دیدم با میرفتم تو پوشه oneDrive دسکتاپم اونجا بود مسیر رو چک کن
سلام دم شما گرم من هرسه تا پکیج شما رو گرفتم و استفاده کردم. واقعا عالی بودن این سری آموزش هم واقعا خوب و کامله و نمونه فارسی مثل این ندیدم. فقط یه سوال حدودا چند قسمت میشه این آموزش ها؟ چون بدونم برای چندتا باید منتظر بمونم انتظار راحت تر میشه 🙂 با تشکر. اگر هم وقت کردین فریمورک جنگو هم بگین عالی میشه. پولی و رایگان بودنش دیگه برام مهم نیست چون میدونم کار شما درسته 🙂
قسمت دهم رو یادتون رفته تو یوتیوب بزارید
تو قسمت چهارم میتونید از کتابخانه pillow برای تغیر سایز عکس استفاده کنید
برای رفع اون ارور های داخل vscode از داخل تنظیمات pylint رو غیر فعال کن درست میشه موفق باشی ادامه بده.
عالی
عالی فقط همین
سلام دمت گرم که انقدر وقت گذاشتی و خیلی و خیلی با حوصله درس میدی و یه نکته ی مهم که خودت رو نمیگیری و خیلی خوبه که وسط فیلمات شوخی می کنی و اگه سوتی ای بدی قبولش می کنی بسیار سپاسگذارم
اره منم این طور فکر می کنم من 11 سالمه دارم کار می کنم حرفه ای دمت گرم نابغه ها .I LOVE YOU
استاد عالیییی همین طور ادامه بدید مخصصا پایتون رو
استاد خواهشا اگه امکانش هست اموزش ساخت بات تلگرام با پایتون هم بزارید با تشکر از سایت خوبتون
سلام و خسته نباشید. خواهش میکنم بعد از این آموزش زیبا با استفاده از کتابخانه kivy درست کردن اپ های موبایل هارو یاد بدید ممنون میشم
عالی بود موفق باشی و بیصبرانه منتظر ویدیویی هستم که طراحی سایت رو یا پایتون آموزش بدید و پکیج هاتون رو هم تهیه کردم حرف نداره
ویدیوها عالی. اگه میشه راجب شبکه ویدیوهای بیشتری بسازید. ممنون
عالی بود خیلی ممنون
با سلام. خیلی دوره خوبی بود. تا حالا دوره ای از این بهتر ندیده بود. یه چند تا مشکل داشت ولی: 1- بازی را خروجی نگرفتیم یعنی کاری نکردیم که مثل خیلی از بازی ها ، بازی یک آیکون و اسم داشته باشه که وقتی کاربر بر روی آن کلیک کرد وارد بازی بشه و نیاز به نصب برنامه ای دیگه نشه ( خودم انجام دادم آموزششو داخل یک کامنت میزارم ) 2- برای دکمه F1 متن راهنما را بازی را مثل تمام برنامه ها و بازی ها توضیح ندادیم. ولی در کل دوره خوبی بود. بعدا خودم این کار هارو انجام دادم داخل یک کامنت آموزششو میزارم. ممنون از سایت خوب شما
سلام خوبین میشه آموزش این روش رو برای منم بفرستین؟؟ لطفا به ایمیلم بفرسیتن
سلام عالی بود فقط من باvs code مشکل دارم به اینترنت وصل نمیشه و نمیشه افزونه ها رو دانلود کرد ولی با خود idle تا یجایی پیشرفتم اگه میشه درباره vs یه راهنمایی بزنید. دمتون گرم
سلام ، به نظرم خوب میشه اگه یه قسمت دیگه درباره ساخت یه فایل exe از همین بازی که ساختید ضبط کنید. مرسی
سلام اگه بخوایم رو سیستم دیگری ببریم باید چه کنیم؟!
میشه exe کرد با ابزار pyinstaller
اره موافقم خیلی ها اشاره خوبی بود. ممنون
یعنی به پایتون نمیشه فایل های ایگزه نوشت؟