
این اثر، یک تجربهی آموزشی نوآورانه برای آشنایی کودکان و نوجوانان با مفاهیم پایهی برنامهنویسی و منطق بازیسازی است.
در این پروژه، یادگیری کدنویسی از طریق کتابخانهی Pygame در قالب یک داستان همراه–آموزی انجام میشود؛ جایی که «رابو»، یک ربات خیالی مهربان، بهعنوان همراه آموزشی در تمام مراحل ساخت بازی کنار فراگیر قرار میگیرد.
هدف اصلی این اثر، کاهش استرس ناشی از خطاهای برنامهنویسی در کودکان و تبدیل فرایند یادگیری به تجربهای لذتبخش، ایمن و خلاقانه است. با طراحی بخشهای گامبهگام شامل نصب، ساخت پنجره، تغییر رنگ، رسم اشکال و کنترل حرکت قهرمان، مسیر یادگیری کاملاً تدریجی و قابل درک برای مخاطب تازهکار شکل گرفته است.
در این متن، آموزش فنی زبان پایتون با روایت احساسی و تربیتی ترکیب شده تا تأثیر روانی مثبتی بر اعتمادبهنفس کودک بگذارد.
سبک نگارشی اثر، صمیمی و محاورهای است؛ بهگونهای که خواننده حس همصحبتی با مربی دارد، نه مطالعهی درس خشک. همین ویژگی باعث میشود محتوا علاوه بر جنبهی فنی، ارزش فرهنگی و تربیتی نیز پیدا کند.
این اثر نمونهای از رویکرد «یادگیری مبتنی بر بازی و همراهی عاطفی» است که میتواند الگویی برای آموزش فناوری در بستر بومی فارسیزبانان باشد و در سطح بینالمللی بهعنوان مدل طراحی آموزشی محلی (Localized EdTech Design) معرفی شود.
سلام دوست خوبم!خوش اومدی به دنیای هیجان انگیز بازی سازی!
اگه بهت بگم ساختن بازی کامپیوتری اونقدر آسونه که میتونی همین امروز امتحانش کنی، باورت میشه؟ قراره با هم، قدمبهقدم وارد دنیایی بشیم که حتی بزرگترها هم حسرت تجربه اش رو دارن! ولی اصلاً نترس، قراره درست مثل اینکه با یه دوست باحال وارد آزمایشگاه جادویی شدیم، باهم همه مراحل رو جلو بریم و از نزدیک ببینیم چجوری همه چیز کار میکنه. در این مسیر، دوست جدید ما، "رابو"، هم قراره کلی تجربه کسب کنه و باگهایی که ممکنه تو هم ببینی رو برامون بگه و راه حلهاش رو یادمون بده.
رابو:
"سلام دوست خوبم!بزن بریم سراغ دنیای بازی ها!"
اول از همه ، قفل در آزمایشگاه رو باید باز کنیم:
باز کردن قفل یعنی نصب کردن یک وسیله باحال به اسم Pygame که راز اصلی بازیسازی با پایتون همینه!
اصن pygame چی هست؟
pygame در واقع یک کتابخانه (Library) برای زبان برنامهنویسی پایتونه. پایتون همونطور که میدونی یک زبان ساده برای صحبت کردن با کامپیوتره (اگه پایتونو نمیشناسی،اول باید بری سراغ اون) ، و حالاpygame چی هست؟pygame ابزارهایی به ما میده که بتونیم گرافیک، صدا و ورودیهای کاربر (مثل کیبورد و ماوس) را کنترل کنیم تا یک بازی بسازیم.
نحوه نصب pygame:خب، فقط باید کد زیر رو توی ترمینالت (Command Prompt) در ویندوز یا Terminal در (مک/لینوکس) بزنی:
pip install pygame
واقعاً فقط همین! تا بزنی حس میکنی یه دروازه جادویی باز شده و وارد یه دنیای جدید شدی. pip ابزاری هست که به ما اجازه میده بستههای نرمافزاری مورد نیاز را از اینترنت دانلود و روی سیستم نصب کنیم.
رابو:
"اوههه، همین الان داشتم نصب میکردم، این ارور رو دیدم:
ModuleNotFoundError: No module named 'pygame'
این یعنی پایتون نمیتونه Pygame رو پیدا کنه. این مشکل توی ۹۰ درصد مواقع به خاطر محل نصب یا ورژن پایتون پیش میاد.
یکم سرچ کردم، دیدم چند تا قلق داره:
۱. مطمئن شو پایتون رو نصب داری! اگه پایتون نصب نباشه، pip هم کار نمیکنه.
۲. مسیر نصب: مطمئن شو که از ترمینال اصلی که برای پایتون تنظیم شده استفاده میکنی.
۳. اگه داری از ویندوز استفاده میکنی، به جای pip این روش رو امتحان کن: گاهی اوقات در ویندوز، چندین ورژن پایتون نصب است و pip به طور پیشفرض به آخرین ورژن اشاره نمیکند.
py -m pip install pygame
بعدش کد زیر رو بنویس و اجرا کن، دیگه اون ارور رو نمیبینی:
import pygame #برای تست نصب print(pygame.ver)
خلاصه: اول نصب کن، تو همون مسیری باش که فایلته (یا از دستور بالا استفاده کن)، بعد اجراش کن!"
حالا وقتشه اولین پنجره جادویی بازی رو بسازی! حسش مثل باز کردن کادو تولده!
این کد رو تو فایل پایتونت بنویس (مثلاً اسم فایلت اینه: game.py ):
import pygame pygame.init() #برای شروع کردن تمام ماژولهای Pygame # تعریف ابعاد پنجره WINDOW_WIDTH = 500 WINDOW_HEIGHT = 400 window = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT)) pygame.display.set_caption('بازی من! 🎮') # حلقه اصلی بازی (که فعلاً خالیه) while True: # مدیریت رویدادها (مثل کلیک کردن روی دکمه بستن) for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit() #برای خروج از برنامه # این قسمت برای بهروزرسانی صفحه است که هنوز چیزی نداریم pygame.quit()
تا اجرا کنی، باید یه پنجره کوچیک بیاد جلوت! حسش مثل پنجرهایه که داره فریاد میزنه "سلام!"
رابو:
"وای الان اجرا کردم، دیدم پنجره فقط یه لحظه نشون داده شد و بعد بسته شد! تقریباً توی همه سیستمها اینجوریه، چون حلقه event نداره و برنامه سریع به آخر کد میرسه و تموم میشه.
بعد فهمیدم باید براش یه حلقه بذارم تا نفهمه و باز بمونه. این حلقه اصلی بازی (Game Loop) نام داره. اگر این حلقه نباشه، بازی اجرا میشه و بلافاصله تموم میشه.
این کد اصلاحشده رو بنویس، دیگه بسته نمیشه تا خودت پنجره رو ببندی:
import pygame pygame.init() window = pygame.display.set_mode((500, 400)) pygame.display.set_caption('بازی من! 🎮') run = True # متغیری برای کنترل حلقه اصلی while run: for event in pygame.event.get(): if event.type == pygame.QUIT: run = False # اگر دکمه بستن زده شد، حلقه رو متوقف کن pygame.quit() # خارج شدن از Pygame
یعنی اون تیکه run = True و شرط if event.type == pygame.QUIT رو اضافه کنی، همه چی میاد سر جای خودش و پنجره ثابت میمونه."
آمادهای وارد بازیسازی واقعی شی؟
اینجوری میتونی رنگ و شکل پنجره رو تغییر بدی یا حتی یه مستطیل بسازی که مثل قهرمانت حرکت کنه!
مفاهیم جدید:
رنگها: در Pygame، رنگها با استفاده از سیستم RGB تعریف میشوند. سه عدد بین ۰ تا ۲۵۵ برای قرمزی (R)، سبزی (G) و آبی (B) به ترتیب. مثلاً (۲۵۵, ۰, ۰) قرمز خالص است.
()window.fill: کل سطح پنجره را با یک رنگ پر میکند.
()pygame.draw.rect : یک مستطیل را روی سطح پنجره (Window Surface) میکشد. پارامترهای آن شامل سطح مورد نظر، رنگ، و مختصات و اندازه مستطیل است: (x, y, width, height)
این کد رو اضافه کن بعد از حلقه بالا: (ما کد حلقه اصلی را از مرحله قبل میآوریم و فقط قسمتهای جدید را اضافه میکنیم)
کد کامل شده با رنگ و مستطیل:
import pygame pygame.init() window = pygame.display.set_mode((500, 400)) pygame.display.set_caption('بازی من 🎮') run = True while run: for event in pygame.event.get(): if event.type == pygame.QUIT: run = False # --- قسمت های جدید اضافه شده --- window.fill((128, 0, 128)) # رنگ بنفش (R=128, G=0, B=128) # مستطیل: در مختصات (200, 150) ، با عرض 100 و ارتفاع 80 pygame.draw.rect(window, (255, 255, 255), (200, 150, 100, 80)) pygame.display.update() # نمایش تغییرات روی صفحه pygame.quit()
رنگ من بنفش شد! خیلی باحاله نه؟ هر عدد رو تغییر بدی، یه چیز متفاوت میبینی.
رابو:
"اه، اومدم مستطیل بکشم اینجوری:
window.fill((128, 0, 128))
pygame.draw.rect(window, (255, 255, 255), (200, 150, 100, 80) )
ولی هیچی رو تو پنجره ندیدم! پنجره سفید یا سیاه بود (بسته به تنظیمات پیشفرض سیستم).
وقتی بررسی کردم ،فهمیدم راه حلش اینه که بعد از اینکه دستور کشیدن (Drawing) رو به Pygame دادیم، حتماً باید بهش بگیم که 'باشه، حالا همه این دستورات رو روی صفحه نمایش بده.' برای این کار از دستور زیر استفاده میکنیم:
pygame.display.update()
کد درست اینه که ()pygame.display.update حتماً باید بعد از تمام دستورات fill و draw بیاید:
window.fill((128, 0, 128))
pygame.draw.rect(window, (255, 255, 255), (200, 150, 100, 80))
pygame.display.update()
بدون اون کد آخر، هیچ چیزی نمایش داده نمیشه چون دستورات در حافظه موقت باقی میمونه و روی صفحه نمیاد!"
حالا وقتشه که مستطیل رو تکون بدی! یه چیزی مثل فرمان ماشین بازی رو توی دستت بگیر.
برای حرکت دادن، ما باید موقعیت x و y مستطیل را در هر فریم بازی تغییر بدیم. همچنین باید مطمئن بشیم که مستطیل از لبههای پنجره بیرون نمیره.
این اسکریپت رو جای کل حلقه قبلی بذار:
import pygame pygame.init() window = pygame.display.set_mode((500, 400)) pygame.display.set_caption('بازی من 🎮') # متغیرهای اصلی x, y = 200, 150 # موقعیت اولیه گوشه بالا چپ مستطیل speed = 3 # سرعت حرکت width, height = 100, 80 # ابعاد مستطیل win_width, win_height = 500, 400 # ابعاد پنجره run = True while run: # ۱. مدیریت رویدادها (بستن پنجره) for event in pygame.event.get(): if event.type == pygame.QUIT: run = False # ۲. مدیریت ورودی کیبورد keys = pygame.key.get_pressed() # وضعیت تمام کلیدها را میگیرد # حرکت به چپ: اگر کلید چپ فشرده شود و موقعیت x از ۰ بیشتر باشد if keys[pygame.K_LEFT] and x > 0: x -= speed # حرکت به راست اگر کلید راست فشرده شود و x به لبه نرسیده باشد if keys[pygame.K_RIGHT] and x < win_width - width: x += speed #حرکت به بالا: اگر کلید بالا فشرده شود و موقعیت y از ۰ بیشتر باشد if keys[pygame.K_UP] and y > 0: y -= speed # حرکت به پایین: اگر کلید پایین فشرده شود و y به پایین ترین حد نرسیده باشد if keys[pygame.K_DOWN] and y < win_height - height: y += speed # ۳. رندر کردن (نقاشی مجدد) window.fill((128, 0, 128)) # پر کردن صفحه با رنگ بنفش pygame.draw.rect(window, (255, 255, 255), (x, y, width, height)) # کشیدن مستطیل در موقعیت جدید # ۴. نمایش نهایی pygame.display.update() pygame.quit()
نکته مهم در مورد لبهها:
برای جلوگیری از خروج، باید چک کنیم که لبهی مستطیل از مرز نگذره. اگر مستطیل در جهت راست حرکت کنه، حداکثر مختصات x آن باید برابر با WINDOW_WIDTH - width باشد یعنی width رو از WINDOW_WIDTH کم کنیم . چون اگه بزرگتر بشه، از پنجره بیرون میره.
رابو:
"اه، وقتی چندبار کلید رو نگه داشتم، مستطیل از قاب بازی رفت بیرون و دیگه ندیدمش! چون یادم رفت شرط بذارم که اگر x و y خواستن از محدوده خارج بشن، نخورن به اون مقدار.
مثلاً وقتی کلید راست رو نگه داشتم، چون شرط x < win_width - width رو نذاشتم، مقدار x هی بزرگتر شد و مستطیل غیب شد!
راه حلش: بذار شرط بذاریم که اگر x و y خواستن از محدوده خارج بشن، نخورن به اون مقدار. کد بالا کاملاً مرز رو رعایت میکنه و دیگه هر چقدر کلید رو بزنی، مستطیل هیچ وقت از پنجره بیرون نمیره!"
حالا وقت امتیاز دادنه.میخوایم سیستم امتیازدهی به بازیمون اضافه کنیم!
برای نمایش متن، ما به دو چیز نیاز داریم:
۱. فونت: باید از کدام قلم برای نوشتن استفاده کنیم.
۲. رندر کردن (Render): تبدیل متن به تصویری که بتوانیم آن را روی صفحه بکشیم.
۳ .Blitting : این کلمه به معنی کپی کردن یک تصویر (در اینجا میشه همون متن رندر شده) روی سطح دیگه (اینجا میشه همون پنجره بازی).
ما باید قبل از شروع حلقه بازی، فونت رو مقداردهی اولیه کنیم و در هر فریم، امتیاز را محاسبه و نمایش بدیم.
کد کامل شده با نمایش امتیاز:
import pygame pygame.init() window = pygame.display.set_mode((500, 400)) pygame.display.set_caption('بازی من! 🎮') # ۱. مقداردهی اولیه فونت (باید قبل از حلقه باشد) font = pygame.font.SysFont(None, 36) # فونت سیستمی، اندازه ۳۶ # متغیرهای اصلی score = 0 # امتیاز شروع x, y = 200, 150 width, height = 100, 80 speed = 3 win_width, win_height = 500, 400 run = True while run: for event in pygame.event.get(): if event.type == pygame.QUIT: run = False keys = pygame.key.get_pressed() # حرکت و افزایش امتیاز در صورت فشردن کلید if keys[pygame.K_LEFT] and x > 0: x -= speed score += 1 if keys[pygame.K_RIGHT] and x < win_width - width: x += speed score += 1 y -= speed score += 1 if keys[pygame.K_DOWN] and y < win_height - height: y += speed score += 1 # --- قسمت رندر و امتیاز --- window.fill((128, 0, 128)) pygame.draw.rect(window, (255, 255, 255), (x, y, width, height)) # رندر کردن متن امتیاز # f'امتیاز: {score}' متن ماست. True یعنی متن ضد پیکسل (Anti-aliased) باشد. (255, 255, 0) زرد است. score_text = font.render(f'امتیاز: {score}', True, (255, 255, 0)) # نمایش متن در مختصات (20, 20) روی صفحه window.blit(score_text, (20, 20)) pygame.display.update() pygame.quit()
رابو :
"اه، اومدم امتیاز رو نشون بدم! کد رو زدم و ارور داد:
pygame.error: font not initialized
من یه لحظه فکر کردم Pygame کلاً خراب شده! ولی فهمیدم که برای استفاده از هر بخشی از Pygame، باید اول با pygame.init() اون بخش رو فعال کنیم. همچنین، برای فونتها، باید قبل از حلقه، فونت رو لود کنیم.
پس دو تا نکته کلیدی پیدا کردم:
۱. باید قبل از حلقه، font = pygame.font.SysFont(None, 36) رو بنویسیم.
۲. چون pygame.init() در ابتدای برنامه نوشته شده، مشکل فعالسازی حل شده .(البته باید مطمئن شویم که pygame.init() قبل از تعریف font اجرا شده باشد، که در کد بالا این اتفاق افتاده است.)
و نکته دوم: کدهای رندر متن (مثل font.render و window.blit ) باید داخل حلقه اصلی بازی باشند تا هر بار که مستطیل حرکت میکند، عدد امتیاز هم بهروزرسانی و روی صفحه کشیده شود وگرنه امتیاز ثابت میماند! کد بالا هم امتیاز نشون داده میشه، هم مستطیل بیرون نمیره!"
جمعبندی آخر با یه رفیق مثل رابو
دیدی چقدر همه چی ساده و قلقدار بود؟ ما از نصب Pygame شروع کردیم، یه پنجره ساختیم که بسته نشه، یه شیء رو روی صفحه کشیدیم، اون رو کنترل کردیم تا به مرزها نخوره، و در نهایت یه سیستم امتیازدهی ساده اضافه کردیم.
هر جایی خطا دیدی، بدون که همون لحظه با یه سرچ کوچیک و کمی دقت ، راهش پیدا میشه. رابو همیشه کنارت هست و هر مشکلی که همین الان خوردی، مطمئن باش اونم همین لحظه بهش خورده و راهش رو پیدا کرده! این یادگیری از طریق خطا، سریعترین راه برای حرفهای شدن در کدنویسیه.
رابو:
"همونطور که دیدی من هیچوقت با دیدن خطا جا نزدم.تو هم هیچوقت از دیدن خطا نترس.سرسخت و با انگیزه باش و نشون بده قدرتت از چندتا خطا خیلی بیشتره.اینطوری میتونی یه برنامه نویس موفق باشی و توی زندگی شخصی هم عالی پیش بری!"
دنیای بازیسازی منتظره تا تو اولین کدتو اجرا کنی! فقط امتحانش کن، میفهمی چقدر همه چی ساده و باحال هست!
امیدوارم از تجربه امروز لذت برده باشی.خدانگهدار
