Orodha ya maudhui:
- Hatua ya 1: Wiring
- Hatua ya 2: Tamko la Azimio
- Hatua ya 3: Kazi ya Usanidi
- Hatua ya 4: Kazi ya Kitanzi
- Hatua ya 5: Kazi ya ClearLCD
- Hatua ya 6: Kazi ya DrawBoard
- Hatua ya 7: Kazi ya PlayBoard
- Hatua ya 8: Kazi ya ClearBoard
- Hatua ya 9: Kazi ya Kichwa
- Hatua ya 10: Kazi ya VifungoMenu
- Hatua ya 11: Kazi ya ButtonsGame
- Hatua ya 12: Kazi ya GameOver
- Hatua ya 13: Kazi ya Kuingiza
- Hatua ya 14: Kazi ya BottomCheck
- Hatua ya 15: Kazi ya AndikaSerial
- Hatua ya 16: Kukamilisha
Video: Arduino - Tiles za piano: Hatua 16 (na Picha)
2024 Mwandishi: John Day | [email protected]. Mwisho uliobadilishwa: 2024-01-30 12:53
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
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
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:
Jinsi: Kuweka Raspberry PI 4 isiyo na kichwa (VNC) na Rpi-picha na Picha: Hatua 7 (na Picha)
Jinsi: Kuweka Raspberry PI 4 isiyo na kichwa (VNC) Na picha ya Rpi na Picha: Ninapanga kutumia Rapsberry PI hii kwenye rundo la miradi ya kufurahisha nyuma kwenye blogi yangu. Jisikie huru kuiangalia. Nilitaka kurudi kutumia Raspberry PI yangu lakini sikuwa na Kinanda au Panya katika eneo langu jipya. Ilikuwa ni muda tangu nilipoweka Raspberry
Piano ya Hewa Kutumia Sensor ya Karibu na IR na Arduino Uno Atmega 328: 6 Hatua (na Picha)
Piano ya Hewa Kutumia Sura ya Ukaribu ya IR na Arduino Uno Atmega 328: Kwa kawaida Pianos iwe ni kazi ya umeme au mitambo kwenye utaratibu rahisi wa kitufe cha kusukuma. Lakini hapa kuna twist, tunaweza kuondoa tu hitaji la funguo kwenye piano kwa kutumia sensorer zingine. Na sensorer Ukaribu wa infra-nyekundu inafaa zaidi kwa sababu sababu
Arduino - Piezo Piano Button Piano: 4 Hatua
Arduino - Piezo Piano Button Piano: Piano ya vitufe vitatu ni mradi wa Kompyuta na uzoefu wa kutumia Arduino. Nilifagiliwa bila kujua kujaribu kuunda hii wakati nikicheza karibu na buzzer ya piezo kwa mara ya kwanza. Ilikuwa kubwa sana! Katika kujaribu kugundua variou
Piano ya Kugusa Piano: Hatua 6 (na Picha)
Piano ya Kugusa Piano: piano kwa mfuko wako? Hakika! Kutumia uhamishaji wa toner ya printa, suluhisho la kuchoma shaba, na Teensy 3.2 tunatengeneza kidhibiti kidogo cha MIDI ambacho hujibu kwa kugusa tu kwa kidole.Utahitaji vifaa: 100mm X 70mm shaba PCB Vijana 3.2 Feri
Piano ya Sakafu ya Arduino: Hatua 10 (na Picha)
Piano ya Arduino Sakafu: Zaidi ya msimu mmoja wa joto niliunda piano hii ya sakafu. Imeundwa kidogo baada ya piano iliyoonyeshwa kwenye sinema " Kubwa ". Nilitumia karibu masaa 100 kuunda hii, lakini ninakadiria itanichukua tu masaa 30 ikiwa ningefanya tena. Kuna zaidi ya 1