آیا میتوانید branche هایی با رنگهای مختلف رسم کنید؟ آیا میتوانید یک تابع به نام snowflake تعریف کنید و از آن برای رسم تعداد زیادی دانه برف بر روی صفحه استفاده کنید؟ آیا میتوانید برنامه را طوری تنظیم کنید که اندازه و رنگ دانههای برف را به صورت تصادفی تغییر دهد؟
پایتون علاوه بر آنچه تاکنون گفته شد، قابلیت اضافه کردن تصاویر و صداها را نیز دارد. هدف از این پروژه ساخت یک بازی ساده برای پیدا کردن تفاوت بین دو تصویر است. هنگامی که بازیکن روی نقطهای خاص کلیک میکند، یک تصویر ترسناک ظاهر میشود و صدای ترسناکی پخش میشود تا فرد را بترساند.
در این پروژه به دو تصویر نیاز داریم: تصویر اصلی برای پیدا کردن تفاوتها و یک تصویر ترسناک.همچنین به یک فایل صوتی هم نیاز است. روی آیکون رزبری کلیک کنید تا منوی سیستمعامل Raspberry Pi باز شود، گزینه Internet را انتخاب کنید و سپس روی مرورگر وب Chromium کلیک کنید. وقتی این مرورگر باز شد، آدرس rpf.io/spot-pic را در نوار آدرس تایپ کنید و کلید ENTER را فشار دهید. سپس روی تصویر کلیک راست و گزینه Save image as را انتخاب کنید. حال از لیست سمت چپ پوشه Home را انتخاب و روی Save کلیک کنید. دوباره روی نوار آدرس Chromium کلیک کنید، سپس آدرس rpf.io/scary-pic را تایپ کرده و کلید ENTER را فشار دهید. مثل قبل روی تصویر کلیک راست کنید و گزینه Save image as را انتخاب و سپس پوشه Home را انتخاب کنید و در نهایت روی Save کلیک کنید.
برای داشتن فایل صوتی، دوباره روی نوار آدرس کلیک کنید. آدرس rpf.io/scream را تایپ کنید و کلید ENTER را فشار دهید. این فایل صوتی در واقع یک صدای جیغ است که به طور خودکار پخش میشود و بازیکن را سورپرایز خواهد کرد. قبل از اینکه بتوانید از آن استفاده کنید، باید آن را ذخیره کنید. روی پلیر کلیک راست کنید و گزینه Save as را انتخاب کنید. سپس پوشه Home را انتخاب و روی Save کلیک کنید. حال میتوانید پنجره Chromium را ببندید.
روی آیکون New در نوار ابزار Thonny کلیک کنید تا یک پروژه جدید را شروع کنید. مثل قبل باید از کتابخانه Pygame برای گسترش قابلیتهای پایتون استفاده می کنیم. بدین منظور عبارت زیر را تایپ کنید:
|
1 |
import pygame |
علاوه بر کتابخانه Pygame به بخشهایی از کتابخانههای دیگر هم نیاز خواهید داشت. برای وارد کردن این کتابخانهها عبارتهای زیر را تایپ کنید:
|
1 2 3 4 5 |
from pygame.locals import * from time import sleep from random import randrange |
دستور from عملکرد متفاوتی نسبت به دستور import دارد. با استفاده از دستور from این امکان را دارید که فقط بخشهای مورد نیاز از یک کتابخانه را وارد کنید، بنابراین نیازی به اضافه کردن کل کتابخانه نیست. در مرحله بعد، باید کتابخانه Pygame را تنظیم کنید. این فرآیند در واقع مقداردهی اولیه (initialization) است. برای این کار Pygame باید عرض و ارتفاع نمایشگر یا تلویزیون بازیکن را که همان رزولوشن است، بشناسد. پس باید عبارت زیر را تایپ کنید:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
pygame.init() width = pygame.display.Info().current_w height = pygame.display.Info().current_h آخرین مرحله در تنظیم Pygame ساخت پنجره آن است که در Pygame صفحه نمایش/ screen نام دارد. به همین منظور عبارت زیر را تایپ کنید: screen = pygame.display.set_mode((width, height)) pygame.quit() |
به خط خالی وسط توجه کنید. این خط خالی جایی است که قرار است کدها قرار گیرند. روی آیکون Run کلیک کنید، برنامه با اسم Spot the Difference ذخیره میشود. حال Pygame، یک پنجره جدید با پسزمینه سیاه باز میکند که بلافاصله پس از رسیدن به دستور خروج، محو میشود. به جز یک پیام کوتاه در پوسته پایتون (شکل 1 )، برنامه تا به اینجا خروجی خاصی نداشته است.

شکل 1: برنامه شما کاربردی است، اما هنوز کار زیادی انجام نمیدهد
برای نمایش تصویر spot-the-difference، عبارت زیر را در فضای خالی بالای pygame.quit() تایپ کنید:
|
1 |
difference = pygame.image.load('spot_the_diff.png') |
برای اینکه تصویر تمامِ صفحه مانیتور یا تلویزیون را بپوشاند، باید رزولوشن آن مطابق رزولوشن نمایشگر باشد. بدین منظور کد زیر را تایپ کنید:
|
1 |
difference = pygame.transform.scale(difference, (width, height)) |
اکنون که تصویر در حافظه قرار دارد، باید به Pygame بگویید که آن را روی صفحه نمایش دهد. به این فرآیند blitting یا bit block transfer گفته میشود. برای این هدف کد زیر را تایپ کنید:
|
1 2 3 |
screen.blit(difference, (0, 0)) pygame.display.update() |
در خط اول تصویر از گوشه بالا و سمت چپ روی صفحه نمایش کپی میشود. خط دوم به Pygame میگوید که صفحه نمایش را رفرش کند تا تغییرات اعمال شوند. در غیر این صورت اگر چه تصویر به درستی در حافظه قرار گرفته اما روی صفحه نمایش نشان داده نمیشود.
روی آیکون Run کلیک کنید، برنامه اجرا میشود و تصویر spot-the-difference روی صفحه نمایش داده میشود. چون برنامه به سرعت به پایان میرسد، تصویر فقط برای یک لحظه ظاهر میشود و سپس پنجره بسته میشود.

شکل 2 : تصویر spot-the-difference
برای اینکه تصویر به مدت طولانیتری نمایش داده شود، خط زیر را دقیقاً بالای pygame.quit()تایپ کنید:
|
1 |
sleep(3) |
دوباره روی Run کلیک کنید. خواهید دید که تصویر این بار به مدت طولانیتری روی صفحه نمایش داده میشود. برای اضافه کردن تصویر ترسناک، کد زیر را دقیقاً زیر عبارت pygame.display.update() تایپ کنید:
|
1 2 3 |
zombie = pygame.image.load('scary_face.png') zombie = pygame.transform.scale(zombie, (width, height)) |
برای اینکه عکس زامبی بلافاصله نمایش داده نشود، باید یک تأخیر (delay) در نظر بگیرید:
|
1 |
sleep(3) |
برای این کار، تصویر زامبی را بر روی صفحه قرار دهید و سپس صفحه را بهروزرسانی کنید تا تصویر به کاربر نمایش داده شود:
|
1 2 3 |
screen.blit(zombie, (0,0)) pygame.display.update() |
روی آیکون Run کلیک کنید و ببینید چه اتفاقی میافتد: Pygame تصویر spot-the-difference را لود خواهد کرد و پس از سه ثانیه، آن را با تصویر ترسناک زامبی جایگزین میکند.(شکل 3 )

شکل 3: این عکس باعث ترساندن کاربر میشود
اینکه تأخیر همیشه سه ثانیه باشد، سبب میشود که بازی کمی قابل پیشبینی شود و چون هدف انتقال حس غافلگیری به کاربر است، خط sleep(3) را که بالای screen.blit(zombie, (0,0)) قرار دارد، به شکل زیر تغییر دهید:
|
1 |
sleep(randrange(5, 15)) |
در نتیجه به صورت تصادفی یک عدد بین 5 تا 15 انتخاب میشود و برنامه به همان اندازه در نمایش تصویر تأخیر خواهد داشت. سپس خط زیر را درست بالای دستور sleep اضافه کنید تا صدای جیغ لود شود:
|
1 |
scream = pygame.mixer.Sound('scream.wav') |
حال زیر دستور sleep و در یک خط جدید، کد زیر را تایپ کنید تا پخش صدای ترسناک شروع شود. هدف این است که این صدا قبل از نمایش تصویر ترسناک پخش شود:
|
1 |
scream.play() |
در نهایت باید به Pygame بگویید که پخش صدا را متوقف کند. بدین منظور خط زیر را بالای دستور pygame.quit() تایپ کنید:
|
1 |
scream.stop() |
روی آیکون Run کلیک کنید و ببینید کدهایی که تا اینجا نوشتهاید، چگونه کار میکنند: پس از گذشت چند ثانیه از بازی پیدا کردن تفاوتها، زامبی ترسناکی همراه با فریاد یک خونآشام ظاهر میشود. اگر متوجه شدید که تصویر زامبی قبل از پخش صدا ظاهر میشود، یک تأخیر بین دستور scream.play() و دستور screen.blit اضافه کنید.
|
1 |
sleep(0.4) |
برنامه کامل شده باید به صورت زیر باشد:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
import pygame from pygame.locals import * from time import sleep from random import randrange pygame.init() width = pygame.display.Info().current_w height = pygame.display.Info().current_h screen = pygame.display.set_mode((width, height)) difference = pygame.image.load('spot_the_diff.png') difference = pygame.transform.scale(difference, (width, height)) screen.blit(difference, (0, 0)) pygame.display.update() zombie = pygame.image.load('scary_face.png') zombie = pygame.transform.scale (zombie, (width, height)) scream = pygame.mixer.Sound('scream.wav') sleep(randrange(5, 15)) scream.play() screen.blit(zombie, (0,0)) pygame.display.update() sleep(3) scream.stop() pygame.quit() |
حال تنها کاری که باید بکنید این است که دوستان خود را دعوت کنید تا بازی spot-the-difference را انجام دهند. مطمئن شوید که اسپیکرها روشن هستند.
آیا میتوانید تصاویر را به گونهای تغییر دهید تا برای مناسبتهایی مانند کریسمس عید نوروز مناسب باشند؟
آیا میتوانید تصاویر «پیدا کردن تفاوتها» و تصاویر ترسناک را (با استفاده از یک ویرایشگر گرافیکی مانند GIMP) بکشید؟
حال که با برنامهنویسی پایتون آشنا شدهاید، وقت آن است که از Pygame استفاده کنید تا پروژههای کمی پیچیدهتر اجرا کنید: بازی ماز متنی. در این نوع بازیها، بازیکن در یک محیط متنی به کاوش میپردازد و با استفاده از دستورات متنی با بازی تعامل میکند. در واقع این بازیها به دورانی برمیگردند که کامپیوترها قادر به پردازش گرافیک نبودند. با این حال این بازیها طرفدارانی دارند که معتقدند هیچ گرافیکی به اندازه تصاویری که در ذهن خود دارید، زنده و واقعی نیست.
این برنامه نسبت به دیگر برنامههای این فصل کمی پیچیدهتر است، بنابراین برای آسانتر کردن کارها، با نسخهای از برنامه که قسمتی از آن نوشته شده است، شروع کنید. مرورگر Chromium را باز کنید و آدرس زیر را در نوار آدرس تایپ کنید:
rpf.io/rpg-code
مرورگر Chromium به صورت خودکار کد برنامه را در فولدر Downloads دانلود میکند اما به شما هشدار میدهد که این فایل – یک برنامه پایتون – ممکن است به کامپیوتر شما آسیب برساند. از آنجایی که این فایل را از بنیاد Raspberry Pi دانلود کردهاید که یک منبع معتبر به حساب میآید، بر روی دکمه Keep که در پایین صفحه ظاهر میشود، کلیک کنید. سپس به Thonny بازگردید و روی آیکون Load کلیک کنید. فایل rpg-rpg.py را در پوشه Downloads پیدا کنید و سپس روی دکمه Load کلیک کنید.
روی نماد Run کلیک کنید تا با نحوه کار با این بازی ماجراجویانه متنی آشنا شوید. خروجی بازی در قسمت پوسته در پایین پنجره Thonny نمایش داده میشود. برای مشاهده بهتر پنجره Thonny ، روی دکمه maximize کلیک کنید.
این بازی بسیار ساده است: دو اتاق وجود دارد که هیچ چیزی در آنها نیست. بازیکن بازی را از سالن، که یکی از این دو اتاق است، شروع میکند. برای رفتن به آشپزخانه، کافی است go south را تایپ کنید و سپس کلید ENTER را بزنید (شکل 4). فرض کنید الآن در آشپزخانه هستید، برای بازگشت به سالن، عبارت go North را تایپ کنید. همچنین میتوانید عبارتهای go west و go east را تایپ کنید، اما از آنجایی که هیچ اتاقی در این جهتها وجود ندارد، بازی یک پیام خطا نمایش میدهد.

شکل 4: در حال حاضر تنها دو اتاق وجود دارد.
به خط 29 ام در قسمت اسکریپت بروید و متغیری به نام rooms را پیدا کنید. این متغیر مثل دیکشنری عمل میکند و اتاقها، خروجیها و خروجی مشخص هر اتاق را در بازی مشخص میکند.
برای جذابتر کردن بازی، اتاق دیگری را اضافه کنید: یک اتاق غذاخوری در شرق سالن. متغیر rooms را در اسکریپتها پیدا کنید. حال یک علامت کاما (,) بعد از } در خط 38 اضافه کنید و سپس عبارت زیر را تایپ کنید (تورفتگی در دیکشنری ضروری نیست):
|
1 2 3 4 5 |
'Dining Room' : { 'west' : 'Hall' } |
همچنین به یک خروجی جدید در سالن نیاز دارید. از آنجا که این خروجی به طور خودکار ساخته نمیشود، به انتهای خط 33 بروید و یک کاما اضافه کنید. سپس عبارت زیر را اضافه کنید:
|
1 |
'east' : 'Dining Room' |
روی آیکون Run کلیک کنید و اتاق جدید خود را امتحان کنید: تصور کنید در سالن هستید، برای ورود به اتاق ناهارخوری (شکل 5) عبارت go east را تایپ کنید. حال در اتاق ناهارخوری هستید، برای ورود به سالن عبارت go west را تایپ کنید.
تبریک! ساخت اتاق جدید با موفقیت انجام شد.

شکل 5: شما یک اتاق دیگر اضافه کردهاید
اتاق خالی جذابیت چندانی ندارد. برای افزودن یک آیتم به یک اتاق، باید دیکشنری آن اتاق را تغییر دهید. بدین منظور ابتدا برنامه را با کلیک بر روی آیکون Stop متوقف کنید. دیکشنری Hall را در بخش اسکریپتها پیدا کنید. سپس یک کاما در انتهای ‘east’ : ‘Dining Room’ اضافه کنید. قبل از فشار دادن کلید ENTER، عبارت زیر را تایپ کنید:
|
1 |
'item' : 'key' |
مجدداً روی Run کلیک کنید. حال بازی به شما میگوید که میتوانید آیتم جدید را مشاهده کنید: یک کلید. دستور get key را تایپ کنید (شکل 6) تا بتوانید کلید را بردارید و به لیست آیتمهایی که دارید اضافه کنید. این آیتمها تحت عنوان inventory شناخته میشوند. inventory هنگام جابجایی از اتاقی به اتاق دیگر همراه شما خواهد بود.

شکل 6: کلید به inventory شما اضافه میشود
روی آیکون Stop کلیک کنید و بازی را با اضافه کردن یک هیولا جذابتر کنید. دیکشنری Kitchen را پیدا کنید و آیتم monster را به همان روشی که برای آیتم key انجام دادید به inventory اضافه کنید. توجه کنید که باید یک کاما به انتهای خط بالا اضافه کنید.
|
1 |
'item' : 'monster' |
برای اینکه هیولا بتواند به بازیکن حمله کند، باید منطق به بازی اضافه کنید. بدین منظور به انتهای برنامه و قسمت اسکریپت بروید و خطهای زیر را اضافه کنید. همانطور که میبینید کد زیر با هشتگ (#) شروع میشود. این علامت به شما کمک میکند هر وقت دوباره به سراغ برنامه آمدید، آن را بهتر درک کنید. مطمئن شوید که خطوط، تورفتگیهای درستی دارند.
|
1 2 3 4 5 6 7 8 9 |
# player loses if they enter a room with a monster if 'item' in rooms[currentRoom] and 'monster' in rooms[currentRoom]['item']: print('A monster has got you... GAME OVER!') break |
روی Run کلیک کنید و ورود به Kitchen را تست کنید (شکل 7). در این حالت هیولا کاری انجام نخواهد داد.

شکل 7: اهمیتی به موشها ندهید، یک هیولا در آشپزخانه حضور دارد.
برای تبدیل این ماجراجویی به یک بازی کامل، به آیتمهای بیشتری مثل یک اتاق دیگر و قابلیت «برنده شدن» با خارج شدن از خانه و در اختیار داشتن تمامی آیتمهای موجود در inventory نیاز دارید. این کار را با افزودن یک اتاق دیگر به اسم Garden و به همان شیوهای که برای اتاق Dining Room انجام دادید، شروع کنید. با استفاده از دیکشنری Dining Room، یک خروجی اضافه کنید. به خاطر داشته باشید که باید یک کاما به انتهای خط بالا اضافه کنید.
|
1 |
'south' : 'Garden' |
برای اضافه کردن اتاق جدید به سراغ دیکشنری اصلی یعنی rooms بروید. حال یک ورودی جدید برایGarden به دیکشنری اضافه کنید. به یاد داشته باشید که باید یک کاما بعد از } در خط بالا اضافه کنید.
|
1 2 3 4 5 |
'Garden' : { 'north' : 'Dining Room' } |
برای اضافه کردن یک آیتم جدید به نام potion به دیکشنری Dining Room، باید مانند قبل عمل کنید و یک کاما به انتهای خط بالا اضافه کنید.
|
1 |
'item' : 'potion' |
حال باید منطق را به برنامه اضافه کنید. کاری که منطق انجام میدهید این است که بررسی کند آیا بازیکن تمامی آیتمها را دارد؟
و اگر دارد به بازیکن اعلام پیروزی کند. بدین منظور باید این چند خط را به انتهای برنامه اضافه کنید.
|
1 2 3 4 5 6 7 8 9 |
# player wins if they get to the garden with a key and a potion if currentRoom == 'Garden' and 'key' in inventory and 'potion' in inventory: print('You escaped the house... YOU WIN!') break |
روی دکمه Run کلیک کنید و سعی کنید قبل از رفتن به باغ، key و potion را به دست آورید. مراقب باشید که وارد آشپزخانه نشوید، هیولا آنجاست! آخرین کاری که قرار است برای این بازی انجام دهید، اضافه کردن دستورالعملهایی برای راهنمایی بازیکن است. برای اضافه کردن این راهنماییها به بالای برنامه و جایی که تابع showInstructions() تعریف شده بروید و متن زیر را اضافه کنید:
|
1 2 3 |
Get to the Garden with a key and a potion Avoid the monsters! |
یکبار دیگر بازی را Run کنید. خواهید دید که دستورالعملهای جدید در ابتدای بازی نمایش داده میشوند (شکل 8). تبریک. حال شما یک بازی ماجراجویانه تعاملی مبتنی بر متن ساختهاید.

شکل 8: حال بازیکن میداند که باید چه کاری در بازی انجام دهد
سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.