Orodha ya maudhui:

Arduino - Tiles za piano: Hatua 16 (na Picha)
Arduino - Tiles za piano: Hatua 16 (na Picha)

Video: Arduino - Tiles za piano: Hatua 16 (na Picha)

Video: Arduino - Tiles za piano: Hatua 16 (na Picha)
Video: Обрешетка. Полимерная обрешетка под сайдинг - виды и преимущества. Часть 1 2024, Julai
Anonim
Arduino - Matofali ya Piano
Arduino - Matofali ya Piano

Halo watu wa mtandao, hii itakuwa juu ya jinsi ya kutengeneza kile KINACHOFAHILI sio kukatika kwa mchezo wa rununu kwenye arduino uno r3.

ili kuanza, utahitaji sehemu zote, ambazo ni kama ifuatavyo! 1x Arduino Uno r3 ($ 42)

2x LCD Keypad Shield ($ 19 kila mmoja)

Vifungo 5x

Vipinga 5x 220Ω

Waya 28x

Sawa, ukishapata sehemu zote ni wakati wa kuanza!

Hatua ya 1: Wiring

Wiring
Wiring
Wiring
Wiring
Wiring
Wiring

Anza kwa kuunganisha waya wako na marafiki wako kama inavyoonyeshwa kwenye mchoro, Hakikisha kwamba vifungo vimeunganishwa kwa njia inayofaa, na nafasi za A0-4 upande wa chini wa reli, au arduino badala yake itafikiria vifungo vinashikiliwa kila wakati badala ya vyombo vya habari tu.

Hatua ya 2: Tamko la Azimio

Nambari zote hapa zinapaswa kwenda kabla ya usanidi wako batili na kitanzi batili, hii ni kwa sababu anuwai na vitu hivi hutumiwa katika kazi kadhaa tutakazoanzisha.

Anza kwa kuweka:

# pamoja

juu ya nambari yako, hii inaambia arduino kutumia maktaba "LiquidCrystal.h" na kazi ambazo ni sehemu yake.

Hatua inayofuata ni kufafanua pini tunayotumia kwa vifungo vyetu kwa kuweka nambari hii chini ya # pamoja na:

#fafanua btnIngiza A0 # fafanua btn1 15 #fafanua btn2 16 #fafanua btn3 17 #fafanua btn4 18

Tunafafanua masharti btnEnter na btn1 hadi btn 4 ili kufanya nambari iwe rahisi kwetu kusoma, au kubadilisha ikiwa ni lazima. Inamaanisha kuwa tunapoandika btn1 arduino atajua tunamaanisha kitufe cha 15. Ingawa tunapiga bandari bandari 15, 16, 17 na 18, zimeandikwa kwenye arduino kama A1 A2 A3 na A4, hii ni kwa sababu ni bandari zinazotumiwa mahsusi kwa pembejeo za analog, ingawa tunazitumia tu kwa pembejeo za dijiti.

Ifuatayo tutaunda vitu ambavyo vitadhibiti Maonyesho ya Kioevu cha Kioevu. Ili kufanya hivyo weka nambari hii chini ya ufafanuzi wetu

LiquidCrystal lcd kushoto (8, 9, 12, 10, 11, 13); LiquidCrystal lcdHaki (2, 3, 4, 5, 6, 7);

Inachofanya hii inamwambia arduino kwamba tunapopigia simu lcdLeft au lcdRight tunataja kitu cha LiquidCrystal. Nambari zilizo kwenye mabano yaliyoambatishwa zinaelezea arduino ambayo bandari kitu kinapaswa kutumia kutuma ujumbe kwa LCD tunapotumia kazi zao.

Sasa tunahitaji kutangaza vigeuzi kwa kuweka nambari inayofuata chini ya maazimio ya kitu:

// hizi ni chaguo ambazo unaweza kubadilisha - nambari za juu = kasi ya mchezo harakaint intGameSpeedEasy = 10; int intGameSpeedMedium = 25; int intGameSpeedHard = 80;

// weka vigeuzi vya mchezo wa boolean bolPlay; // tracks ikiwa mchezaji int intcore; // hufuata alama ya mchezaji int intDiff; // kitu cha estetic tu cha kuelezea ugumu gani mchezo uko kwenye // kusanidi vigeuzi vya kuingiza int int; // kufuatilia ikiwa mtumiaji anashinikiza kitufe cha kuingia int intput; // hufuatilia vifungo gani mtumiaji anashinikiza boolean bolTilePressed; // hakikisha mchezaji hasibu kwa bahati mbaya kitufe cha 5x na kupoteza // kusanidi vigeuzi vya kugeuza int intick; // huhesabu milionea (kwa kitanzi) hadi intDelay int intDelay; // wakati programu inasubiri hadi zamu inayofuata ya milis int intGameSpeed; // abit ya chaguzi za utatuzi boolean bolSerialBoard; // wakati kweli itachapisha bodi kwenye mfuatiliaji wa serial

Tunatangaza kutofautisha kwa kusema aina ya data na kisha jina la ubadilishaji, ex. int thisIsAnInteger

Vigeu vya boolean, kama bolSerialBoard na bolPlay inaweza kuwa na moja tu ya maadili mawili, ya kweli au ya uwongo.

Kutofautisha kwa integer (int) kama IntScore na IntInput inaweza kuchukua nambari nzima kama maadili, kama 1, 5 au 100.

Aina zingine za data ambazo hatutumii hapa ni kamba, ambayo ni sehemu ya maandishi, na kuelea, ambayo ni nambari ya decimal.

Kila moja ya vigeuzi hapa hutumiwa katika sehemu tofauti na mpango, hapa kuna muhtasari wa kile kila mmoja hufanya

bolPlay inauambia mpango ikiwa menyu inapaswa kuonyeshwa au ikiwa mchezo halisi unapaswa kuendesha.

inafuatilia alama za mchezaji wakati zinapiga tiles, intDiff hutumiwa kwenye menyu kuu kuambia mpango ni maandishi gani ya kuchapisha kwenye LCD, intEnter hutumiwa kuambia mpango ikiwa kitufe cha kuingia (kushoto kabisa) kimesisitizwa, intInput hutumiwa kuambia mpango ni ipi kati ya vifungo vingine 4 imeshinikizwa.

bolTilePressed hutumiwa kuhakikisha kuwa programu inasomeka tu wakati kitufe kinabanwa na sio wakati kinashikiliwa.

IntGameSpeed, intGameSpeedEasy, intGameSpeedMedium na intGameSpeedHard hutumiwa kudhibiti jinsi mchezo unapaswa kuharakisha haraka kulingana na ugumu gani umechaguliwa.

intTick na intDelay hutumiwa kuzuia programu kuhamisha bodi kila wakati inapunguka.

bolSerialBoard hutumiwa kukuruhusu kufanya programu ipeleke bodi kwa mfuatiliaji wa serial wa arduino kama safu ya nambari kwa madhumuni ya upimaji.

Mwishowe ni wakati wa kutangaza bodi yetu kama safu tukitumia nambari hii:

// kuanzisha safu ya mchezo wa safu ya mchezo [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}};

Safu ni matrix ambayo hatua yoyote ambayo inaweza kuitwa kwa hesabu au kubadilishwa.

Nambari yako inapaswa kuonekana kama hii;

// ni pamoja na maktaba # ni pamoja na

// hizi ni chaguo ambazo unaweza kubadilisha - nambari za juu = kasi ya mchezo inaharakisha

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

// Fafanua pini

#fafanua btnIngiza A0 #fafanua btn1 15 #fafanua btn2 16 #fafanua btn3 17 #fafanua btn4 18

// tengeneza vitu vya LCD (n, ~, n, ~, ~, n)

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

// kuanzisha safu ya mchezo

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

// kuanzisha vigeuzi vya mchezo

boolean bolPlay; // tracks ikiwa mchezaji int intcore; // hufuata alama ya mchezaji int intDiff; // kitu cha estetic tu kwa kuelezea mchezo ni shida gani

// kuanzisha vigezo vya kuingiza

Ingiza; // kufuatilia ikiwa mtumiaji anashinikiza kitufe cha kuingia int intput; // hufuatilia vifungo gani mtumiaji anashinikiza boolean bolTilePressed; // hakikisha mchezaji hashinikiza kitufe cha 5x na kupoteza

// weka vigeuzi kwa zamu

int intTick; // huhesabu milionea (kwa kitanzi) hadi intDelay int intDelay; // wakati programu inasubiri hadi zamu inayofuata ya milis int intGameSpeed;

// abit ya chaguzi za utatuzi

boolean bolSerialBoard; // wakati kweli itachapisha bodi kwenye mfuatiliaji wa serial

Hatua ya 3: Kazi ya Usanidi

Kitanzi cha usanidi ni kazi iliyosomwa na arduino mara moja tu wakati inapoanza.

Katika kitanzi cha usanidi tunaweka tu maadili ya anuwai ya anuwai kwa sababu badala ya kuziweka thamani wakati wa kuzitangaza tunaifanya hapa.

Anza kwa kuweka nambari hii kwenye Usanidi wako wa Utupu.

bolPlay = uwongo; intScore = 0; Ingiza = 0; IntDelay = 1000; intDiff = 1; IntGameSpeed = intGameSpeedMedium;

Kila mstari unaweka tu kutofautisha kwa thamani.

bolPlay imewekwa kwa uwongo ili mchezo usianze kucheza.

intScore imewekwa 0, kwa sababu kawaida alama yako huanza saa 0.

intTick huanza saa 0 kwa sababu mpango hauhesabu kitu chochote kwa sasa.

intDelay imewekwa 1000 kwa sababu ndio kiwango cha vigae kuanza.

intDiff ni kitu cha kujinyima tu ili programu ijue ni nini cha kuandika kwa ugumu wa mchezo.

IntGameSpeed imewekwa kwa chochote IntGameSpeedMedium ni, maana yake imewekwa katika ugumu wa kati.

Ifuatayo weka nambari hii kwenye Usanidi wa Utupu chini ya nambari uliyoweka tu.

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

Serial. Kuanza (9600);

Hii inamwambia arduino aanze kuwasiliana na kompyuta kupitia mfuatiliaji wa serial (inayoonekana kwa kubofya kitufe kilicho juu kulia kwa IDE ya arduino).

Usanidi wako wa Utupu sasa unapaswa kuangalia kitu kama hiki!

kuanzisha batili () {Serial.begin (9600); // kuanza kufuatilia serial // kuanzisha vigezo bolPlay = uongo; intScore = 0; Ingiza = 0; IntDelay = 1000; intDiff = 1; IntGameSpeed = intGameSpeedMedium; // anza lcd lcdLeft.anza (16, 2); lcdRight.anza (16, 2); }

Hatua ya 4: Kazi ya Kitanzi

Kazi ya kitanzi inaendeshwa na arduino kila iteration ya arduino.

Nakili nambari ifuatayo kwenye Kitanzi chako cha Utupu.

kitanzi batili () {pembejeo (); // angalia kucheza pembejeo ikiwa (bolPlay == kweli) {if (intTick> = intDelay) {// angalia ikiwa mchezo unapaswa kucheza zamu au uendelee kungojea Serial.println ("~~~~~~~ ~~ "); // chapa kuashiria bodi inahamia // writeSerial (); // ikiwa chaguo imewezeshwa andika ubao kwenye vifungo vya serialGame (); // angalia pembejeo za mchezaji playBoard (); // songa bodi na ongeza tile mpya clearLcd (); // kusafisha LCD kabla ya kuchoraBodi ya kuchora (); // chora bodi kwenye chini ya LCD Angalia (); Ingiza = 0; // reset intTick} mwingine {buttonsGame (); // angalia pembejeo za mchezaji waziLcd (); // safisha LCD kabla ya kuchoraBodi ya kuchora (); // chora ubao kwenye lcd's intTick = intTick + intGameSpeed; // ongeza kwa kupe}} mwingine {clearLcd (); // kusafisha LCD kabla ya kuchora kichwa (); // kichwa cha kuonyesha na vifungo vya maelezo ya alamaMenu (); // soma pembejeo ya mchezaji waziBox (); // kuhakikisha bodi nzima = 0} kuchelewa (10); // kuchelewesha arduino kwa muda mfupi}

wakati bolPlay ni sawa na kweli inamaanisha kuwa mchezo unacheza, na nambari yote ya wakati mchezo unacheza inapaswa kuendeshwa, lakini tunataka tu bodi kuongeza tiles mpya na kushuka chini wakati intTick ni kubwa kuliko intDelay yetu, vinginevyo bado tunataka kumruhusu mtumiaji kubonyeza kitufe kugonga tile na kwa intTick kuongeza kasi.

Kanuni nyingi hutumia kazi ambazo bado hatujafanya, na tutawafanya katika hatua zifuatazo. Madhumuni ya kazi hizi ni kama ifuatavyo.

Input inasoma vifungo ambavyo mtumiaji amebonyeza.

vifungoGame hudhibiti vifungo hufanya nini wakati wa mchezo, na sio kwenye menyu

playBoard inaongeza tile mpya kwenye ubao, na kisha inasonga kila kitu kwenye ubao chini ya nafasi moja

clearLCD husafisha LCD ili kuhakikisha hakuna vizuka vilivyobaki nyuma ya vigae

DrawBoard hupitia arrGame na kuichapisha kwenye LCD

clearBoard inafuta arrGame nzima wakati mchezo hauchezwi

chiniCheki angalia chini ya arrGame kwa hali ya kutofaulu

kichwa kinaonyesha kichwa cha mchezo na habari ya alama wakati kwenye menyu

menyu ya vifungo inadhibiti pembejeo za mtumiaji wakati wa menyu.

mchezoOver ni kazi nyingine, ingawa haijaitwa hapa kama ilivyoitwa katika kazi ya chini Angalia na vifungoGame.

Hatua ya 5: Kazi ya ClearLCD

kuunda kazi tunaanza kwa kuongeza hii kwa nambari

kazi batiliName () {

}

"functionName" inaweza kuwa chochote, maadamu haipo tayari.

Nakili nambari hii kwenye programu yako:

utupu clearLcd () {for (int i = 0; i <= 15; i ++) {for (int ii = 0; ii <= 1; ii ++) {lcdLeft.setCursor (i, ii); lcdLeft.write (""); Mshale wa lcdRight.set (i, ii); andika lcdRight (""); }}}

hii hupitia safu nzima kwa kutumia vitanzi 2 vilivyohesabiwa kupitia kila nukta kwenye LCD na andika nafasi.

Bila kurejeshwa tena kuwa LCD itadumisha kila kilichoandikwa hapo awali

Hatua ya 6: Kazi ya DrawBoard

nakili nambari hii kwenye programu yako

void drawBoard () {for (int i = 1; i <= 15; i ++) {// chora collums 1 na 2 kwenye LCD ya kushoto // ikiwa tile = 0 haandika chochote, = 1 andika "#", = 2 andika "@" lcdLeft.setCursor (i, 1); // imewekwa kwa safu ya kwanza (kushoto kabisa) ikiwa (arrGame [0] == 1) {lcdLeft.write ("#");} ikiwa (arrGame [0] == 2) {lcdLeft andika ("@");} lcdLeft.setCursor (i, 0); // imewekwa kwa safu ya pili (katikati kushoto) ikiwa (arrGame [1] == 1) {lcdLeft.write ("#");} ikiwa (arrGame [1] == 2) {lcdLeft andika ("@");} lcdRight.setCursor (i, 1); // imewekwa kwa safu ya tatu (katikati kulia) ikiwa (arrGame [2] == 1) {lcdRight.write ("#");} ikiwa (arrGame [2] == 2) {lcdRight andika ("@");} lcdRight.setCursor (i, 0); // imewekwa kwa safu ya nne (kulia zaidi) ikiwa (arrGame [3] == 1) {lcdRight.write ("#");} ikiwa (arrGame [3] == 2) {lcdRight.andika("@");} } }

hii hutumia kitanzi kupitia kila safu ya bodi, kisha huangalia ikiwa safu yoyote katika safu hiyo ni sawa na 1 au 2, kwa kuzingatia hiyo basi inachapisha LCD ama hashtag, kwa tile ambayo bado haijawahi hit, au @ kwa tile ya hit.

Hatua ya 7: Kazi ya PlayBoard

nakili nambari hii kwenye programu yako.

playBoard batili () {for (int i = 0; i <= 3; i ++) {arrGame [0] = 0;} // wazi safu ya juu arrGame [0] [random (0, 4)] = = 1; // weka hatua isiyo ya kawaida kwenye safu ya juu kuwa tile kwa (int i = 15; i> = 1; i -) {// kufanya kazi kutoka chini ya ubao hadi juu kwa (int ii = 0; ii <= 3; ii ++) {// kwa kila safu ya kolamu [ii] = arrGame [i - 1] [ii]; }}}

nambari hii huanza kwa kusafisha safu nzima ya juu hadi 0, au hakuna tile, na kisha huweka tile moja ya kubahatisha kuwa 1, na unhit tile.

Halafu hupitia kitanzi kilichohesabiwa nyuma, kutoka 15 hadi 1, kuweka safu kuwa sawa na safu yoyote hapo juu ni sawa, na kuifanya bodi kushuka chini kwa LCD

Hatua ya 8: Kazi ya ClearBoard

nakili nambari hii kwenye programu yako.

batili clearBoard () {// kuweka upya kupe na uchelewesha maadili intTick = 0; IntDelay = 1000; // pitia bodi na weka kila kitu kwa 0 kwa (int i = 0; i <= 15; i ++) {kwa (int ii = 0; ii <= 3; ii ++) {arrGame [ii] = 0; }}}

Nambari hii inaendeshwa wakati mchezo hauchezeshi kuhakikisha kuwa safu nzima ya arrGame imewekwa 0, au hakuna tiles, kwa kutumia vitanzi vilivyohesabiwa kupitia safu.

Nambari pia inabadilisha maadili ya intDelay na intTick.

Hatua ya 9: Kazi ya Kichwa

nakili nambari ifuatayo kwenye programu yako

jina batili () {// andika kichwa kwenye LCD na nafasi ya alama lcdRight.setCursor (0, 0); lcdRight.write ("Tiles za Piano"); Mshale wa lcdRight.set (0, 1); lcdRight.write ("Alama:"); // kubadilisha alama kuwa kamba kamba strScore [3]; sprintf (strScore, "% d", intScore); // alama ya kuonyesha kwenye LCD lcdRight.write (strScore); // ongeza tofauti lcdRight.setCursor (10, 1); ikiwa (intDiff == 0) {lcdRight.write ("Rahisi"); } ikiwa (intDiff == 1) {lcdRight.write ("Kati"); } ikiwa (intDiff == 2) {lcdRight.write ("Ngumu"); } // Bonyeza maagizo kidogo lcdLeft.setCursor (0, 0); lcdLeft.write ("Bonyeza Enter"); lcdLeft.setCursor (0, 1); andika lcdLeft ("kuanza!"); }

Nambari hii inaandika kichwa cha mchezo na alama kwenye LCD, inafanya hivyo kwa kuambia LCD wapi kuanza kuchapa kwa kutumia LCD.setCursor na kisha kuandika kamba kwenye LCD. Andika.

Tofauti mpya pia imeundwa hapa, strScore, hutumiwa kubadilisha intScore kuwa kamba au aina ya data ya char kwa kutumia kazi ya sprintf.

intDiff pia hutumiwa hapa, kulingana na maadili yake inachapisha chaguzi tofauti za ugumu.

Hatua ya 10: Kazi ya VifungoMenu

ingiza nambari ifuatayo kwenye programu yako

vifungo batiliMenu () {// wakati kuingia kunabonyeza anza mchezo na uweke upya alama ya alama ikiwa (intEnter == 1) {bolPlay = true; intScore = 0; playBoard (); DrawBoard (); } // wakati kitufe cha 3 kinabanwa washa chaguo la utatuzi wa kuchapisha bodi kwa serial ikiwa (intInput == 3) {if (bolSerialBoard == false) {Serial.println ("Serial Board Active"); bolSerialBoard = kweli; } mwingine {Serial.println ("Bodi ya Serial Imelemazwa"); bolSerialBoard = uwongo; }} // weka kasi ya mchezo kuwa ugumu rahisi ikiwa (intInput == 0) {Serial.print ("Mchezo umewekwa kuwa rahisi ("); Serial.print (intGameSpeedEasy); Serial.println ("ms kuongeza kasi)"); intDiff = 0; IntGameSpeed = intGameSpeedEasy; } // weka kasi ya mchezo kwa ugumu wa kati ikiwa (intInput == 1) {Serial.print ("Mchezo umewekwa kati ("); Serial.print (intGameSpeedMedium); Serial.println ("ms kuongeza kasi)"); intDiff = 1; IntGameSpeed = intGameSpeedMedium; } // weka kasi ya mchezo kuwa ngumu sana ikiwa (intInput == 2) {Serial.print ("Mchezo umewekwa kuwa ngumu ("); Serial.print (intGameSpeedHard); Serial.println ("ms kuongeza kasi)"); intDiff = 2; IntGameSpeed = intGameSpeedHard; }}

nambari hii inaendeshwa tu wakati bolPlay ni sawa na uwongo kwenye Kitanzi batili

ikiwa intEnter imewekwa 1 inamaanisha kuwa kitufe cha kuingiza kimesukumwa, ikiwa kinasisitizwa programu inaweka bolPlay kwa kweli na mchezo huanza.

Programu hiyo inasoma kile IntInput ni sawa na. ikiwa ni sawa na 0 kitufe cha kwanza kutoka kushoto kinabanwa, kwenda kulia hadi 3. Ikiwa intInput ni sawa na 4 hakuna kitufe kinachoshinikizwa.

ikiwa vifungo 0-2 vimebanwa mchezo hubadilisha ugumu, pia kurekebisha kasi ya mchezo, ikimaanisha itaongeza kasi zaidi.

ikiwa kitufe cha 3 kimeshinikizwa mchezo utaamsha au kuzima hali ya utatuzi ambapo bodi nzima imechapishwa kwenye mfuatiliaji wa serial kusaidia kupata maswala katika programu.

Hatua ya 11: Kazi ya ButtonsGame

nakili nambari ifuatayo kwenye programu yako

batili batiliGame () {if (intInput! = 4) {// ikiwa kitufe kinabanwa ikiwa (bolTilePressed == uongo) {// tu ikiwa bolTilePressed ni hatua ya uwongo ya kuangalia kitufe cha waandishi wa habari bolTilePressed = kweli; // kisha weka bolTilePressed kwa kweli kuhakikisha kuwa haijasababishwa kwa uwazi tena int intLowestTile = 0; // kuwekwa kwenye tile na tile ya chini kabisa int intCheckedTile = 15; // kufuatilia ni tiles zipi zilizochunguzwa wakati (intLowestTile == 0) {// maadamu haijawekwa kwa chochote angalia vigae vya (int i = 0; i 100) {// ilimradi int kuchelewesha sio chini ya 100 intDelay = intDelay - 20; // chukua thamani kutoka kwake}} mwingine {Serial.println ("Kitufe kibaya kimebanwa"); shindano limekwisha(); // mchezo mwingine}}}}}

Nambari hiyo inaendeshwa tu wakati bolPlay ni sawa na kweli katika Kitanzi batili.

Kama vifungoMenu kulingana na thamani ya kuingiza inaangalia ikiwa mchezaji amepiga tile au amekosa moja.

Inafanya hivyo kwa kupitia arrGame kutoka chini hadi juu ukitumia kitanzi cha muda ili kutafuta ni safu ipi iliyo ya chini kabisa na tiles ya unhit. Halafu inakagua kuona ikiwa doa kwenye safu hiyo inayolingana na kitufe kilichosukumwa ni tepe ya unhit au la, ikiwa ni unhit inaiweka sawa 2 badala ya 1, ikimaanisha itaonyesha kama @, vinginevyo inasababisha mchezoOver kazi ambayo bado hatujaunda.

Kazi hii pia hutumia kutofautisha kwa bolTilePressed kwa kuiweka kweli wakati kitufe kinabanwa na uwongo wakati hakuna kifungo kinachobanwa. Hii ni kuhakikisha kwamba mtumiaji hafungulii mchezo kwa bahati mbaya kwa sababu programu ilidhani walibonyeza kitufe wakati mwingi wakati waliishikilia.

Hatua ya 12: Kazi ya GameOver

Nakili nambari ifuatayo kwenye programu yako

mchezo batiliOver () {Serial.println ("Mchezo Umekamilika!"); Serial.print ("Alama yako ilikuwa:"); Serial.println (intScore); Serial.print ("Kasi yako ilikuwa:"); Serial.println (intDelay); bolPlay = uwongo; }

Hii inasababishwa na chekiBottom au kazi za vifungoGame na husababisha mwisho wa mchezo huo kwa kuweka bolPlay kuwa ya uwongo.

Pia inachapisha ujumbe kwenye mfuatiliaji wa serial kwa alama za watumiaji na tiles za kasi ziliongezwa kwa milliseconds.

Hatua ya 13: Kazi ya Kuingiza

Nakili nambari ifuatayo kwenye programu yako.

pembejeo batili () {intEnter = digitalRead (btnEnter); // soma ingiza // soma ni yapi ya pembejeo zingine, au ikiwa hakuna iliyowekwa kwa 4 ikiwa (digitalRead (btn1) == HIGH) {intInput = 0;} mwingine {if (digitalRead (btn2) == HIGH) {intInput = 1;} mwingine {if (digitalRead (btn3) == HIGH) {intInput = 2;} mwingine {if (digitalRead (btn4) == HIGH) {intInput = 3;} else {intInput = 4; }}}} // // chapa pembejeo ikiwa (intEnter == 1) {Serial.println ("Enter Pressed!");} ikiwa (intInput! = 4) {Serial.print ("Button Press:"); Serial.println (intInput); } mwingine {// ikiwa hakuna kitufe kinachobanwa kuweka upya bolTilePressed bolTilePressed = uongo; }}

Nambari hii inatumiwa na vifungo vya Mchezo na vifungo vya Menyu. kulingana na vifungo ambavyo mtumiaji amebonyeza inaweka thamani ya IntInput, au ikiwa hakuna kitufe kinachobanwa inaweka intInput kuwa sawa na 4.

Ikiwa hakuna kitufe kinachobanwa hapa ndipo bolTilePressed imewekwa upya kwa kazi ya vifungoGame.

Inachapisha pia ujumbe kwa mfuatiliaji wa serial ambayo kifungo kimeshinikizwa.

Hatua ya 14: Kazi ya BottomCheck

nakili nambari ifuatayo kwenye programu yako.

void bottomCheck () {for (int i = 0; i <= 3; i ++) {// kwa nguzo 4 ikiwa (arrGame [15] == 1) {// ikiwa tile iko chini Serial.println ("Tile chini"); mpangilio [15] = 2; DrawBoard (); kuchelewesha (400); arrGame [15] = 1; DrawBoard (); kuchelewesha (400); mpangilio [15] = 2; DrawBoard (); kuchelewesha (400); arrGame [15] = 1; DrawBoard (); kuchelewesha (400); shindano limekwisha(); }}}

Kutumia kitanzi nambari hii inakagua safu ya chini ya arrGame kwa vigae vyovyote vya unhit (tiles sawa na 1), ikiwa kuna tile ya unhit chini ya skrini itawasha tile na kisha kuchochea mchezo juu ya kazi.

Hatua ya 15: Kazi ya AndikaSerial

nakili nambari ifuatayo kwenye programu yako

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

Hii ndio kazi inayofuatwa kupitia chaguo la utatuzi ambalo linaweza kuwezeshwa kwenye kazi ya vifungo vya Menyu. Ikiwa bolSerialBoard imewekwa kuwa kweli katika kazi hiyo itapitia arrGame na kuchapisha bodi nzima kwenye mfuatiliaji wa serial kwa madhumuni ya upimaji kwa kutumia safu.

Hatua ya 16: Kukamilisha

Kukamilisha!
Kukamilisha!

Nambari zako zote hazipaswi kuwa kamili na angalia kitu kama hiki!

/ * * Jina - Tiles za piano; Arduino * Na - Domenic Marulli * Tarehe - 11 / *

/ ni pamoja na maktaba

# pamoja

// hizi ni chaguo ambazo unaweza kubadilisha - nambari za juu = kasi ya mchezo inaharakisha

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

// Fafanua pini

#fafanua btnIngiza A0 #fafanua btn1 15 #fafanua btn2 16 #fafanua btn3 17 #fafanua btn4 18

// tengeneza vitu vya LCD (n, ~, n, ~, ~, n)

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

// kuanzisha safu ya mchezo

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

// kuanzisha vigeuzi vya mchezo

boolean bolPlay; // tracks ikiwa mchezaji int intcore; // hufuata alama ya mchezaji int intDiff; // kitu cha estetic tu kwa kuelezea mchezo ni shida gani

// kuanzisha vigezo vya kuingiza

Ingiza; // kufuatilia ikiwa mtumiaji anashinikiza kitufe cha kuingia int intput; // hufuatilia vifungo gani mtumiaji anashinikiza boolean bolTilePressed; // hakikisha mchezaji hashinikiza kitufe cha 5x na kupoteza

// weka vigeuzi kwa zamu

int intTick; // huhesabu milionea (kwa kitanzi) hadi intDelay int intDelay; // wakati programu inasubiri hadi zamu inayofuata ya milis int intGameSpeed;

// abit ya chaguzi za utatuzi

boolean bolSerialBoard; // wakati kweli itachapisha bodi kwenye mfuatiliaji wa serial

// usanidi ambao utaendeshwa mara moja

kuanzisha batili () {Serial.begin (9600); // kuanza kufuatilia serial // kuanzisha vigezo bolPlay = uongo; intScore = 0; Ingiza = 0; IntDelay = 1000; intDiff = 1; IntGameSpeed = intGameSpeedMedium; // anza lcd lcdLeft.anza (16, 2); lcdRight.anza (16, 2); }

// kitanzi ambacho kitaendeshwa kila milliseconi 10

kitanzi batili () {pembejeo (); // angalia kucheza pembejeo ikiwa (bolPlay == kweli) {if (intTick> = intDelay) {// angalia ikiwa mchezo unapaswa kucheza zamu au uendelee kungojea Serial.println ("~~~~~~~ ~~ "); // chapa kuashiria bodi inahamia // writeSerial (); // ikiwa chaguo imewezeshwa andika ubao kwenye vifungo vya serialGame (); // angalia pembejeo za mchezaji playBoard (); // songa bodi na ongeza tile mpya clearLcd (); // safisha LCD kabla ya kuchoraBodi ya kuchora (); // chora bodi kwenye chini ya LCD Angalia (); Ingiza = 0; // reset intTick} mwingine {buttonsGame (); // angalia pembejeo za mchezaji waziLcd (); // safisha LCD kabla ya kuchoraBodi ya kuchora (); // chora ubao kwenye lcd's intTick = intTick + intGameSpeed; // ongeza kwa kupe}} mwingine {clearLcd (); // kusafisha LCD kabla ya kuchora kichwa (); // kichwa cha kuonyesha na vifungo vya maelezo ya alamaMenu (); // soma pembejeo ya mchezaji waziBox (); // kuhakikisha bodi nzima = 0} kuchelewa (10); // kuchelewesha arduino kwa muda mfupi}

// husafisha LCD, kwa hivyo seli zozote ambazo hazijaingizwa hazijaachwa hapo

utupu clearLcd () {for (int i = 0; i <= 15; i ++) {for (int ii = 0; ii <= 1; ii ++) {lcdLeft.setCursor (i, ii); lcdLeft.write (""); Mshale wa lcdRight.set (i, ii); andika lcdRight (""); }}}

// huchota bodi kwenye lcd's

void drawBoard () {for (int i = 1; i <= 15; i ++) {// chora collums 1 na 2 kwenye LCD ya kushoto // ikiwa tile = 0 haandika chochote, = 1 andika "#", = 2 andika "@" lcdLeft.setCursor (i, 1); // imewekwa kwa safu ya kwanza (kushoto kabisa) ikiwa (arrGame [0] == 1) {lcdLeft.write ("#");} ikiwa (arrGame [0] == 2) {lcdLeft andika ("@");} lcdLeft.setCursor (i, 0); // imewekwa kwa safu ya pili (katikati kushoto) ikiwa (arrGame [1] == 1) {lcdLeft.write ("#");} ikiwa (arrGame [1] == 2) {lcdLeft andika ("@");} lcdRight.setCursor (i, 1); // imewekwa kwa safu ya tatu (katikati kulia) ikiwa (arrGame [2] == 1) {lcdRight.write ("#");} ikiwa (arrGame [2] == 2) {lcdRight andika ("@");} lcdRight.setCursor (i, 0); // imewekwa kwa safu ya nne (kulia zaidi) ikiwa (arrGame [3] == 1) {lcdRight.write ("#");} ikiwa (arrGame [3] == 2) {lcdRight.andika("@");} } }

// inasonga bodi chini na kuweka thamani isiyo ya kawaida kuwa tile

playBoard batili () {for (int i = 0; i <= 3; i ++) {arrGame [0] = 0;} // wazi safu ya juu arrGame [0] [random (0, 4)] = = 1; // weka hatua isiyo ya kawaida kwenye safu ya juu kuwa tile kwa (int i = 15; i> = 1; i -) {// kufanya kazi kutoka chini ya ubao hadi juu kwa (int ii = 0; ii <= 3; ii ++) {// kwa kila safu ya kolamu [ii] = arrGame [i - 1] [ii]; }}}

// inaweka bodi nzima kuwa 0 na inabadilisha vigeu kwa pregame

batili clearBoard () {// kuweka upya kupe na uchelewesha maadili intTick = 0; IntDelay = 1000; // pitia bodi na weka kila kitu kwa 0 kwa (int i = 0; i <= 15; i ++) {kwa (int ii = 0; ii <= 3; ii ++) {arrGame [ii] = 0; }}}

// huonyesha Menyu kuu kwenye LCD's

jina batili () {// andika kichwa kwenye LCD na nafasi ya alama lcdRight.setCursor (0, 0); lcdRight.write ("Tiles za Piano"); Mshale wa lcdRight.set (0, 1); lcdRight.write ("Alama:"); // kubadilisha alama kuwa kamba kamba strScore [3]; sprintf (strScore, "% d", intScore); // alama ya kuonyesha kwenye LCD lcdRight.write (strScore); // ongeza tofauti lcdRight.setCursor (10, 1); ikiwa (intDiff == 0) {lcdRight.write ("Rahisi"); } ikiwa (intDiff == 1) {lcdRight.write ("Kati"); } ikiwa (intDiff == 2) {lcdRight.write ("Ngumu"); } // Bonyeza maagizo kidogo lcdLeft.setCursor (0, 0); lcdLeft.write ("Bonyeza Enter"); lcdLeft.setCursor (0, 1); andika lcdLeft ("kuanza!"); }

// huangalia vifungo na nini cha kuwafanyia ukiwa nje ya mchezo

vifungo batiliMenu () {// wakati kuingia kunabonyeza anza mchezo na uweke upya alama ya alama ikiwa (intEnter == 1) {bolPlay = true; intScore = 0; playBoard (); DrawBoard (); } // wakati kitufe cha 3 kinabanwa washa chaguo la utatuzi wa kuchapisha bodi kwa serial ikiwa (intInput == 3) {if (bolSerialBoard == false) {Serial.println ("Serial Board Active"); bolSerialBoard = kweli; } mwingine {Serial.println ("Bodi ya Serial Imelemazwa"); bolSerialBoard = uwongo; }} // weka kasi ya mchezo kuwa ugumu rahisi ikiwa (intInput == 0) {Serial.print ("Mchezo umewekwa kuwa rahisi ("); Serial.print (intGameSpeedEasy); Serial.println ("ms kuongeza kasi)"); intDiff = 0; IntGameSpeed = intGameSpeedEasy; } // weka kasi ya mchezo kwa ugumu wa kati ikiwa (intInput == 1) {Serial.print ("Mchezo umewekwa kati ("); Serial.print (intGameSpeedMedium); Serial.println ("ms kuongeza kasi)"); intDiff = 1; IntGameSpeed = intGameSpeedMedium; } // weka kasi ya mchezo kuwa ngumu sana ikiwa (intInput == 2) {Serial.print ("Mchezo umewekwa kuwa ngumu ("); Serial.print (intGameSpeedHard); Serial.println ("ms kuongeza kasi)"); intDiff = 2; IntGameSpeed = intGameSpeedHard; }}

// huangalia vifungo na nini cha kuwafanyia wakati wa mchezo

batiliGameGame () {if (intInput! = 4) {// ikiwa kitufe kinabanwa ikiwa (bolTilePressed == uwongo) {// tu ikiwa bolTilePressed ni hatua ya uwongo ya kuangalia kitufe cha waandishi wa habari bolTilePressed = kweli; // kisha weka bolTilePressed kwa kweli kuhakikisha kuwa haijasababishwa kwa uwazi tena int intLowestTile = 0; // kuwekwa kwenye tile na tile ya chini kabisa int intCheckedTile = 15; // kufuatilia ni tiles zipi zilizochunguzwa wakati (intLowestTile == 0) {// maadamu haijawekwa kwa chochote angalia vigae vya (int i = 0; i 100) {// ilimradi int kuchelewesha sio chini ya 100 intDelay = intDelay - 20; // chukua thamani kutoka kwake}} mwingine {Serial.println ("Kitufe kibaya kimebanwa"); shindano limekwisha(); // mchezo mwingine}}}}}

mchezo batiliOver () {

Serial.println ("Mchezo Umekamilika!"); Serial.print ("Alama yako ilikuwa:"); Serial.println (intScore); Serial.print ("Kasi yako ilikuwa:"); Serial.println (intDelay); bolPlay = uwongo; }

// hundi ya uingizaji wa mchezaji

pembejeo batili () {intEnter = digitalRead (btnEnter); // soma ingiza // soma ni yapi ya pembejeo zingine, au ikiwa hakuna iliyowekwa kwa 4 ikiwa (digitalRead (btn1) == HIGH) {intInput = 0;} mwingine {if (digitalRead (btn2) == HIGH) {intInput = 1;} mwingine {if (digitalRead (btn3) == HIGH) {intInput = 2;} mwingine {if (digitalRead (btn4) == HIGH) {intInput = 3;} else {intInput = 4; }}}} // // chapa pembejeo ikiwa (intEnter == 1) {Serial.println ("Enter Pressed!");} ikiwa (intInput! = 4) {Serial.print ("Button Press:"); Serial.println (intInput); } mwingine {// ikiwa hakuna kitufe kinachobanwa kuweka upya bolTilePressed bolTilePressed = uongo; }}

// huangalia chini ya bodi kwa kutofaulu

void bottomCheck () {for (int i = 0; i <= 3; i ++) {// kwa nguzo 4 ikiwa (arrGame [15] == 1) {// ikiwa tile iko chini Serial.println ("Tile chini"); mpangilio [15] = 2; DrawBoard (); kuchelewesha (400); arrGame [15] = 1; DrawBoard (); kuchelewesha (400); mpangilio [15] = 2; DrawBoard (); kuchelewesha (400); arrGame [15] = 1; DrawBoard (); kuchelewesha (400); shindano limekwisha(); }}}

// inachapisha bodi kwenye mfuatiliaji wa serial ikiwa bolSerialBoard ni kweli

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

Mara tu msimbo wote umeingizwa, pakia kwa arduino yako na ufurahie!

Ilipendekeza: