از این کلون کلاسیک یکپارچهسازی با سیستمعامل الهام بگیرید یا فقط با کد آن آزمایش کنید تا بیشتر بدانید.
Excitebike یک بازی اسکرول جانبی است که در آن شما موتور را از روی پرش ها حرکت می دهید، در اطراف موانع مانور می دهید و به سمت خط پایان سرعت می گیرید.
نینتندو اولین بار این بازی مسابقه ای BMX را برای NES راه اندازی کرد. از آنجا، این شرکت Excitebike را مدرن کرد و آن را در N64 و در نهایت Wii منتشر کرد.
تعداد زیادی کنسول NES دیگر وجود ندارد، که بازی Excitebike را دوباره سخت می کند. با تشکر از برخی از طرفداران قدیمی در مجله Wireframe، یک قطعه کد پایتون میتواند این کلاسیک NES را برای ساعتها سرگرمی در Raspberry Pi یا رایانه شخصی شما بازسازی کند.
دریافت کد و راه اندازی
اگرچه میتوانید از nano یا vim برای ویرایش کد پایتون خود استفاده کنید، اما باید از یک ویرایشگر متن یا IDE با امکانات کامل بهره ببرید.
برای پشتیبانی از ویژگی های ساخته شده در این ادای احترام به Excitebike، باید Pygame Zero را نصب کنید. Pygame Zero شامل ماژولهای پایتون است تا سازندگان بازی بدون نیاز به تکرار پایههای ساده تمرکز کنند.
اگر پایتون 3 را روی رایانه شخصی خود نصب نکرده اید، می توانید آخرین نسخه را مستقیماً از پایتون دانلود کنید. همچنین باید مطمئن شوید که PIP را نیز نصب کرده اید.
با نصب آخرین نسخه Python و PIP، ترمینال PowerShell یا Linux خود را باز کرده و تایپ کنید:
pip3 install pgzero
در نهایت، باید یک کپی از کد پایتون را از مخزن GitHub مجله Wireframe بردارید. دستور زیر را در ترمینال تایپ کنید:
git clone https://github.com/Wireframe-Magazine/Wireframe-66.git
همچنین، میتوانید کد فشردهشده را مستقیماً از صفحه Wireframe GitHub دانلود کنید.
شکستن کد
برای اینکه بفهمید کد چه کار می کند، ابتدا بازی Excitebike را اجرا کنید. این کار را با پیمایش به کد منبع و سپس اجرای آن با استفاده از Pygame Zero انجام دهید:
cd Wireframe-66/source-code-excitebike/
pgzrun exitebike.py
سپس می توانید فایل exitebike.py را با یک ویرایشگر متن باز کنید تا کد را مشاهده کنید.
تابع ترسیم پس زمینه را با حرکت تصویر دوچرخه ترسیم می کند. “بلیت” به بلوکی که روی صفحه کشیده می شود اشاره دارد. کلمه “پسزمینه” به تصویر پسزمینه اشاره دارد (پیوند کردن تصاویر به بلوک پسزمینه به لطف ماژولهای Pygame Zero وارد شده است).
def draw():
screen.blit("background", (0, 0))
drawTrack()
bike.draw()
screen.draw.text("LAP TIME: "+str(int(time.time() - startTime)), (20, 555),color=(255,255,255) , fontsize=50)
screen.draw.text("LAST LAP: "+str(lastLap), topright = (780, 555),color=(255,255,255) , fontsize=50)
همچنین متوجه محاسبات مربوط به زمان دور و آخرین دور خواهید شد (این مورد با زمان شمار در پایین صفحه نمایش داده می شود). زمان دور به طور مداوم در حال محاسبه تفاوت بین فشار اولیه کلید فلش سمت راست (زمان شروع) و زمان فعلی است.
دور آخر نیز یک محاسبه مشابه است. به جای زمان شروع، زمان از زمانی که موتور سیکلت از موقعیت مسیر از پیش تعریف شده عبور می کند (که در کد به عنوان trackPos < -4800 ذکر شده است) محاسبه می شود. موارد زیر در نقل قول نشان دهنده یک تصویر هستند.
این کد بلوک های تصویر را در فواصل زمانی مشخص و موقعیت های خاص روی صفحه نمایش می کشد. تصویر جمعی ارائه شده تنها 100 پیکسل عرض دارد. با این حال، کد زیر به کامپیوتر می گوید که چه زمانی تصویر را بکشد، به طوری که به نظر می رسد در هنگام حرکت یک جمعیت شبیه سازی شده پشت موتورسیکلت وجود دارد.
تصاویر سنگ در دو قسمت روی صفحه نمایش داده می شود. خط دوم و سوم کد، در زیر، با هم کار می کنند تا مناظر را به شکلی مرتب شبیه سازی کنند.
هنگامی که یک نسخه پشتیبان از کد پایتون ایجاد کردید، اعداد زیر را تغییر دهید تا ببینید برای سنگ های روی صفحه چه اتفاقی می افتد!
screen.blit("crowd1", ((t*100)+trackOffset-100, 0))
screen.blit("rock1", ((t*100)+trackOffset-100, 270))
screen.blit("rock1", ((t*100)+trackOffset-50, 270))
آیا می خواهید موتور خود را با کامیون هیولا، چهار چرخ یا وسیله نقلیه دیگری جایگزین کنید؟ شاید بخواهید با یک اسب شاخدار تا خط پایان مسابقه دهید؟
تنها کاری که باید انجام دهید این است که یک تصویر 50×50 پیکسل (با پس زمینه شفاف) بکشید. سپس، این فایل (picture.png) را در پوشه ‘images’ (در پوشه source-code-excitebike) قرار دهید. شما می خواهید دو تصویر (یکی با ارتفاع کمی افزایش یافته) ایجاد کنید تا کمی واقع گرایی اضافه کنید. تنها کاری که باید انجام دهید این است که مرجع را به ‘bike0’ در اینجا تغییر دهید:
bike = Actor('bike0', center=(150, 350), anchor=('center', 'bottom'))
همچنین مطمئن شوید که یک عمل پیدا کنید و نام عکس را جایگزین کنید (بدون پسوند تصویر).
() checkBikeRamp تابعی است که کار محاسبه محور Y را انجام می دهد تا موتورسیکلت (یا کامیون) شما از سطح شیب دار بالا برود (و اگر خوش شانس باشید هوای جدی دریافت کند). پارامترهای keyboard.right و keyboard.left در تابع update() تعریف شده اند.
این بیتهای کد به رایانه میگویند که موتور سیکلت را کم کند یا سرعتش را افزایش دهد (بسته به اینکه کاربر چه کلیدی را روی صفحه کلید فشار میدهد). ترجمه: هرچه موتور شما سریعتر حرکت کند، تعداد محور Y (یا پرش بسیار بزرگ) بیشتر می شود.
به صورت عرضی، تابع on_key_down(key) موتور شما را به یک دماغه می فرستد.
if key.name == "DOWN":
bike.direction = 1
bike.laneY = limit(bike.laneY + 50, 375, 525)
bike.y += bike.direction
پارامتر muckLane موتور سیکلت شما را با استفاده از محاسبه زیر کند می کند:
muckLane = int((bike.laneY-375)/50)+1
خط 66 کد تعیین می کند که چه زمانی تصویر “مک” روی صفحه نمایش داده شود. اکنون که رایانه میداند موتور سیکلت شما چه زمانی از روی گل و لای عبور میکند، سرعت موتور سیکلت شما را به نصف کاهش میدهد که در مسیر روی زمین حرکت میکنید. مقدار muckLane را از 50/ به 25/ یا 75/ تغییر دهید تا ببینید بعدا چه اتفاقی می افتد.
مسابقه دهندگان (اهم، برنامه نویسان پایتون)! موتورهای خود را روشن کنید!
حتی اگر از برنامهنویسی این ادای احترام به Excitebike راحت نیستید، این کد همچنان یک آغازگر عالی است. با تغییر دادن آن، و درک تاثیر بصری تغییرات، می توانید چیزهای زیادی یاد بگیرید. آیا سعی می کنید ویژگی ها یا مسابقه های هوش مصنوعی بیشتری را به بازی خود اضافه کنید؟ به دنبال آن برو!
با کمی تمرین پایتون در زیر کمربندتان، ایده دیگری که باید امتحان کنید این است که پس از گذشت 4 یا 5 بار از خط پایان، سطوح مختلف را اضافه کنید. همچنین، ممکن است بخواهید برای مقام اول، دوم و سوم جوایزی اضافه کنید. اگر در رتبه اول هستید، یک فایل صوتی تشویق کننده جمعیت نیز اضافه کنید! احتمالات فراوانی وجود دارد.
وقتی از پیشرفت های Excitebike خود راضی هستید، چرا به ایجاد یک بازی ماجراجویی متنی دست ندهید؟ قطعات مختلف زیادی وجود دارد که به شما اطمینان می دهد که برای ساعت ها، روزها یا حتی هفته ها چیزی هیجان انگیز یاد می گیرید!