Mundarija:

Arduino - pianino plitalari: 16 qadam (rasmlar bilan)
Arduino - pianino plitalari: 16 qadam (rasmlar bilan)

Video: Arduino - pianino plitalari: 16 qadam (rasmlar bilan)

Video: Arduino - pianino plitalari: 16 qadam (rasmlar bilan)
Video: Titanik jumboq: qanday qilib ular aysbergni e'tiborsiz qoldirishlari mumkin?! Eng batafsil hikoya! 2024, Iyul
Anonim
Arduino - pianino plitalari
Arduino - pianino plitalari

Assalomu alaykum, internet odamlari, bu arduino uno r3 -dagi mobil o'yinni qanday qilib aniq qilib olib tashlash mumkinligi haqida.

Boshlash uchun sizga quyidagi qismlar kerak bo'ladi! 1x Arduino Uno r3 (42 dollar)

2x LCD klaviatura qalqoni (har biri 19 dollar)

5x tugmalar

5x 220Ω qarshilik

28x simlar

Yaxshi, hamma qismlar tayyor bo'lgach, boshlash vaqti keldi!

1 -qadam: simlarni ulash

Ulanish
Ulanish
Ulanish
Ulanish
Ulanish
Ulanish

Diagrammada ko'rsatilgandek, arduino va do'stlaringizni ulashdan boshlang.

Tugmalar to'g'ri yo'nalishda bog'langanligiga ishonch hosil qiling, A0-4 tugmachalari relslarning pastki tomonida, yoki arduino tugmachalarni faqat bosish o'rniga doimiy ushlab turiladi deb o'ylaydi.

2 -qadam: Deklaratsiya bayonotlari

Bu erdagi barcha kodlar sizning bo'sh sozlamangiz va bo'shligingizdan oldin bo'lishi kerak, chunki bu o'zgaruvchilar va ob'ektlarning barchasi biz o'rnatadigan bir qancha funktsiyalarda ishlatiladi.

Quyidagilarni qo'yishdan boshlang:

#qo'shing

Sizning kodingizning yuqori qismida, bu arduino -ga "LiquidCrystal.h" kutubxonasidan va uning bir qismi bo'lgan funktsiyalardan foydalanishni aytadi.

Keyingi qadam, bu kodni #include ostiga qo'yish orqali tugmalarimiz uchun ishlatadigan pinlarni aniqlash:

#tashrif btnA0 kiriting #btn1 aniqlang 15 #btn2 aniqlang 16 #btn3 aniqlang 17 #btn4 aniqlang 18

Kodni o'qishni osonlashtirish yoki kerak bo'lganda o'zgartirish uchun btnEnter va btn1 dan btn 4 gacha bo'lgan shartlarni belgilaymiz. Bu shuni anglatadiki, btn1 yozilganda, arduino biz 15 -tugmani anglatishini bilib oladi, garchi biz portlarni 15, 16, 17 va 18 deb atasak ham, ular arduino -da A1 A2 A3 va A4 deb yozilgan. ular analog kirish uchun maxsus ishlatiladigan portlar, lekin biz ularni faqat raqamli kirish uchun ishlatamiz.

Keyin biz suyuq kristalli displeylarni boshqaradigan moslamalarni yaratmoqchimiz. Buning uchun ushbu kodni ta'riflarimiz ostiga qo'ying

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

Bu nima qilayotgani arduinoga lcdLeft yoki lcdRight -ga qo'ng'iroq qilganimizda biz LiquidCrystal ob'ektiga ishora qilayotganimizni aytadi. Qavslar ichidagi raqamlar arduinoga biz ularning vazifalarini ishlatganda LCD displeyga xabar yuborish uchun qaysi portlardan foydalanishi kerakligini aytadi.

Endi biz ob'ekt deklaratsiyalari ostiga kodning keyingi bitini qo'yish orqali o'zgaruvchilarni e'lon qilishimiz kerak:

// bu o'zgaruvchilar - siz o'zgartirishingiz mumkin bo'lgan variantlar - yuqori raqamlar = intGameSpeedEasy = 10 tez o'yin tezligi; int intGameSpeedMedium = 25; int intGameSpeedHard = 80;

// gameboolean bolPlay uchun o'zgaruvchilarni o'rnatish; // int intScore o'yinchi bo'lsa, izlar; // o'yinchining int intiff reytingini kuzatadi; // o'yinning qanday qiyinligini aytish uchun estetik narsa // int intEnter kiritish uchun o'zgaruvchilarni sozlash; // foydalanuvchi int intInput kiritish tugmasini bosganligini kuzatadi; // foydalanuvchining boolean bolTilePressed tugmachalarini bosishini izlar; // o'yinchi tasodifan 5x tugmachani bosmasligiga ishonch hosil qiling // int intTickni aylantirish uchun o'zgaruvchilarni o'rnating; // intDelay int intDelay bo'lgunga qadar millimetrni hisoblaydi (bir tsikl uchun); // dastur millis int intGameSpeed -da keyingi burilishni kutadigan vaqt; // abit disk raskadrovka variantlari boolean bolSerialBoard; // qachon taxtani ketma -ket monitorda chop etadi

Ma'lumot turini, so'ngra o'zgaruvchining nomini aytib, o'zgaruvchini e'lon qilamiz. int thisIsAnInteger

BolSerialBoard va bolPlay kabi mantiqiy o'zgaruvchilar faqat ikkita qiymatdan biriga ega bo'lishi mumkin: haqiqiy yoki noto'g'ri.

IntScore va intInput kabi butun sonlar o'zgaruvchisi (int) 1, 5 yoki 100 kabi butun sonlarni qiymat sifatida qabul qilishi mumkin.

Biz foydalanmaydigan ba'zi boshqa ma'lumot turlari - bu matn qismi bo'lgan satr va o'nlik raqamli float.

Bu erda o'zgaruvchilarning har biri dastur tomonidan har xil joylarda ishlatiladi, bu erda ularning har biri nima qilayotgani haqida qisqacha ma'lumot

bolPlay dasturga menyu ko'rsatilishi yoki haqiqiy o'yin ishlayotganligini aytadi.

intScore o'yinchining plitkalarga urgan vaqtidagi natijalarini kuzatib boradi, intDiff asosiy menyuda dasturga LCD displeyda qanday matnni chop etish kerakligini aytib berish uchun ishlatiladi.

intEnter dasturga kirish tugmasi (eng chapda) bosilganda xabar berish uchun ishlatiladi, intInput dasturga qolgan 4 tugmachaning qaysi biri bosilganligini aytib berish uchun ishlatiladi.

bolTilePressed dastur faqat tugma bosilganda o'qiladi va ushlab turilmaydi.

intGameSpeed, intGameSpeedEasy, intGameSpeedMedium va intGameSpeedHard o'yin qaysi tezlik tanlanganiga qarab tezlashishini nazorat qilish uchun ishlatiladi.

intTick va intDelay dastur har safar aylanayotganda, taxtaning harakatlanishini to'xtatish uchun ishlatiladi.

bolSerialBoard - bu dasturni sinov maqsadlari uchun taxtani arduino seriyali monitoriga bir qator raqamlar sifatida yuborishga imkon berish uchun ishlatiladi.

Nihoyat, bizning taxtamizni ushbu kod yordamida massiv sifatida e'lon qilish vaqti keldi:

// arrayint arrGame o'yinini sozlash [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}};

Massiv - bu matritsadir, uni istalgan nuqtani matematikaga chaqirish yoki o'zgartirish mumkin.

Sizning kodingiz endi shunday bo'lishi kerak;

// kutubxonalarni o'z ichiga oladi#o'z ichiga oladi

// bu o'zgaruvchilar siz o'zgartirishingiz mumkin bo'lgan variantlar - yuqori raqamlar = tezroq o'yin tezligi

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

// Pimlarni aniqlang

A0 kiriting

// LCD obyektlarini yaratish (n, ~, n, ~, ~, n)

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

// o'yinlar qatorini o'rnatish

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}};

// o'yin uchun o'zgaruvchilarni o'rnating

boolean bolPlay; // int intScore o'yinchi bo'lsa, izlar; // o'yinchining int intiff reytingini kuzatadi; // o'yin qanday qiyinchilikda ekanligini aytish uchun estetik narsa

// kiritish uchun o'zgaruvchilarni o'rnating

int intEnter; // foydalanuvchi int intInput kiritish tugmasini bosganligini kuzatadi; // foydalanuvchining boolean bolTilePressed tugmachalarini bosishini izlar; // o'yinchi tasodifan 5x tugmachasini bosmasligiga ishonch hosil qiling

// burilish uchun o'zgaruvchilarni o'rnating

int intTick; // intDelay int intDelay bo'lmaguncha millimetrni (bir tsikl uchun) hisoblaydi; // dastur millis int intGameSpeed -da keyingi burilishni kutadigan vaqt;

// disk raskadrovka variantlari

boolean bolSerialBoard; // qachon taxtani ketma -ket monitorda chop etadi

3 -qadam: O'rnatish funktsiyasi

O'rnatish tsikli - bu arduino tomonidan boshlanganda faqat bir marta o'qiladigan funksiya.

O'rnatish tsiklida biz bir nechta o'zgaruvchilarning qiymatlarini belgilaymiz, chunki ularni e'lon qilishda qiymatni qo'yish o'rniga biz buni bu erda qilamiz.

Ushbu kodni Void Setup -ga kiritishni boshlang.

bolPlay = noto'g'ri; intScore = 0; intTick = 0; intDelay = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium;

Har bir satr shunchaki o'zgaruvchini qiymatga o'rnatadi.

O'yin o'ynashni boshlamaslik uchun bolPlay "false" ga o'rnatiladi.

intScore 0 ga o'rnatilgan, chunki tabiiyki sizning balingiz 0 dan boshlanadi.

intTick 0 dan boshlanadi, chunki dastur hozircha hech narsani hisoblamaydi.

intDelay 1000 ga o'rnatiladi, chunki plitkalar shu tezlikda boshlanadi.

intDiff - bu oddiy narsa, shuning uchun dastur o'yin qiyinligi uchun nima yozishni biladi.

intGameSpeed intGameSpeedMedium nima bo'lishidan qat'i nazar o'rnatiladi, ya'ni u o'rtacha qiyinchilik darajasida o'rnatiladi.

Keyin bu kodni siz kiritgan kod ostidagi Void Setup -ga qo'ying.

lcdLeft.begin (16, 2); lcdRight.begin (16, 2);

Serial.begin (9600);

Bu arduino -ga ketma -ket monitor orqali kompyuter bilan muloqot qilishni boshlashini aytadi (arduino IDE -ning yuqori o'ng burchagidagi tugmani bosish orqali ko'rinadi).

Sizning bo'sh joy sozlamangiz endi shunga o'xshash bo'lishi kerak!

void setup () {Serial.begin (9600); // ketma -ket monitorni ishga tushiring // o'zgaruvchilarni o'rnating bolPlay = false; intScore = 0; intTick = 0; intDelay = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium; // lcd's lcdLeft.begin boshlang (16, 2); lcdRight.begin (16, 2); }

4 -qadam: Loop funktsiyasi

Loop funktsiyasi arduino tomonidan har bir iteratsiya tomonidan boshqariladi.

Quyidagi kodni Void Loop -ga nusxalash.

void loop () {input (); // if (bolPlay == true) if if (bolPlay == true) {if (intTick> = intDelay) {// o'yinning burilish yoki yo'qligini tekshirish uchun Serial.println ("~~~~~~~ ~~ "); // taxtada harakatlanishini bildirish uchun chop etish // writeSerial (); // agar parametr yoqilgan bo'lsa, taxtani ketma -ket tugmalarga yozingGame (); // pleer kirishini tekshirish playBoard (); // taxtani siljiting va yangi plitka qo'shing clearLcd (); // drawBoard () chizishdan oldin LCD displeylarni tozalang; // doskani lcd tubiga tortingCheck (); intTick = 0; // reset intTick} else {{buttonGame (); // pleer kirishini tekshiring clearLcd (); // drawBoard () chizishdan oldin LCD displeylarni tozalang; // doskani lcd's intTick = intTick + intGameSpeed -ga torting; // belgilashga qo'shish}} else {clearLcd (); // sarlavha chizishdan oldin LCD displeylarni tozalang (); // sarlavha va ballar haqida ma'lumot tugmachalarini ko'rsatishMenu (); // pleer kirishini o'qish clearBoard (); // butun taxtani ta'minlash = 0} kechikish (10); // arduinoni qisqa vaqtga kechiktiring}

qachon bolPlay haqiqatga teng bo'lsa, demak, o'yin o'ynayapti va o'yin vaqtidagi barcha kodlar ishga tushirilishi kerak, lekin biz faqat intTick bizning intDelaydan kattaroq bo'lganda, taxtaga yangi plitka qo'shib, pastga tushishini xohlaymiz, aks holda biz hali ham foydalanuvchiga tugmachani bosish va intTick tezligini oshirishga ruxsat berishni xohlaymiz.

Ushbu kodning aksariyati biz hali bajarmaydigan funktsiyalarni ishlatadi va biz ularni keyingi bosqichlarda bajaramiz. Bu funktsiyalarning maqsadi quyidagicha.

Kirish foydalanuvchi qaysi tugmachalarni bosganini o'qiydi.

buttonGame menyuda emas, o'yin paytida tugmalar nima qilishini boshqaradi

playBoard taxtaga yangi plitka qo'shadi va keyin taxtadagi hamma narsani bitta bo'shliqqa siljitadi

clearLCD LCD -larni tozalaydi, shunda plitkalar ortida hech qanday arvoh qolmaydi

drawBoard arrGame orqali o'tadi va uni LCD displeyda chop etadi

clearBoard o'yin o'tkazilmaganda arrGame -ni tozalaydi

bottomCheck, arrGame ning pastki qismini muvaffaqiyatsizlikka uchragan holatini tekshiradi

sarlavha o'yin menyusida o'yin sarlavhasi va ballar haqidagi ma'lumotlarni ko'rsatadi

tugmachalari menyusi foydalanuvchining kiritgan menyusida nima qilishini boshqaradi.

gameOver - bu boshqa funktsiya, lekin bu erda chaqirilmagan, lekin pastki qismda chaqirilganidek Chex va tugmalar O'yin funktsiyalari.

5 -qadam: ClearLCD funktsiyasi

funktsiyani yaratish uchun biz buni kodga qo'shish bilan boshlaymiz

void functionName () {

}

"functionName" har qanday bo'lishi mumkin, agar u mavjud bo'lmasa.

Ushbu kodni dasturingizga nusxalash:

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 displeylaridagi har bir nuqtadan o'tish va bo'sh joy yozish uchun bu 2 ta hisoblangan ko'chadan foydalanib, butun qator bo'ylab o'tadi.

Hech narsaga qaytarilmasdan, LCD displeylari avval yozilgan narsalarni saqlaydi

6 -qadam: DrawBoard funktsiyasi

ushbu kodni dasturingizga nusxalash

void drawBoard () {for (int i = 1; i <= 15; i ++) {// chap LCD displeyda 1 va 2 raqamlarni chizish // agar plitka = 0 hech narsa yozmasa, = 1 "#" yozsa, = 2 "@" lcdLeft.setCursor (i, 1) yozing; // agar birinchi qatorga o'rnatilgan bo'lsa (eng chapda) if (arrGame [0] == 1) {lcdLeft.write ("#");} if (arrGame [0] == 2) {lcdLeft.write ("@");} lcdLeft.setCursor (i, 0); // ikkinchi qatorga (markazda chapda), agar (arrGame [1] == 1) {lcdLeft.write ("#");} if (arrGame [1] == 2) {lcdLeft.write ("@");} lcdRight.setCursor (i, 1); // uchinchi qatorga o'rnatiladi (o'ngda), agar (arrGame [2] == 1) {lcdRight.write ("#");} if (arrGame [2] == 2) {lcdRight.write ("@");} lcdRight.setCursor (i, 0); // to'rtinchi ustunni o'rnating (eng o'ngda) if (arrGame [3] == 1) {lcdRight.write ("#");} if (arrGame [3] == 2) {lcdRight.yozish ("@");}}}

Bu doskaning har bir satridan o'tish uchun pastadirdan foydalanadi, so'ngra satrdagi ustunlar 1 yoki 2 ga tengligini tekshiradi, shundan so'ng LCD displeyda xashtag bosiladi. urish, yoki urilgan kafel uchun @.

7 -qadam: PlayBoard funktsiyasi

ushbu kodni dasturingizga nusxalash.

void playBoard () {for (int i = 0; i <= 3; i ++) {arrGame [0] = 0;} // yuqori qatorni tozalash arrGame [0] [tasodifiy (0, 4)] = 1; // yuqori satrda tasodifiy nuqtani (int i = 15; i> = 1; i-) {// uchun taxtaning pastidan tepasiga (int ii = 0; ii <= 3; ii ++) {// har bir collum arrGame uchun [ii] = arrGame [i - 1] [ii]; }}}

bu kod butun yuqori qatorni 0 yoki kafelsiz qilib tozalashdan boshlanadi, so'ngra bitta tasodifiy plitani 1 va ko'rinmas katakka o'rnatadi.

Keyin teskari hisoblangan tsikldan o'tadi, 15 dan 1 gacha, satrni yuqoridagi satrga teng bo'ladigan qilib o'rnatadi, bu esa taxtani LCD displeyidan pastga siljitadi.

8 -qadam: ClearBoard funktsiyasi

ushbu kodni dasturingizga nusxalash.

void clearBoard () {// belgilashni tiklash va qiymatlarni kechiktirish intTick = 0; intDelay = 1000; // doskadan o'ting va hamma narsani 0 ga qo'ying (int i = 0; i <= 15; i ++) {uchun (int ii = 0; ii <= 3; ii ++) {arrGame [ii] = 0; }}}

Bu kod, o'yin o'tkazilmaganda, arrGame -ning 0 ga o'rnatilganligiga ishonch hosil qilish uchun yoki hech qanday kafel yo'q, qatordan o'tish uchun hisoblangan tsikllar yordamida bajariladi.

Kod shuningdek intDelay va intTick qiymatlarini tiklaydi.

9 -qadam: Sarlavha funktsiyasi

quyidagi kodni dasturingizga nusxa ko'chiring

void title () {// sarlavhani LCD -ga yozish va lcdRight.setCursor uchun bo'sh joy (0, 0); lcdRight.write ("Pianino plitalari"); lcdRight.setCursor (0, 1); lcdRight.write ("Hisob:"); // balni string strScore ga aylantirish strScore [3]; sprintf (strScore, "%d", intScore); // ballarni LCD lcdRight.write (strScore) da ko'rsatish; // diffictuly lcdRight.setCursor qo'shing (10, 1); agar (intDiff == 0) {lcdRight.write ("Oson"); } agar (intDiff == 1) {lcdRight.write ("O'rta"); } agar (intDiff == 2) {lcdRight.write ("Qattiq"); } // lcdLeft.setCursor (0, 0) ko'rsatmasini biroz bosing; lcdLeft.write ("Enter tugmasini bosing"); lcdLeft.setCursor (0, 1); lcdLeft.write ("boshlash uchun!"); }

Bu kod o'yin nomini va hisobni LCD displeylarga yozib qo'yadi, buni LCD -ga LCD.setCursor yordamida yozishni qaerdan boshlash kerakligini aytib, keyin LCD.write -ga yozish orqali amalga oshiradi.

Bu erda strScore yangi o'zgaruvchisi ham yaratiladi, u intScore -ni sprintf funktsiyasidan foydalanib mag'lubiyatga yoki ma'lumotlar turiga aylantirish uchun ishlatiladi.

intDiff bu erda ham ishlatiladi, uning qiymatlariga asoslanib, u turli xil qiyinchilik variantlarini chop etadi.

10 -qadam: ButtonsMenu funktsiyasi

dasturingizga quyidagi kodni kiriting

void buttonMenu () {// Enter bosilganda o'yinni boshlang va agar (intEnter == 1) {bolPlay = true; intScore = 0; playBoard (); drawBoard (); } // 3 tugma bosilganda taxtani ketma -ket chop etishning disk raskadrovka variantini yoqing, agar (intInput == 3) {if (bolSerialBoard == false) {Serial.println ("Serial Board Active"); bolSerialBoard = to'g'ri; } else {Serial.println ("Seriya taxtasi o'chirilgan"); bolSerialBoard = noto'g'ri; }} // o'yin tezligini osonlikcha qiyinchilik bilan belgilang, agar (intInput == 0) {Serial.print ("O'yin oson" ()); Serial.print (intGameSpeedEasy); Serial.println ("ms tezlashtirish)"); intDiff = 0; intGameSpeed = intGameSpeedEasy; } // o'yin tezligini o'rtacha qiyinchilik darajasiga o'rnating, agar (intInput == 1) {Serial.print ("O'yin o'rta darajaga o'rnatilsa ("); Serial.print (intGameSpeedMedium); Serial.println ("ms tezlashtirish)"); intDiff = 1; intGameSpeed = intGameSpeedMedium; } // o'yin tezligini qiyin qiyinchiliklarga o'rnating, agar (intInput == 2) {Serial.print ("O'yin qattiq" ("); Serial.print (intGameSpeedHard); Serial.println (" ms tezlashtirish) "); intDiff = 2; intGameSpeed = intGameSpeedHard; }}

bu kod faqat bolPlay bo'sh Loopda yolg'onga teng bo'lganda ishlaydi

agar intEnter 1 ga o'rnatilgan bo'lsa, bu kirish tugmasi bosilganligini anglatadi, agar u bosilsa, dastur bolPlay -ni rost qilib qo'yadi va o'yin boshlanadi.

Keyin dastur intInput nimaga tengligini o'qiydi. agar u 0 ga teng bo'lsa, chapdan birinchi tugma bosiladi, o'ngga 3 gacha ko'tariladi. Agar intInput 4 ga teng bo'lsa, hech qanday tugma bosilmaydi.

Agar 0-2 tugmachalari bosilsa, o'yin qiyinchilikni o'zgartiradi, shuningdek o'yin tezligi qiymatini o'zgartiradi, ya'ni u tezroq tezlashadi.

agar 3 -tugma bosilsa, o'yin disk raskadrovka rejimini faollashtiradi yoki o'chiradi, bunda dasturdagi muammolarni topishga yordam berish uchun butun taxta ketma -ket monitorda chop etiladi.

11 -qadam: ButtonsGame funktsiyasi

quyidagi kodni dasturingizga nusxa ko'chiring

void tugmalariGame () {if (intInput! = 4) {// agar tugma bosilsa if (bolTilePressed == false) {// agar bolTilePressed noto'g'ri bo'lsa, tugmani tekshirish uchun bolTilePressed = rost tugmasini bosing; // keyin yana tasodifan tetiklanmasligiga ishonch hosil qilish uchun bolTilePressed ni rost qilib qo'ying int intLowestTile = 0; // eng past plitkali plitaga o'rnatiladi int intCheckedTile = 15; // (intLowestTile == 0) {// hech narsa belgilanmagan bo'lsa, plitalar tekshirilganligini kuzatish uchun (int i = 0; i 100) {// kechikish 100 dan past emas intDelay = intDelay - 20; // undan qiymat oling}} else {Serial.println ("Noto'g'ri tugma bosildi"); O'yin tamom(); // aks holda o'yin tugadi}}}}}

Kod faqat bolPlay bo'sh Loop -da haqiqiyga teng bo'lganda ishlaydi.

Tugmalar menyusi kabi intInput qiymatiga asoslanib, o'yinchi plitka urganmi yoki yo'qmi, tekshiradi.

Buni arrGame orqali pastdan yuqoriga o'tish orqali, pastadir pastdagi chiziq qaysi satr eng past ekanligini ko'radi. Keyin tugma bosilgan mos keladigan satrdagi nuqta ko'rilmagan plitka yoki yo'qligini tekshiradi, agar ko'rsatilmagan bo'lsa, u 1 o'rniga 2 ga teng bo'ladi, ya'ni u @sifatida ko'rsatiladi, aks holda bu o'yinOverni ishga tushiradi. biz hali yaratmaydigan vazifa.

Bu funksiya bolTilePressed o'zgaruvchisini tugma bosilganda rost, tugma bosilmaganda esa yolg'on qilib o'rnatadi. Bu foydalanuvchining o'yinni tasodifan yo'qotmasligini ta'minlash uchun, chunki dastur tugmachani bosib turganda uni bir necha marta bosgan deb o'ylardi.

12 -qadam: GameOver funktsiyasi

Quyidagi kodni dasturingizga nusxa ko'chiring

void gameOver () {Serial.println ("O'yin tugadi!"); Serial.print ("Sizning balingiz:"); Serial.println (intScore); Serial.print ("Sizning tezligingiz:"); Serial.println (intDelay); bolPlay = noto'g'ri; }

Bu checkBottom yoki buttonGame funktsiyalari tomonidan chaqiriladi va bolPlay -ni noto'g'ri deb belgilash orqali o'yinning oxiriga olib keladi.

Shuningdek, u foydalanuvchilarning reytingi va milisaniyalarda tezlik plitalari qo'shilganligi haqidagi xabarni ketma -ket monitorga chiqaradi.

13 -qadam: kirish funktsiyasi

Quyidagi kodni dasturingizga nusxa ko'chiring.

void input () {intEnter = digitalRead (btnEnter); // o'qishni kiriting // boshqa kirishlar qaysi birini o'qiydi yoki hech kim 4 ga o'rnatilmagan bo'lsa (digitalRead (btn1) == HIGH) {intInput = 0;} else {if (digitalRead (btn2) == HIGH) {intInput = 1;} boshqa {if (digitalRead (btn3) == HIGH) {intInput = 2;} else {if (digitalRead (btn4) == HIGH) {intInput = 3;} boshqa {intInput = 4; }}}} // kirishni ketma -ket chop eting (intEnter == 1) {Serial.println ("Enter Pressed!");} if (intInput! = 4) {Serial.print ("Button Press:"); Serial.println (intInput); } else {// agar biror tugma bosilmasa reset bolTilePressed bolTilePressed = false; }}

Bu kod tugmaGame va buttonMenu funktsiyalari bilan ishlatiladi. foydalanuvchi bosgan tugmalar asosida intInput qiymatini belgilaydi, yoki tugma bosilmasa intInput -ni 4 ga o'rnatadi.

Hech qanday tugma bosilmasa, bu erda bolTilePressed tugmalari O'yin funktsiyasi uchun qayta o'rnatiladi.

Bundan tashqari, ketma -ket monitorga qaysi tugma bosilganligi haqida xabar chop etiladi.

14 -qadam: BottomCheck funktsiyasi

quyidagi kodni dasturingizga nusxa ko'chiring.

void bottomCheck () {for (int i = 0; i <= 3; i ++) {// 4 collumns uchun if (arrGame [15] == 1) {// agar plitka pastki qismda bo'lsa.println ("Plitka pastda"); arrGame [15] = 2; drawBoard (); kechikish (400); arrGame [15] = 1; drawBoard (); kechikish (400); arrGame [15] = 2; drawBoard (); kechikish (400); arrGame [15] = 1; drawBoard (); kechikish (400); O'yin tamom(); }}}

pastadir yordamida bu kod arrGame -ning pastki qatorini har qanday ko'rinmaydigan plitalar uchun tekshiradi (plitalar 1 ga teng), agar ekranning pastki qismida ko'rsatilmagan plitka bo'lsa, u plitkani yonib o'chiradi va keyin o'yin funktsiyasini ishga tushiradi.

15 -qadam: WriteSerial funktsiyasi

quyidagi kodni dasturingizga nusxa ko'chiring

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 (""); }}}

Bu tugmalar menyusida yoqilishi mumkin bo'lgan disk raskadrovka opsiyasi. Agar bolSerialBoard bu funktsiyani rost qilib qo'ygan bo'lsa, u arrGame orqali o'tadi va massiv yordamida tekshirish uchun butun taxtani ketma -ket monitorga chop etadi.

16 -qadam: tugatish

Tugatish!
Tugatish!

Sizning kodingiz to'liq bo'lmasligi va shunga o'xshash bo'lishi kerak!

/ * * Ism - pianino plitalari; Arduino * By - Domenik Marulli * Sana - 11/ *

/ kutubxonalarni o'z ichiga oladi

#qo'shing

// bu o'zgaruvchilar siz o'zgartirishingiz mumkin bo'lgan variantlar - yuqori raqamlar = tezroq o'yin tezligi

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

// Pimlarni aniqlang

A0 kiriting

// LCD obyektlarini yaratish (n, ~, n, ~, ~, n)

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

// o'yinlar qatorini o'rnatish

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}};

// o'yin uchun o'zgaruvchilarni o'rnating

boolean bolPlay; // int intScore o'yinchi bo'lsa, izlar; // o'yinchining int intiff reytingini kuzatadi; // o'yin qanday qiyinchilikda ekanligini aytish uchun estetik narsa

// kiritish uchun o'zgaruvchilarni o'rnating

int intEnter; // foydalanuvchi int intInput kiritish tugmasini bosganligini kuzatadi; // foydalanuvchining boolean bolTilePressed tugmachalarini bosishini izlar; // o'yinchi tasodifan 5x tugmachasini bosmasligiga ishonch hosil qiling

// burilish uchun o'zgaruvchilarni o'rnating

int intTick; // intDelay int intDelay bo'lmaguncha millimetrni (bir tsikl uchun) hisoblaydi; // dastur millis int intGameSpeed -da keyingi burilishni kutadigan vaqt;

// disk raskadrovka variantlari

boolean bolSerialBoard; // qachon taxtani ketma -ket monitorda chop etadi

// bir marta ishlaydigan sozlamalar

void setup () {Serial.begin (9600); // ketma -ket monitorni ishga tushiring // o'zgaruvchilarni o'rnating bolPlay = false; intScore = 0; intTick = 0; intDelay = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium; // lcd's lcdLeft.begin boshlang (16, 2); lcdRight.begin (16, 2); }

// har 10 millisekundda bajariladigan tsikl

void loop () {input (); // if (bolPlay == true) if if (bolPlay == true) {if (intTick> = intDelay) {// o'yinning burilish yoki yo'qligini tekshirish uchun Serial.println ("~~~~~~~ ~~ "); // taxtada harakatlanishini bildirish uchun chop etish // writeSerial (); // agar parametr yoqilgan bo'lsa, taxtani ketma -ket tugmalarga yozingGame (); // pleer kirishini tekshirish playBoard (); // taxtani siljiting va yangi plitka qo'shing clearLcd (); // drawBoard () chizishdan oldin LCD displeylarni tozalang; // doskani lcd tubiga tortingCheck (); intTick = 0; // reset intTick} else {{buttonGame (); // pleer kirishini tekshiring clearLcd (); // drawBoard () chizishdan oldin LCD displeylarni tozalang; // doskani lcd's intTick = intTick + intGameSpeed -ga torting; // belgilashga qo'shish}} else {clearLcd (); // sarlavha chizishdan oldin LCD displeylarni tozalang (); // sarlavha va ballar haqida ma'lumot tugmachalarini ko'rsatishMenu (); // pleer kirishini o'qish clearBoard (); // butun taxtani ta'minlash = 0} kechikish (10); // arduinoni qisqa vaqtga kechiktiring}

// LCD -ni tozalaydi, shuning uchun kiritilmagan hujayralar u erda qolmaydi

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 (""); }}}

// doskani lcd -ga tortadi

void drawBoard () {for (int i = 1; i <= 15; i ++) {// chap LCD displeyda 1 va 2 raqamlarni chizish // agar plitka = 0 hech narsa yozmasa, = 1 "#" yozsa, = 2 "@" lcdLeft.setCursor (i, 1) yozing; // agar birinchi qatorga o'rnatilgan bo'lsa (eng chapda) if (arrGame [0] == 1) {lcdLeft.write ("#");} if (arrGame [0] == 2) {lcdLeft.write ("@");} lcdLeft.setCursor (i, 0); // ikkinchi qatorga (markazda chapda), agar (arrGame [1] == 1) {lcdLeft.write ("#");} if (arrGame [1] == 2) {lcdLeft.write ("@");} lcdRight.setCursor (i, 1); // uchinchi qatorga o'rnatiladi (o'ngda), agar (arrGame [2] == 1) {lcdRight.write ("#");} if (arrGame [2] == 2) {lcdRight.write ("@");} lcdRight.setCursor (i, 0); // to'rtinchi ustunni o'rnating (eng o'ngda) if (arrGame [3] == 1) {lcdRight.write ("#");} if (arrGame [3] == 2) {lcdRight.yozish ("@");}}}

// taxtani pastga siljitadi va tasodifiy qiymatni plitka qilib qo'yadi

void playBoard () {for (int i = 0; i <= 3; i ++) {arrGame [0] = 0;} // yuqori qatorni tozalash arrGame [0] [tasodifiy (0, 4)] = 1; // yuqori satrda tasodifiy nuqtani (int i = 15; i> = 1; i-) {// uchun taxtaning pastidan tepasiga (int ii = 0; ii <= 3; ii ++) {// har bir collum arrGame uchun [ii] = arrGame [i - 1] [ii]; }}}

// butun taxtani 0 ga o'rnatadi va o'zgaruvchilarni oldingi o'yinga qaytaradi

void clearBoard () {// belgilashni tiklash va qiymatlarni kechiktirish intTick = 0; intDelay = 1000; // doskadan o'ting va hamma narsani 0 ga qo'ying (int i = 0; i <= 15; i ++) {uchun (int ii = 0; ii <= 3; ii ++) {arrGame [ii] = 0; }}}

// LCD displeyda Bosh menyuni ko'rsatadi

void title () {// sarlavhani LCD -ga yozish va lcdRight.setCursor uchun bo'sh joy (0, 0); lcdRight.write ("Pianino plitalari"); lcdRight.setCursor (0, 1); lcdRight.write ("Hisob:"); // balni string strScore ga aylantirish strScore [3]; sprintf (strScore, "%d", intScore); // ballarni LCD lcdRight.write (strScore) da ko'rsatish; // diffictuly lcdRight.setCursor qo'shing (10, 1); agar (intDiff == 0) {lcdRight.write ("Oson"); } agar (intDiff == 1) {lcdRight.write ("O'rta"); } agar (intDiff == 2) {lcdRight.write ("Qattiq"); } // lcdLeft.setCursor (0, 0) ko'rsatmasini biroz bosing; lcdLeft.write ("Enter tugmasini bosing"); lcdLeft.setCursor (0, 1); lcdLeft.write ("boshlash uchun!"); }

// tugmalarni tekshiradi va o'yindan tashqarida ular uchun nima qilish kerak

void buttonMenu () {// Enter bosilganda o'yinni boshlang va agar (intEnter == 1) {bolPlay = true; intScore = 0; playBoard (); drawBoard (); } // 3 tugma bosilganda taxtani ketma -ket chop etishning disk raskadrovka variantini yoqing, agar (intInput == 3) {if (bolSerialBoard == false) {Serial.println ("Serial Board Active"); bolSerialBoard = to'g'ri; } else {Serial.println ("Seriya taxtasi o'chirilgan"); bolSerialBoard = noto'g'ri; }} // o'yin tezligini osonlikcha qiyinchilik bilan belgilang, agar (intInput == 0) {Serial.print ("O'yin oson" ()); Serial.print (intGameSpeedEasy); Serial.println ("ms tezlashtirish)"); intDiff = 0; intGameSpeed = intGameSpeedEasy; } // o'yin tezligini o'rtacha qiyinchilik darajasiga o'rnating, agar (intInput == 1) {Serial.print ("O'yin o'rta darajaga o'rnatilsa ("); Serial.print (intGameSpeedMedium); Serial.println ("ms tezlashtirish)"); intDiff = 1; intGameSpeed = intGameSpeedMedium; } // o'yin tezligini qiyin qiyinchiliklarga o'rnating, agar (intInput == 2) {Serial.print ("O'yin qattiq" ("); Serial.print (intGameSpeedHard); Serial.println (" ms tezlashtirish) "); intDiff = 2; intGameSpeed = intGameSpeedHard; }}

// tugmachalarni va o'yin paytida ular uchun nima qilish kerakligini tekshiradi

bo'sh tugmalarGame () {if (intInput! = 4) {// agar tugma bosilsa, agar (bolTilePressed == false) {// faqat bolTilePressed noto'g'ri bo'lsa, tugmani tekshirish uchun bolTilePressed = rost tugmasini bosing; // keyin yana tasodifan tetiklanmasligiga ishonch hosil qilish uchun bolTilePressed ni rost qilib qo'ying int intLowestTile = 0; // eng past plitkali plitkaga o'rnatiladi int intCheckedTile = 15; // (intLowestTile == 0) {// hech narsa belgilanmagan bo'lsa, plitalar tekshirilganligini kuzatish uchun (int i = 0; i 100) {// kechikish 100 dan past emas intDelay = intDelay - 20; // undan qiymat oling}} else {Serial.println ("Noto'g'ri tugma bosildi"); O'yin tamom(); // aks holda o'yin tugadi}}}}}

void gameOver () {

Serial.println ("O'yin tugadi!"); Serial.print ("Sizning balingiz:"); Serial.println (intScore); Serial.print ("Sizning tezligingiz:"); Serial.println (intDelay); bolPlay = noto'g'ri; }

// o'yinchi kiritilishini tekshiradi

void input () {intEnter = digitalRead (btnEnter); // o'qishni kiriting // boshqa kirishlar qaysi birini o'qiydi yoki hech kim 4 ga o'rnatilmagan bo'lsa (digitalRead (btn1) == HIGH) {intInput = 0;} else {if (digitalRead (btn2) == HIGH) {intInput = 1;} boshqa {if (digitalRead (btn3) == HIGH) {intInput = 2;} else {if (digitalRead (btn4) == HIGH) {intInput = 3;} boshqa {intInput = 4; }}}} // kirishni ketma -ket chop eting (intEnter == 1) {Serial.println ("Enter Pressed!");} if (intInput! = 4) {Serial.print ("Button Press:"); Serial.println (intInput); } else {// agar biror tugma bosilmasa reset bolTilePressed bolTilePressed = false; }}

// taxtaning pastki qismini muvaffaqiyatsizlikka tekshiradi

void bottomCheck () {for (int i = 0; i <= 3; i ++) {// 4 collumns uchun if (arrGame [15] == 1) {// agar plitka pastki qismda bo'lsa.println ("Plitka pastda"); arrGame [15] = 2; drawBoard (); kechikish (400); arrGame [15] = 1; drawBoard (); kechikish (400); arrGame [15] = 2; drawBoard (); kechikish (400); arrGame [15] = 1; drawBoard (); kechikish (400); O'yin tamom(); }}}

// bolSerialBoard rost bo'lsa, taxtani ketma -ket monitorga chop etadi

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 (""); }}}

Barcha kodlar kiritilgandan so'ng, arduino -ga yuklang va zavqlaning!

Tavsiya: