![](https://duino4projects.com/wp-content/uploads/2021/06/Create-a-Choice-based-Text-Adventure-Game-With-Tinkercad-Circuits.jpg)
یکی از بهترین خاطرات دوران کودکی من، بازدید از خانه پدربزرگ و مادربزرگم و خواندن مجموعه قدیمی عمویم از کتاب های «خودت ماجراجویی را انتخاب کن» است. در حالی که من همیشه در انجام بازیهای ماجراجویی رایانهای مبتنی بر متن با دستورات سخت گیر میکردم، به سادگی و تنوع کتابهای CYOA علاقه داشتم (البته فراوانی پایانهای بد دراماتیک حداقل میگوید آسیبزا بود...).
در حالی که پروژههای مشابهی قبلاً انجام شده است، من میخواستم دستم را در ساخت ماجراجویی متنی مبتنی بر آردوینو برای بهبود مهارتهای کدنویسی خود و در عین حال آزمایش با مدارهای Tinkercad امتحان کنم. همچنین میخواستم مطمئن شوم که این چارچوب ماجراجویی متنی قابل استفاده مجدد است، نوشتن داستان را برای دیگران آسان میکند، و انعطافپذیر است، و اضافه کردن اقدامات سفارشی (مانند روشن کردن یک LED یا پخش آهنگ) را با پیشرفت داستان آسان میکند. بدون آن، ما ممکن است کل کار را به عنوان یک برنامه کامپیوتری انجام دهیم!
به عنوان یک برنامه نویس در قلب، من بخش خوبی از Instructable را برای توضیح نحوه کارکرد طرح صرف خواهم کرد، اما اگر فقط می خواهید داستانی بنویسید، به راحتی از طریق آن قسمت ها را مرور کنید.
نکته جالب در مورد استفاده از Tinkercad این است که اشتراک گذاری این داستان ها را بسیار آسان می کند، که در این زمان های دور از اجتماع عالی است. می توانید یک نمونه داستان را در زیر امتحان کنید!
تدارکات
این Instructable فرض می کند که شما قبلاً دانش پایه ای از مدارهای Arduino و Tinkercad دارید.
مرحله 1: ساخت مدار در Tinkercad
![](https://duino4projects.com/wp-content/uploads/2021/06/Build-the-Circuit-in-Tinkercad.jpg)
این پروژه از اجزای زیر تشکیل شده است:
- آردوینو اونو
- یک صفحه LCD¹ متصل به پین های 7، 6، 5، 4، 3، 2 (به ترتیب RS، E، DB4، DB5، DB6، DB7)
- دو دکمه فشاری متصل به پین های 12 و 13
- پنج مقاومت 220 اهم
- یک LED RGB متصل به پین های 9، 10، 11
شما می توانید مدار را با ایجاد مجدد دستی شماتیک بالا و سپس کپی و چسباندن کد موجود در اینجا بسازید. اگر میخواهید سریع باشید، میتوانید با فشار دادن دکمه «Copy and Tinker» پروژه من را در Tinkercad ریمیکس کنید.
¹ Tinkercad فقط یک LCD 16×2 دارد، اما اگر این پروژه را با اجزای واقعی میسازید، احتمالاً صفحه نمایش بزرگتر راحتتر خواهد بود.
مرحله 2: یک ساختار داده برای داستان طراحی کنید
![](https://duino4projects.com/wp-content/uploads/2021/06/Design-a-Data-Structure-for-the-Story.jpg)
قبل از شروع به نوشتن داستان، باید بهترین راه برای پیاده سازی آن در کدمان را پیدا کنیم. اولین غریزه شما ممکن است ایجاد مجموعه ای از رشته ها برای ذخیره جملات سازنده داستان باشد. در حالی که به نظر می رسد می تواند کار کند، ما همچنین باید انتخاب هایی را که پخش کننده می تواند انجام دهد (که نه تنها شامل جمله بلکه صفحه ای است که هر انتخاب به آن منتهی می شود شامل می شود) و راهی برای ارجاع به هر کد اضافی که ممکن است بخواهیم اجرا کنیم را ذخیره کنیم.
نگه داشتن همه این اطلاعات در آرایه های مختلف به سرعت درهم می شود و نوشتن داستان را سخت می کند، بنابراین بیایید چیزی بهتر را هدف قرار دهیم و ساختار داده خود را با استفاده از یک ساختار ایجاد کنیم . ² ساختار فقط گروهی از متغیرها است که میتوانیم از آنها برای ذخیره اطلاعات به شیوهای منظم استفاده کنیم.
بیایید سه ساختار برای ماجراجویی متنی خود تعریف کنیم:
- یک پاساژ بخشی از داستان ما را نشان می دهد. این مجموعه توسط آرایه ای از ساختارهای پیام که حاوی متن این قطعه است و آرایه ای از ساختارهای انتخابی که شامل انتخاب هایی است که بازیکن می تواند انجام دهد، تشکیل شده است.
- یک پیام نشان دهنده یک پیام واحد است که ما روی صفحه LCD نشان خواهیم داد، که آن را به صورت آرایه ای از رشته ها (یک رشته در هر ردیف روی صفحه) ذخیره می کنیم. ما همچنین یک "شماره اقدام" را اضافه می کنیم که اگر بخواهیم به کد اضافی ارجاع دهیم، استفاده می شود. بیشتر در مورد آن در مرحله 4!
- در نهایت، یک ساختار Choice متن انتخابی و یک عدد هدف را ذخیره میکند تا نشان دهد این انتخاب به کدام پاساژ منتهی میشود. به عنوان یک قرارداد، اگر هر گزینه ای "-1" را به عنوان شماره هدف خود داشته باشد، فرض می کنیم که گذر یک پایان است و به صفحه پایانی تغییر می کند.
با شفاف بودن ساختارهای داده، میتوانیم ثابتهایی را تعریف کنیم که به ما امکان میدهند ساختارهای خود را شکل دهیم:
/* Set these to your liking! */ const int MESSAGES_PER_PASSAGE = 5; // Number of messages before choices are presented. const int CHOICES_PER_PASSAGE = 2; // Choice that are presented to the player at each fork. const int TYPEWRITER_DELAY = 50; // Pause in milliseconds inbetween characters appearing on screen. /* These depend on the LCD screen you are using. */ const int LINES_PER_MESSAGE = 2; // Number of rows on your LCD screen. const int CHARACTERS_PER_LINE = 16; // Number of columns on your LCD screen.
با استفاده از ثابت ها، اکنون می توانیم ساختارهای کد را به این صورت تعریف کنیم: