معرفی
چند سالی که عضو CodeProject بودم و نتوانستم مقالهای را منتشر کنم، کمی از خودم ناامید شدم. من بارها فکر کرده ام که چه نوع مقاله ای می توانم تولید کنم. سپس پس از برخورد با چند مقاله عالی توسط jeffb42 در اینجا در CodeProject، مشکل من حل شد.
من حدود دو ماه پیش بازی با پلتفرم سخت افزاری آردوینو را شروع کردم ، پس از جستجوی چیزی مناسب برای چند پروژه ای که در ذهن داشتم برای استفاده در خانه. برای اینکه بتوانم از دستگاه استفاده کنم، ابتدا باید با قابلیت های آن آشنا می شدم.
این مقاله به بررسی چگونگی غلبه بر مشکل اجرای کلون بازی SIMON با استفاده از پلتفرم آردوینو میپردازد، زیرا این روشهای مقابله با محدودیت برنامه اصلی و استفاده مجدد از کد را در این پلت فرم سختافزاری نشان میدهد.
برای کسانی از شما که با SIMON آشنایی ندارید، این یک بازی الکترونیکی اولیه از دهه 70 بود، که در آن کاربر اساساً مجبور بود برای پیشرفت به سطح بعدی یک دنباله را به کنسول تکرار کند. در اجرای بازی من، کاربر می تواند حالت پیشرو را بازی کند، جایی که بازی قبل از اضافه کردن یک مرحله تصادفی در پایان، از سطح قبلی به عنوان شروع سطح بعدی دوباره استفاده می کند، یا حالت تصادفی، که در آن هر سطح از بازی است. یک دنباله تصادفی جدید تولید می کند که هر مرحله طولانی تر از مرحله قبلی است.
مقدمه jeffb42 به آردوینو و مقالات رابط با LCD جزئیات بیشتری را در مورد مشخصات پلتفرم آردوینو ارائه می دهد، و در وب سایت خود ، نمونه های مختلفی از برخی از اصول اولیه IO را دارم، بنابراین نیازی به تکرار این موضوع در اینجا نیست.
زمینه
چالش ساخت این بازی بر روی آردوینو، نحوه کار پلتفرم است. در کد منبع، سه ناحیه برای قرار دادن کد وجود دارد: ناحیه مقداردهی اولیه، روش راه اندازی و روش حلقه. اینها به ترتیب اجرا می شوند.
پنهان کردن کد کپی
//initialisation section
// Library references and variable/constant declarations contained here
void setup()
{
//This method runs once
//Hardware allocation done here e.g. input/output pin directions
}
void loop()
{
//This method will run until power is removed or a new program is
//uploaded to the platform
}
چالش این است که بتوانیم کد را به گونهای عمل کنیم که بتوان یک بازی را بارها و بارها در هر یک از دو حالت، بدون ترک یک حلقه بی پایان، بازی کرد.
با استفاده از کد
شماتیک نیازهای سخت افزاری و همچنین کد منبع در فایل دانلود گنجانده شده است. اگر اجزای لازم را دارید، میتوانید بازی را بسازید و کد آن را در آردوینو آپلود کنید تا کار کند. از طرف دیگر، اگر به تازگی با پلتفرم یا چیزی مشابه شروع کرده اید، کد ممکن است ایده هایی در مورد چگونگی دستیابی به اهداف مشابه در پروژه های خود به شما ارائه دهد.
ساختار بازی
ما باید بتوانیم کد بازی را در یک حلقه بی پایان در حال اجرا نگه داریم و یک روش برای رسیدن به این هدف استفاده از پرچم است. متغیرهای بولی که درست یا نادرست هستند یکی از سادهترین راهها برای رسیدن به این هدف است. با نگاهی به نحوه عملکرد بازی، چند پرچم اساسی وجود دارد که مورد نیاز است. آنها وضعیت بازی را نگه می دارند، یعنی آیا شروع شده است، آیا بازی شده است و اگر بازی اکنون تمام شده است. چند متغیر دیگر نیز برای پیگیری مراحل ایجاد شده و کاربر در چه سطحی مورد نیاز است. این الزامات و همچنین تخصیص پین های سخت افزاری در بخش مقداردهی اولیه کد شناسایی می شوند:
پنهان کردن کد کپی
#include <LiquidCrystal.h>
//initialise the library with the numbers of the interface pins
LiquidCrystal lcd(13,12,11,10,9,8);
int userInput = 0; //Analog pin for user input from buttons
int led1 = 2; //LED 1
int led2 = 3; //LED 2
int led3 = 4; //LED 3
int led4 = 5; //LED 4
int speaker = 6; //Speaker
//Game Stats
boolean started = false; //Has the game started yet
boolean gameover = false; //Has the game ended
int level = 0; //What level is the user on (Score at end = level -1)
int gameMode = 0; //Which game mode is being used
// 1 = Progressive
// 2 = Random
boolean soundEnabled = true; //Is the sound enabled or not
int lastLevelSeq[50]; //The sequence for the steps used
//in progressive mode previous level
//Also used by game over to replay correct sequence back
//Nobody can get passed 50, surely!
بخش بعدی کد setup()
روش است. اینجاست که پین های سخت افزاری مقدار دهی اولیه می شوند.
پنهان کردن کد کپی
void setup()
{
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(speaker, OUTPUT);
//Set up the LCD Col and Row count
lcd.begin(16,2);
delay(100);
lcd.clear();
lcd.print("Welcome to");
lcd.setCursor(0,1);
lcd.print("Arduino SIMON");
//...........rest of setup code snipped. see the download.
از اینجا، مورد بعدی که اجرا می شود loop()
متد است که به طور بی پایان اجرا می شود، از این رو نیاز به پیگیری وضعیت بازی است. همچنین، برای کوتاهتر و کارآمد نگه داشتن کد، تعدادی از روشهای کمکی برای برآورده کردن الزامات استفاده مجدد که در ابتدای مقاله ذکر شد، استفاده میشود.