فهرست مطالب:

آردوینو - کاشی پیانو: 16 مرحله (همراه با تصاویر)
آردوینو - کاشی پیانو: 16 مرحله (همراه با تصاویر)

تصویری: آردوینو - کاشی پیانو: 16 مرحله (همراه با تصاویر)

تصویری: آردوینو - کاشی پیانو: 16 مرحله (همراه با تصاویر)
تصویری: حرکات زشت سحر قریشی در باشگاه مردانه در دبی#سحرقریشی #امیرتتلو #تتلو #سحر_قریشی 2024, جولای
Anonim
آردوینو - کاشی پیانو
آردوینو - کاشی پیانو

سلام به مردم اینترنت ، این در مورد چگونگی ایجاد چیزی است که به طور قطع از بازی موبایل در arduino uno r3 استفاده نمی کند.

بنابراین برای شروع ، شما به تمام قطعات نیاز دارید ، که به شرح زیر است! 1 برابر Arduino Uno r3 (42 دلار)

محافظ صفحه کلید LCD 2 برابر (هر کدام 19 دلار)

دکمه های 5 برابر

5x مقاومت 220Ω

سیم 28x

خوب ، هنگامی که تمام قسمت ها را تهیه کردید ، زمان شروع کار است!

مرحله 1: سیم کشی

سیم کشی
سیم کشی
سیم کشی
سیم کشی
سیم کشی
سیم کشی

با سیم کشی آردوینو و دوستان خود همانطور که در نمودار نشان داده شده است ، شروع کنید ،

مطمئن شوید که دکمه ها به طور صحیح به هم متصل شده اند ، در حالی که شکاف A0-4 در قسمت پایینی ریل دکمه قرار دارد ، یا در عوض آردوینو فکر می کند که دکمه ها به طور مداوم به جای فشار دادن فشار داده می شوند.

مرحله 2: بیانیه های اعلامیه

همه کدهای اینجا باید قبل از تنظیمات void و حلقه void شما پیش بروند ، زیرا همه این متغیرها و اشیاء در چندین توابع مورد استفاده ما استفاده می شوند.

با قرار دادن شروع کنید:

#عبارتند از

در بالای کد شما ، این به arduino می گوید که از کتابخانه "LiquidCrystal.h" و توابع بخشی از آن استفاده کند.

گام بعدی این است که پین هایی را که برای دکمه های خود استفاده می کنیم با قرار دادن این کد در زیر #شامل خود تعریف کنید:

#تعریف btnEnter A0 #define btn1 15 #تعریف btn2 16 #تعریف btn3 17 #تعریف btn4 18

ما اصطلاحات btnEnter و btn1 را به btn 4 تعریف می کنیم تا خواندن کد برای ما آسان تر شود یا در صورت لزوم تغییر کند. این بدان معناست که وقتی btn1 را تایپ می کنیم ، آردوینو می داند که در واقع منظور ما دکمه 15 است. اگرچه ما پورت ها را پورت 15 ، 16 ، 17 و 18 می نامیم ، اما بر روی آردوینو برچسب A1 A2 A3 و A4 دارند ، دلیل این امر این است که آنها پورت هایی هستند که به طور خاص برای ورودی های آنالوگ استفاده می شوند ، اگرچه ما فقط از آنها برای ورودی های دیجیتال استفاده می کنیم.

در مرحله بعد ما قصد داریم اشیایی را ایجاد کنیم که نمایشگرهای کریستال مایع را کنترل کنند. برای این کار این کد را در زیر تعریف های ما قرار دهید

LiquidCrystal lcdLeft (8 ، 9 ، 12 ، 10 ، 11 ، 13) ؛ LiquidCrystal lcdRight (2 ، 3 ، 4 ، 5 ، 6 ، 7) ؛

کاری که انجام می دهد این است که به آردوینو می گوید که وقتی lcdLeft یا lcdRight را فرا می خوانیم به یک شیء LiquidCrystal ارجاع می دهیم. اعداد داخل براکت های پیوست شده به آردوینو می گوید که هنگام استفاده از عملکردها ، شیء از کدام پورت ها برای ارسال پیام به LCD استفاده می کند.

حال باید متغیرها را با قرار دادن بیت بعدی کد در زیر اعلان های شیء اعلام کنیم:

// این متغیرها گزینه هایی هستند که می توانید تغییر دهید - اعداد بالاتر = سرعت سریعتر بازی در intGameSpeedEasy = 10 ؛ int intGameSpeedMedium = 25 ؛ int intGameSpeedHard = 80 ؛

// تنظیم متغیرها برای bolbolay gameboolean؛ // آهنگ پخش کننده int intScore؛ // نمره بازیکن int intDiff را پیگیری می کند. // فقط یک نکته زیبا برای گفتن اینکه بازی در چه مشکلاتی است // متغیرهایی را برای ورودی int intEnter تنظیم کنید. // اگر کاربر دکمه enter int intInput را فشار دهد ، پیگیری می شود. // آهنگ هایی را که کاربر فشار می دهد boolean bolTilePressed را دنبال می کند. // اطمینان حاصل کنید که بازیکن به طور تصادفی دکمه 5x را فشار ندهد و از دست ندهد // متغیرهایی را برای turn int intTick تنظیم کنید. // تعداد میلی متر (در هر حلقه) تا intDelay int intDelay شمارش می کند. // زمان صبر برنامه تا نوبت بعدی در millis int intGameSpeed ؛ // abit of debug options boolean bolSerialBoard؛ // when true تخته را در مانیتور سریال چاپ می کند

ما یک متغیر را با بیان نوع داده و سپس نام متغیر ، به عنوان مثال ، اعلام می کنیم. int thisIsAnInteger

متغیرهای بولی مانند bolSerialBoard و bolPlay فقط می توانند یکی از دو مقدار درست یا غلط را داشته باشند.

متغیر صحیح (int) مانند intScore و intInput می تواند اعداد کامل را به عنوان مقادیر مانند 1 ، 5 یا 100 در نظر بگیرد.

برخی از انواع داده های قابل توجه دیگر که ما در اینجا از آنها استفاده نمی کنیم ، یک رشته است که یک قسمت از متن است و یک شناور که یک عدد اعشاری است.

هر یک از متغیرها در اینجا در چندین مکان مختلف توسط برنامه استفاده می شود ، در اینجا خلاصه ای از کارهایی است که هر کدام انجام می دهند

bolPlay به برنامه می گوید که آیا منو باید نمایش داده شود یا بازی اصلی باید اجرا شود یا خیر.

intScore نمره بازیکن را هنگام برخورد با کاشی ها دنبال می کند ،

intDiff در منوی اصلی استفاده می شود تا به برنامه بگوید چه مقدار متن را روی LCD چاپ کند ،

intEnter برای اطلاع از برنامه در صورت فشار دادن دکمه enter (دورترین سمت چپ) استفاده می شود ،

intInput برای گفتن برنامه از بین 4 دکمه دیگر استفاده می شود.

bolTilePressed برای اطمینان از این که برنامه فقط زمانی که دکمه را فشار می دهید می خواند و نه زمانی که آن را نگه داشته اید می خواند.

intGameSpeed ، intGameSpeedEasy ، intGameSpeedMedium و intGameSpeedHard برای کنترل سرعت بازی بر اساس مشکل انتخاب شده استفاده می شود.

intTick و intDelay برای توقف حرکت تخته در هر بار که برنامه حلقه می شود استفاده می شود.

bolSerialBoard استفاده می شود تا به شما اجازه دهد برنامه را به عنوان یک سری اعداد برای آزمایش ، برد را به مانیتور سریال arduino ارسال کنید.

در نهایت زمان آن رسیده است که برد خود را با استفاده از این کد به عنوان یک آرایه اعلام کنیم:

// set arrayint game arrGame [16] [4] = {{0، 0، 0، 0}، {0، 0، 0، 0}، {0، 0، 0، 0}، {0، 0، 0، 0}، {0، 0، 0، 0}، {0، 0، 0، 0}، {0، 0، 0، 0}، {0، 0، 0، 0}، {0، 0، 0، 0}، {0، 0، 0، 0}، {0، 0، 0، 0}، {0، 0، 0، 0}، {0، 0، 0، 0}، {0، 0، 0 ، 0} ، {0 ، 0 ، 0 ، 0} ، {0 ، 0 ، 0 ، 0}} ؛

آرایه یک ماتریس است که هر نقطه ای را می توان برای ریاضی فراخوانی کرد یا تغییر داد.

کد شما اکنون باید چیزی شبیه به این باشد ؛

// شامل کتابخانه ها#شامل

// این متغیرها گزینه هایی هستند که می توانید تغییر دهید - اعداد بالاتر = سرعت بازی بیشتر

int intGameSpeedEasy = 10؛ int intGameSpeedMedium = 25 ؛ int intGameSpeedHard = 80 ؛

// پین ها را تعریف کنید

#تعریف btnEnter A0 #تعریف btn1 15 #تعریف btn2 16 #تعریف btn3 17 #تعریف btn4 18

// ایجاد اشیاء LCD (n ، ~ ، n ،، ، ~ ، n)

LiquidCrystal lcdLeft (8 ، 9 ، 12 ، 10 ، 11 ، 13) ؛ LiquidCrystal lcdRight (2 ، 3 ، 4 ، 5 ، 6 ، 7) ؛

// تنظیم آرایه بازی

int arrGame [16] [4] = {{0، 0، 0، 0}، {0، 0، 0، 0}، {0، 0، 0، 0}، {0، 0، 0، 0}، {0، 0، 0، 0}، {0، 0، 0، 0}، {0، 0، 0، 0}، {0، 0، 0، 0}، {0، 0، 0، 0}، {0، 0، 0، 0}، {0، 0، 0، 0}، {0، 0، 0، 0}، {0، 0، 0، 0}، {0، 0، 0، 0}، {0 ، 0 ، 0 ، 0} ، {0 ، 0 ، 0 ، 0}} ؛

// متغیرهایی را برای بازی تنظیم کنید

boolean bolPlay؛ // آهنگ پخش کننده int intScore؛ // نمره بازیکن int intDiff را پیگیری می کند. // فقط یک چیز زیبایی برای گفتن اینکه بازی با چه مشکلاتی روبرو است

// متغیرهایی را برای ورودی تنظیم کنید

int intEnter ؛ // اگر کاربر دکمه enter int intInput را فشار دهد ، پیگیری می شود. // آهنگ هایی را که کاربر فشار می دهد boolean bolTilePressed را دنبال می کند. // اطمینان حاصل کنید که بازیکن به طور تصادفی دکمه 5 برابر را فشار ندهد و بازنده نشود

// متغیرهایی را برای turn تنظیم کنید

int intTick؛ // تا زمانیکه intDelay int intDelay میلیلی (در هر حلقه) شمارش می کند ؛ // زمان صبر برنامه تا نوبت بعدی در millis int intGameSpeed ؛

// حذف گزینه های اشکال زدایی

boolean bolSerialBoard؛ // when true تخته را در مانیتور سریال چاپ می کند

مرحله 3: تابع راه اندازی

حلقه راه اندازی یک تابع است که توسط arduino فقط یک بار در هنگام شروع به کار خوانده می شود.

در حلقه راه اندازی ما فقط مقادیر کمی از متغیرهای خود را تنظیم می کنیم زیرا به جای تعیین مقدار آنها هنگام اعلام آنها ، این کار را در اینجا انجام می دهیم.

با قرار دادن این کد در Void Setup شروع کنید.

bolPlay = false ؛ intScore = 0 ؛ intTick = 0 ؛ intDelay = 1000 ؛ intDiff = 1؛ intGameSpeed = intGameSpeedMedium؛

هر خط فقط یک متغیر را روی یک مقدار تنظیم می کند.

bolPlay روی false تنظیم شده است تا بازی شروع به بازی نکند.

intScore روی 0 تنظیم شده است ، زیرا طبیعتاً نمره شما از 0 شروع می شود.

intTick از 0 شروع می شود زیرا برنامه در حال حاضر چیزی را حساب نمی کند.

intDelay بر روی 1000 تنظیم شده است زیرا این همان نرخ شروع کاشی ها است.

intDiff فقط یک چیز زاهدانه است تا برنامه بداند برای سختی بازی چه بنویسد.

intGameSpeed بر روی intGameSpeedMedium تنظیم شده است ، به این معنی که در سختی متوسط تنظیم شده است.

سپس این کد را در Void Setup زیر کدی که وارد کرده اید قرار دهید.

lcdLeft.begin (16 ، 2) ؛ lcdRight.begin (16 ، 2) ؛

Serial.begin (9600)؛

این به آردوینو می گوید که از طریق مانیتور سریال با کامپیوتر ارتباط برقرار کند (با کلیک روی دکمه در سمت راست بالای arduino IDE قابل مشاهده است).

اکنون Void Setup شما باید شبیه این باشد!

void setup () {Serial.begin (9600)؛ // مانیتور سریال را راه اندازی کنید // متغیرها را تنظیم کنید bolPlay = false؛ intScore = 0 ؛ intTick = 0 ؛ intDelay = 1000 ؛ intDiff = 1؛ intGameSpeed = intGameSpeedMedium؛ // شروع lcd's lcdLeft.begin (16 ، 2) ؛ lcdRight.begin (16 ، 2) ؛ }

مرحله 4: تابع حلقه

عملکرد حلقه توسط arduino در هر تکرار arduino اجرا می شود.

کد زیر را در Void Loop خود کپی کنید.

void loop () {input ()؛ // بررسی ورودی بازی در صورت (bolPlay == true) {if (intTick> = intDelay) {// بررسی کنید که آیا بازی باید به نوبه خود بازی کند یا همچنان منتظر بماند Serial.println ("~~~~~~~ print ") ؛ // برای نشان دادن تابلوی در حال حرکت روی // writeSerial () چاپ کنید؛ // در صورت فعال بودن گزینه ، برد را روی دکمه های سریال () بنویسید ()؛ // ورودی های بازیکن را بررسی کنید playBoard ()؛ // برد را جابجا کرده و یک کاشی جدید اضافه کنید clearLcd ()؛ // قبل از کشیدن drawBoard () LCD ها را تمیز کنید؛ // تخته را روی lcd's bottomCheck () بکشید. intTick = 0 ؛ // تنظیم مجدد intTick} else {buttonsGame ()؛ // بررسی ورودی های پخش کننده clearLcd ()؛ // قبل از کشیدن drawBoard () LCD ها را تمیز کنید؛ // برد را روی intcick lcd = intTick + intGameSpeed بکشید ؛ // افزودن به تیک}} else {clearLcd ()؛ // قبل از کشیدن عنوان () LCD ها را تمیز کنید؛ // نمایش عنوان و امتیاز info infoMenu ()؛ // خواندن ورودی پخش کننده clearBoard ()؛ // اطمینان از کل برد = 0} تاخیر (10) ؛ // آردوینو را به مدت کوتاهی به تأخیر بیاندازید}

وقتی bolPlay برابر true باشد به این معنی است که بازی در حال بازی است و تمام کدهای مربوط به زمان بازی باید اجرا شود ، اما ما فقط می خواهیم که تخته کاشی جدیدی اضافه کرده و وقتی intTick از intDelay ما بزرگتر است به پایین حرکت کند ، در غیر این صورت ما هنوز می خواهیم به کاربر اجازه دهیم دکمه ای را برای ضربه زدن به کاشی و برای افزایش سرعت intTick فشار دهد.

بیشتر این کد از توابعی استفاده می کند که هنوز باید انجام دهیم ، و آنها را در مراحل بعدی ایجاد خواهیم کرد. هدف از این توابع به شرح زیر است.

ورودی می خواند که کاربر کدام دکمه ها را فشار داده است.

buttonsGame کارهایی را که دکمه ها در بازی انجام می دهند و نه در منو کنترل می کند

playBoard یک کاشی جدید به تخته اضافه می کند ، و سپس همه چیز را در یک صفحه به سمت پایین حرکت می دهد

clearLCD LCD ها را تمیز می کند تا مطمئن شود که هیچ روح در پشت کاشی ها باقی نمانده است

drawBoard از طریق arrGame می گذرد و آن را روی LCD ها چاپ می کند

CleBoard وقتی arrGame را بازی نمی کند ، کل آن را پاک می کند

bottomCheck قسمت پایین arrGame را از نظر خرابی بررسی می کند

title عنوان و اطلاعات بازی را در هنگام نمایش در منو نمایش می دهد

دکمه های منو کنترل می کند که ورودی های کاربر وقتی در منو هستند انجام می شود.

gameOver یک تابع دیگر است ، اگرچه در اینجا به این صورت فراخوانی نشده است ، زیرا در قسمت پایین آن توابع CheckCheck و buttonsGame نامیده می شود.

مرحله 5: تابع ClearLCD

برای ایجاد یک تابع ، ما با افزودن این کد به کد شروع می کنیم

void functionName () {

}

"functionName" می تواند هر چیزی باشد ، مادامی که قبلاً وجود نداشته باشد.

این کد را در برنامه خود کپی کنید:

void clearLcd () {for (int i = 0؛ i <= 15؛ i ++) {for (int ii = 0؛ ii <= 1؛ ii ++) {lcdLeft.setCursor (i، ii)؛ lcdLeft.write ("")؛ lcdRight.setCursor (i ، ii) ؛ lcdRight.write ("")؛ }}}

این با استفاده از 2 حلقه شمارش شده برای عبور از هر نقطه روی LCD ها و نوشتن فاصله ، کل آرایه را اجرا می کند.

بدون تنظیم مجدد هیچ چیز ، LCD ها آنچه را که قبلاً نوشته شده است حفظ می کند

مرحله 6: تابع DrawBoard

این کد را در برنامه خود کپی کنید

void drawBoard () {for (int i = 1؛ i <= 15؛ i ++) {// Collums 1 و 2 را در LCD سمت چپ بکشید // اگر کاشی = 0 چیزی ننویسید ، = 1 "#" بنویسید ، = 2 "@" را بنویسید lcdLeft.setCursor (i ، 1) ؛ // برای اولین ستون (دورترین سمت چپ) تنظیم کنید اگر (arrGame [0] == 1) {lcdLeft.write ("#")؛} if (arrGame [0] == 2) {lcdLeft.write ("@")؛} lcdLeft.setCursor (i، 0)؛ // ستون دوم (مرکز سمت چپ) اگر (arrGame [1] == 1) {lcdLeft.write ("#")؛} if (arrGame [1] == 2) {lcdLeft.write ("@")؛} lcdRight.setCursor (i، 1)؛ // ستون سوم (مرکز راست) if (arrGame [2] == 1) {lcdRight.write ("#")؛} if (arrGame [2] == 2) {lcdRight.write ("@")؛} lcdRight.setCursor (i، 0)؛ // ستون چهارم (دورترین سمت راست) را تنظیم کنید اگر (arrGame [3] == 1) {lcdRight.write ("#")؛} if (arrGame [3] == 2) {lcdRight.نوشتن("@")؛} } }

این از یک حلقه برای عبور از هر ردیف برد استفاده می کند ، سپس بررسی می کند که آیا هر ستون در ردیف برابر با 1 یا 2 است یا خیر ، بر این اساس سپس یک هشتگ روی LCD چاپ می کند ، برای کاشی که هنوز وجود ندارد ضربه بزنید ، یا یک @ برای یک کاشی ضربه بزنید.

مرحله 7: عملکرد PlayBoard

این کد را در برنامه خود کپی کنید.

void playBoard () {for (int i = 0؛ i <= 3؛ i ++) {arrGame [0] = 0؛} // پاک کردن ردیف بالا arrGame [0] [تصادفی (0 ، 4)] = 1 // یک نقطه تصادفی در ردیف بالا تنظیم کنید تا کاشی برای (int i = 15؛ i> = 1؛ i-) {// کار از پایین تخته به بالا برای (int ii = 0؛ ii <= 3 ؛ ii ++) {// برای هر برخورد arrGame [ii] = arrGame [i - 1] [ii] ؛ }}}

این کد با پاکسازی کل ردیف بالا روی 0 یا بدون کاشی شروع می شود و سپس یک کاشی تصادفی را به عنوان 1 و بدون کاشی تنظیم می کند.

سپس از طریق یک حلقه شمارش معکوس ، از 15 تا 1 ، ردیف را برابر با ردیف بالای آن برابر می کند ، و باعث می شود که صفحه به سمت پایین LCD حرکت کند

مرحله 8: تابع ClearBoard

این کد را در برنامه خود کپی کنید.

void clearBoard () {// بازنشانی مقادیر تیک و تأخیر intTick = 0؛ intDelay = 1000 ؛ // از صفحه عبور کنید و همه چیز را برای 0 تنظیم کنید (int i = 0؛ i <= 15؛ i ++) {برای (int ii = 0؛ ii <= 3؛ ii ++) {arrGame [ii] = 0 ؛ }}}

این کد زمانی اجرا می شود که بازی در حال اجرا نباشد تا مطمئن شوید که کل arrGame روی 0 یا بدون کاشی تنظیم شده است ، با استفاده از حلقه های شمارش شده برای عبور از آرایه.

کد همچنین مقادیر intDelay و intTick را بازنشانی می کند.

مرحله 9: تابع عنوان

کد زیر را در برنامه خود کپی کنید

void title () {// نوشتن عنوان روی LCD و فاصله برای نمره lcdRight.setCursor (0 ، 0) ؛ lcdRight.write ("کاشی پیانو") ؛ lcdRight.setCursor (0 ، 1) ؛ lcdRight.write ("امتیاز:")؛ // تبدیل نمره به string strScore [3] ؛ sprintf (strScore ، "٪ d" ، intScore) ؛ // نمایش نمره روی LCD lcdRight.write (strScore) ؛ // diffctuly lcdRight.setCursor (10 ، 1) را اضافه کنید ؛ if (intDiff == 0) {lcdRight.write ("آسان") ؛ } if (intDiff == 1) {lcdRight.write ("متوسط")؛ } if (intDiff == 2) {lcdRight.write ("سخت")؛ } // کمی دستورالعمل lcdLeft.setCursor (0 ، 0) را فشار دهید ؛ lcdLeft.write ("Enter را فشار دهید") ؛ lcdLeft.setCursor (0 ، 1) ؛ lcdLeft.write ("برای شروع!") ؛ }

این کد عنوان بازی و نمره را روی LCD ها می نویسد ، این کار را با گفتن به LCD از کجا شروع به تایپ با استفاده از LCD.setCursor و سپس نوشتن رشته در LCD.write می کند.

یک متغیر جدید نیز در اینجا ایجاد می شود ، strScore ، از آن برای تبدیل intScore به یک رشته یا نوع داده با استفاده از تابع sprintf استفاده می شود.

intDiff نیز در اینجا استفاده می شود ، بر اساس مقادیر آن ، گزینه های مختلف دشواری را چاپ می کند.

مرحله 10: عملکرد ButtonsMenu

کد زیر را در برنامه خود وارد کنید

void buttonsMenu () {// وقتی enter فشرده می شود بازی را شروع کرده و مقدار امتیاز را در صورت بازنشانی (intEnter == 1) {bolPlay = true؛ intScore = 0 ؛ playBoard ()؛ drawBoard ()؛ } // هنگامی که دکمه 3 فشار داده می شود گزینه اشکال زدایی چاپ صفحه را به صورت سریال اگر (intInput == 3) {if (bolSerialBoard == false) {Serial.println ("Serial Board Active") روشن کنید. bolSerialBoard = true؛ } else {Serial.println ("Serial Board Disabled")؛ bolSerialBoard = false؛ }} // سرعت بازی را بر روی دشواری آسان تنظیم کنید اگر (intInput == 0) {Serial.print ("بازی روی آسان تنظیم شد" () ؛ Serial.print (intGameSpeedEasy) ؛ Serial.println ("ms acceleration)") ؛ intDiff = 0؛ intGameSpeed = intGameSpeedEasy؛ } // سرعت بازی را بر روی مشکل متوسط تنظیم کنید (intInput == 1) {Serial.print ("بازی روی متوسط (") تنظیم شده است ؛ Serial.print (intGameSpeedMedium) ؛ Serial.println ("ms acceleration)") ؛ intDiff = 1؛ intGameSpeed = intGameSpeedMedium؛ } // سرعت بازی را روی سختی سخت تنظیم کنید (intInput == 2) {Serial.print ("بازی روی سخت (") ؛ Serial.print (intGameSpeedHard) ؛ Serial.println ("ms acceleration)") ؛ intDiff = 2 ؛ intGameSpeed = intGameSpeedHard؛ }}

این کد تنها زمانی اجرا می شود که bolPlay در حلقه void برابر false باشد

اگر intEnter روی 1 تنظیم شده باشد به این معنی است که دکمه enter فشار داده شده است ، اگر فشار داده شود برنامه bolPlay را روی true تنظیم کرده و بازی شروع می شود.

سپس برنامه می خواند intInput با چه چیزی برابر است. اگر برابر 0 باشد اولین دکمه از سمت چپ در حال فشردن است ، به سمت راست تا 3. اگر intInput برابر 4 است هیچ دکمه ای فشرده نمی شود.

اگر دکمه های 0-2 را فشار دهید ، بازی دشواری را تغییر می دهد و مقدار سرعت بازی را نیز تنظیم می کند ، به این معنی که سرعت آن سریعتر خواهد بود.

اگر دکمه 3 را فشار دهید ، بازی حالت اشکال زدایی را فعال یا غیرفعال می کند که در آن تمام صفحه در مانیتور سریال چاپ می شود تا در یافتن مشکلات برنامه کمک کند.

مرحله 11: عملکرد ButtonsGame

کد زیر را در برنامه خود کپی کنید

void buttonsGame () {if (intInput! = 4) {// اگر دکمه ای فشار داده شود اگر (bolTilePressed == false) {// فقط در صورتی که bolTilePressed اقدام ماشه ای غلط برای بررسی یک دکمه باشد bolTilePressed = true؛ // سپس bolTilePressed را روی true تنظیم کنید تا مطمئن شوید که دوباره به صورت تصادفی int intowLestTile = 0 فعال نشده است. // برای تنظیم کاشی با کمترین کاشی int intCheckedTile = 15؛ // برای پیگیری اینکه کدام کاشی ها در حین (intLowestTile == 0) {// تا زمانی که روی هیچ چیزی تنظیم نشده باشد کاشی ها را بررسی کنید (int i = 0؛ i 100) {// تا زمانی که int تاخیر کمتر از 100 intDelay = intDelay - 20 نیست؛ // یک مقدار از آن بگیرید}} else {Serial.println ("دکمه اشتباه فشار داده شده است")؛ بازی تمام شد()؛ // در غیر این صورت بازی بیش از}}}}}

کد تنها زمانی اجرا می شود که bolPlay برابر با true در حلقه خالی باشد.

مانند buttonsMenu بر اساس مقدار intInput ، بررسی می کند که آیا پخش کننده به کاشی برخورد کرده یا کاشی را از دست داده است.

این کار را با گذراندن arrGame از پایین به بالا با استفاده از یک حلقه while انجام می دهد تا ببیند کدام ردیف با کاشی unhit کمترین است. سپس بررسی می کند که آیا نقطه در آن ردیف مربوط به دکمه فشرده کاشی بدون ضربه است یا خیر ، اگر unhit باشد آن را به جای 1 برابر 2 می کند ، به این معنی که به صورت @نمایش داده می شود ، در غیر این صورت باعث فعال شدن بازی می شود تابعی که هنوز قرار نیست ایجاد کنیم

این تابع همچنین از متغیر bolTilePressed استفاده می کند و آن را هنگام فشار دادن یک دکمه روی true و هنگامی که هیچ دکمه ای فشرده نمی شود ، تنظیم می کند. این امر برای اطمینان از این است که کاربر به طور تصادفی بازی را از دست نمی دهد زیرا برنامه تصور می کرد که وقتی دکمه را نگه داشته اند چندین بار آن را فشار داده اند.

مرحله 12: عملکرد GameOver

کد زیر را در برنامه خود کپی کنید

void gameOver () {Serial.println ("بازی تمام شد!")؛ Serial.print ("نمره شما بود:")؛ Serial.println (intScore) ؛ Serial.print ("سرعت شما بود:")؛ Serial.println (intDelay) ؛ bolPlay = false؛ }

این توسط توابع checkBottom یا buttonsGame فعال می شود و با تنظیم غلط بودن bolPlay پایان بازی را آغاز می کند.

همچنین پیامی را برای نمایش امتیاز کاربران در مانیتور سریال چاپ می کند و کاشی های سرعت در میلی ثانیه اضافه می شوند.

مرحله 13: تابع ورودی

کد زیر را در برنامه خود کپی کنید.

void input () {intEnter = digitalRead (btnEnter)؛ // read enter // کدام یک از ورودی های دیگر را بخوانید ، یا اگر هیچ کدام روی 4 تنظیم نشد (digitalRead (btn1) == HIGH) {intInput = 0؛} else {if (digitalRead (btn2) == HIGH) {intInput = 1؛} else {if (digitalRead (btn3) == HIGH) {intInput = 2؛} else {if (digitalRead (btn4) == HIGH) {intInput = 3؛} else {intInput = 4؛ }}}} // سریال ورودی های if (intEnter == 1) {Serial.println ("Enter Pressed!")؛} if (intInput! = 4) {Serial.print ("Button Press:")؛ Serial.println (intInput) ؛ } else {// اگر دکمه ای فشار داده نشود reset bolTilePressed bolTilePressed = false؛ }}

این کد با توابع buttonsGame و buttonsMenu استفاده می شود. بر اساس دکمه هایی که کاربر فشار داده است مقدار intInput را تعیین می کند ، یا اگر هیچ دکمه ای فشار داده نشود intInput را برابر 4 می کند.

اگر هیچ دکمه ای فشار داده نشود ، این همان جایی است که bolTilePressed برای عملکرد buttonsGame بازنشانی می شود.

همچنین پیامی را به مانیتور سریال چاپ می کند که دکمه روی آن فشار داده شده است.

مرحله 14: تابع BottomCheck

کد زیر را در برنامه خود کپی کنید.

void bottomCheck () {for (int i = 0؛ i <= 3؛ i ++) {// برای 4 ستون if (arrGame [15] == 1) {// اگر کاشی در قسمت پایین سریال باشد.println ("کاشی در پایین") ؛ arrGame [15] = 2 ؛ drawBoard ()؛ تأخیر (400) ؛ arrGame [15] = 1 ؛ drawBoard ()؛ تأخیر (400) ؛ arrGame [15] = 2 ؛ drawBoard ()؛ تأخیر (400) ؛ arrGame [15] = 1 ؛ drawBoard ()؛ تأخیر (400) ؛ بازی تمام شد()؛ }}}

با استفاده از یک حلقه ، این کد سطر پایین arrGame را برای کاشی های unhit (کاشی های مساوی 1) بررسی می کند ، اگر یک کاشی unhit در پایین صفحه وجود داشته باشد ، کاشی را چشمک می زند و سپس بازی را روی عملکرد فعال می کند.

مرحله 15: تابع WriteSerial

کد زیر را در برنامه خود کپی کنید

void writeSerial () {if (bolSerialBoard == true) {for (int i = 0؛ i <= 15؛ i ++) {for (int ii = 0؛ ii <= 3؛ ii ++) {Serial.print (arrGame [ii]) ؛ Serial.print ("،") ؛ } Serial.println ("")؛ }}}

این تابع بعد از آن گزینه اشکال زدایی است که می تواند در عملکرد buttonsMenu فعال شود. اگر bolSerialBoard در آن تابع روی true تنظیم شده باشد ، از طریق arrGame عبور کرده و با استفاده از یک آرایه ، کل برد را برای آزمایش در مانیتور سریال چاپ می کند.

مرحله 16: تکمیل

تکمیل!
تکمیل!

همه کد شما نباید کامل باشد و چیزی شبیه به این باشد!

/ * * نام - کاشی پیانو ؛ آردوینو * توسط - دومنیک مارولی * تاریخ - 11/ *

/ شامل کتابخانه ها

#عبارتند از

// این متغیرها گزینه هایی هستند که می توانید تغییر دهید - اعداد بالاتر = سرعت بازی بیشتر

int intGameSpeedEasy = 10؛ int intGameSpeedMedium = 25 ؛ int intGameSpeedHard = 80 ؛

// پین ها را تعریف کنید

#تعریف btnEnter A0 #تعریف btn1 15 #تعریف btn2 16 #تعریف btn3 17 #تعریف btn4 18

// ایجاد اشیاء LCD (n ، ~ ، n ،، ، ~ ، n)

LiquidCrystal lcdLeft (8 ، 9 ، 12 ، 10 ، 11 ، 13) ؛ LiquidCrystal lcdRight (2 ، 3 ، 4 ، 5 ، 6 ، 7) ؛

// تنظیم آرایه بازی

int arrGame [16] [4] = {{0، 0، 0، 0}، {0، 0، 0، 0}، {0، 0، 0، 0}، {0، 0، 0، 0}، {0، 0، 0، 0}، {0، 0، 0، 0}، {0، 0، 0، 0}، {0، 0، 0، 0}، {0، 0، 0، 0}، {0، 0، 0، 0}، {0، 0، 0، 0}، {0، 0، 0، 0}، {0، 0، 0، 0}، {0، 0، 0، 0}، {0 ، 0 ، 0 ، 0} ، {0 ، 0 ، 0 ، 0}} ؛

// متغیرهایی را برای بازی تنظیم کنید

boolean bolPlay؛ // آهنگ پخش کننده int intScore؛ // نمره بازیکن int intDiff را پیگیری می کند. // فقط یک چیز زیبایی برای گفتن اینکه بازی با چه مشکلاتی روبرو است

// متغیرهایی را برای ورودی تنظیم کنید

int intEnter ؛ // اگر کاربر دکمه enter int intInput را فشار دهد ، پیگیری می شود. // آهنگ هایی را که کاربر فشار می دهد boolean bolTilePressed را دنبال می کند. // اطمینان حاصل کنید که بازیکن به طور تصادفی دکمه 5 برابر را فشار ندهد و بازنده نشود

// متغیرهایی را برای turn تنظیم کنید

int intTick؛ // تا زمانیکه intDelay int intDelay میلیلی (در هر حلقه) شمارش می کند ؛ // زمان صبر برنامه تا نوبت بعدی در millis int intGameSpeed ؛

// حذف گزینه های اشکال زدایی

boolean bolSerialBoard؛ // when true تخته را در مانیتور سریال چاپ می کند

// راه اندازی که یکبار اجرا می شود

void setup () {Serial.begin (9600)؛ // مانیتور سریال را راه اندازی کنید // متغیرها را تنظیم کنید bolPlay = false؛ intScore = 0 ؛ intTick = 0 ؛ intDelay = 1000 ؛ intDiff = 1؛ intGameSpeed = intGameSpeedMedium؛ // شروع lcd's lcdLeft.begin (16 ، 2) ؛ lcdRight.begin (16 ، 2) ؛ }

// حلقه ای که هر 10 میلی ثانیه اجرا می شود

void loop () {input ()؛ // بررسی ورودی بازی در صورت (bolPlay == true) {if (intTick> = intDelay) {// بررسی کنید که آیا بازی باید به نوبه خود بازی کند یا همچنان منتظر بماند Serial.println ("~~~~~~~ print ") ؛ // برای نشان دادن تابلوی در حال حرکت روی // writeSerial () چاپ کنید؛ // در صورت فعال بودن گزینه ، برد را روی دکمه های سریال () بنویسید ()؛ // ورودی های بازیکن را بررسی کنید playBoard ()؛ // برد را جابجا کرده و یک کاشی جدید اضافه کنید clearLcd ()؛ // قبل از کشیدن drawBoard () LCD ها را تمیز کنید؛ // تخته را روی lcd's bottomCheck () بکشید. intTick = 0 ؛ // تنظیم مجدد intTick} else {buttonsGame ()؛ // بررسی ورودی های پخش کننده clearLcd ()؛ // قبل از کشیدن drawBoard () LCD ها را تمیز کنید؛ // برد را روی intcick lcd = intTick + intGameSpeed بکشید ؛ // افزودن به تیک}} else {clearLcd ()؛ // قبل از کشیدن عنوان () LCD ها را تمیز کنید؛ // نمایش عنوان و امتیاز info infoMenu ()؛ // خواندن ورودی پخش کننده clearBoard ()؛ // اطمینان از کل برد = 0} تاخیر (10) ؛ // آردوینو را به مدت کوتاهی به تأخیر بیاندازید}

// ال سی دی را تمیز می کند ، بنابراین هرگونه سلول بدون نام در آنجا باقی نمی ماند

void clearLcd () {for (int i = 0؛ i <= 15؛ i ++) {for (int ii = 0؛ ii <= 1؛ ii ++) {lcdLeft.setCursor (i، ii)؛ lcdLeft.write ("")؛ lcdRight.setCursor (i ، ii) ؛ lcdRight.write ("")؛ }}}

// برد را روی LCD ها می کشد

void drawBoard () {for (int i = 1؛ i <= 15؛ i ++) {// Collums 1 و 2 را در LCD سمت چپ بکشید // اگر کاشی = 0 چیزی ننویسید ، = 1 "#" بنویسید ، = 2 "@" را بنویسید lcdLeft.setCursor (i ، 1) ؛ // برای اولین ستون (دورترین سمت چپ) تنظیم کنید اگر (arrGame [0] == 1) {lcdLeft.write ("#")؛} if (arrGame [0] == 2) {lcdLeft.write ("@")؛} lcdLeft.setCursor (i، 0)؛ // ستون دوم (مرکز سمت چپ) اگر (arrGame [1] == 1) {lcdLeft.write ("#")؛} if (arrGame [1] == 2) {lcdLeft.write ("@")؛} lcdRight.setCursor (i، 1)؛ // ستون سوم (مرکز راست) if (arrGame [2] == 1) {lcdRight.write ("#")؛} if (arrGame [2] == 2) {lcdRight.write ("@")؛} lcdRight.setCursor (i، 0)؛ // ستون چهارم (دورترین سمت راست) را تنظیم کنید اگر (arrGame [3] == 1) {lcdRight.write ("#")؛} if (arrGame [3] == 2) {lcdRight.نوشتن("@")؛} } }

// تخته را پایین می آورد و یک مقدار تصادفی را به عنوان یک کاشی قرار می دهد

void playBoard () {for (int i = 0؛ i <= 3؛ i ++) {arrGame [0] = 0؛} // پاک کردن ردیف بالا arrGame [0] [تصادفی (0 ، 4)] = 1 // یک نقطه تصادفی در ردیف بالا تنظیم کنید تا کاشی برای (int i = 15؛ i> = 1؛ i-) {// کار از پایین تخته به بالا برای (int ii = 0؛ ii <= 3 ؛ ii ++) {// برای هر برخورد arrGame [ii] = arrGame [i - 1] [ii] ؛ }}}

// کل صفحه را روی 0 تنظیم می کند و متغیرها را به بازی قبل باز می گرداند

void clearBoard () {// بازنشانی مقادیر تیک و تأخیر intTick = 0؛ intDelay = 1000 ؛ // از صفحه عبور کنید و همه چیز را برای 0 تنظیم کنید (int i = 0؛ i <= 15؛ i ++) {برای (int ii = 0؛ ii <= 3؛ ii ++) {arrGame [ii] = 0 ؛ }}}

// منوی اصلی را روی LCD ها نمایش می دهد

void title () {// نوشتن عنوان روی LCD و فاصله برای نمره lcdRight.setCursor (0 ، 0) ؛ lcdRight.write ("کاشی پیانو") ؛ lcdRight.setCursor (0 ، 1) ؛ lcdRight.write ("امتیاز:")؛ // تبدیل نمره به string strScore [3] ؛ sprintf (strScore ، "٪ d" ، intScore) ؛ // نمایش نمره روی LCD lcdRight.write (strScore) ؛ // diffctuly lcdRight.setCursor (10 ، 1) را اضافه کنید ؛ if (intDiff == 0) {lcdRight.write ("آسان") ؛ } if (intDiff == 1) {lcdRight.write ("متوسط")؛ } if (intDiff == 2) {lcdRight.write ("سخت")؛ } // کمی دستورالعمل lcdLeft.setCursor (0 ، 0) را فشار دهید ؛ lcdLeft.write ("Enter را فشار دهید") ؛ lcdLeft.setCursor (0 ، 1) ؛ lcdLeft.write ("برای شروع!") ؛ }

// دکمه ها را بررسی می کند و در حین خارج از بازی برای آنها چه باید کرد

void buttonsMenu () {// وقتی enter فشرده می شود بازی را شروع کرده و مقدار امتیاز را در صورت بازنشانی (intEnter == 1) {bolPlay = true؛ intScore = 0 ؛ playBoard ()؛ drawBoard ()؛ } // هنگامی که دکمه 3 فشار داده می شود گزینه اشکال زدایی چاپ صفحه را به صورت سریال اگر (intInput == 3) {if (bolSerialBoard == false) {Serial.println ("Serial Board Active") روشن کنید. bolSerialBoard = true؛ } else {Serial.println ("Serial Board Disabled")؛ bolSerialBoard = false؛ }} // سرعت بازی را بر روی دشواری آسان تنظیم کنید اگر (intInput == 0) {Serial.print ("بازی روی آسان تنظیم شد" () ؛ Serial.print (intGameSpeedEasy) ؛ Serial.println ("ms acceleration)") ؛ intDiff = 0؛ intGameSpeed = intGameSpeedEasy؛ } // سرعت بازی را بر روی مشکل متوسط تنظیم کنید (intInput == 1) {Serial.print ("بازی روی متوسط (") تنظیم شده است ؛ Serial.print (intGameSpeedMedium) ؛ Serial.println ("ms acceleration)") ؛ intDiff = 1؛ intGameSpeed = intGameSpeedMedium؛ } // سرعت بازی را روی سختی سخت تنظیم کنید (intInput == 2) {Serial.print ("بازی روی سخت (") ؛ Serial.print (intGameSpeedHard) ؛ Serial.println ("ms acceleration)") ؛ intDiff = 2 ؛ intGameSpeed = intGameSpeedHard؛ }}

// دکمه ها را بررسی می کند و در حین بازی برای آنها چه باید کرد

void buttonsGame () {if (intInput! = 4) {// اگر دکمه ای فشار داده شود اگر (bolTilePressed == false) {// فقط در صورتی که bolTilePressed اقدام ماشه ای غلط برای بررسی یک دکمه باشد bolTilePressed = true؛ // سپس bolTilePressed را روی true تنظیم کنید تا مطمئن شوید که دوباره به صورت تصادفی int intowLestTile = 0 فعال نشده است. // برای تنظیم کاشی با کمترین کاشی int intCheckedTile = 15؛ // برای پیگیری اینکه کدام کاشی ها در حین (intLowestTile == 0) {// تا زمانی که روی هیچ چیزی تنظیم نشده باشد کاشی ها را بررسی کنید (int i = 0؛ i 100) {// تا زمانی که int تاخیر کمتر از 100 intDelay = intDelay - 20 نیست؛ // یک مقدار از آن بگیرید}} else {Serial.println ("دکمه اشتباه فشار داده شده است")؛ بازی تمام شد()؛ // در غیر این صورت بازی بیش از}}}}}

void gameOver () {

Serial.println ("بازی تمام شد!")؛ Serial.print ("نمره شما بود:")؛ Serial.println (intScore) ؛ Serial.print ("سرعت شما بود:")؛ Serial.println (intDelay) ؛ bolPlay = false؛ }

// ورودی بازیکن را بررسی می کند

void input () {intEnter = digitalRead (btnEnter)؛ // read enter // کدام یک از ورودی های دیگر را بخوانید ، یا اگر هیچ کدام روی 4 تنظیم نشد (digitalRead (btn1) == HIGH) {intInput = 0؛} else {if (digitalRead (btn2) == HIGH) {intInput = 1؛} else {if (digitalRead (btn3) == HIGH) {intInput = 2؛} else {if (digitalRead (btn4) == HIGH) {intInput = 3؛} else {intInput = 4؛ }}}} // سریال ورودی های if (intEnter == 1) {Serial.println ("Enter Pressed!")؛} if (intInput! = 4) {Serial.print ("Button Press:")؛ Serial.println (intInput) ؛ } else {// اگر دکمه ای فشار داده نشود reset bolTilePressed bolTilePressed = false؛ }}

// پایین برد را برای خرابی بررسی می کند

void bottomCheck () {for (int i = 0؛ i <= 3؛ i ++) {// برای 4 ستون if (arrGame [15] == 1) {// اگر کاشی در قسمت پایین سریال باشد.println ("کاشی در پایین") ؛ arrGame [15] = 2 ؛ drawBoard ()؛ تأخیر (400) ؛ arrGame [15] = 1 ؛ drawBoard ()؛ تأخیر (400) ؛ arrGame [15] = 2 ؛ drawBoard ()؛ تأخیر (400) ؛ arrGame [15] = 1 ؛ drawBoard ()؛ تأخیر (400) ؛ بازی تمام شد()؛ }}}

در صورت صحت bolSerialBoard ، برد را در مانیتور سریال چاپ می کند

void writeSerial () {if (bolSerialBoard == true) {for (int i = 0؛ i <= 15؛ i ++) {for (int ii = 0؛ ii <= 3؛ ii ++) {Serial.print (arrGame [ii]) ؛ Serial.print ("،") ؛ } Serial.println ("")؛ }}}

هنگامی که تمام کد وارد شد ، در arduino خود بارگذاری کنید و لذت ببرید!

توصیه شده: