INHOUDSOPGAWE:

Arduino - Klavierteëls: 16 stappe (met foto's)
Arduino - Klavierteëls: 16 stappe (met foto's)

Video: Arduino - Klavierteëls: 16 stappe (met foto's)

Video: Arduino - Klavierteëls: 16 stappe (met foto's)
Video: Драм-секвенсор Arduino: 8 дорожек, 16 шагов на такт, 8 тактов на паттерн 2024, Julie
Anonim
Arduino - Klavierteëls
Arduino - Klavierteëls

Hallo internetmense, dit gaan oor hoe om te maak wat beslis nie 'n afslag van 'n mobiele speletjie op 'n arduino uno r3 is nie.

Om mee te begin, benodig u al die onderdele, soos volg! 1x Arduino Uno r3 ($ 42)

2x LCD -sleutelbordskerm ($ 19 elk)

5x knoppies

5x 220Ω weerstande

28x drade

Goed, as jy eers al die onderdele het, is dit tyd om te begin!

Stap 1: Bedrading

Bedrading
Bedrading
Bedrading
Bedrading
Bedrading
Bedrading

Begin deur u arduino en vriende aan te sluit, soos in die diagram getoon, Maak seker dat die knoppies op die regte manier met die A0-4-gleuwe aan die onderkant van die knoppies verbind word, anders dink die arduino dat die knoppies voortdurend ingedruk word in plaas van slegs op 'n pers.

Stap 2: Verklaringsverklarings

Alle kode hier moet voor u leemte -opstelling en leemte -lus gaan, dit is omdat al hierdie veranderlikes en voorwerpe in verskillende funksies gebruik word.

Begin deur te stel:

#insluit

bo -aan u kode, vertel dit die arduino om die biblioteek "LiquidCrystal.h" te gebruik en die funksies wat deel uitmaak daarvan.

Die volgende stap is om die penne wat ons vir ons knoppies gebruik, te definieer deur hierdie kode onder ons #insluit:

#define btnVoer A0 in #definieer btn1 15 #definieer btn2 16 #definieer btn3 17 #definieer btn4 18

Ons definieer die terme btnEnter en btn1 tot btn 4 om die kode makliker te maak om te lees, of verander indien nodig. Dit beteken dat as ons btn1 tik, die arduino sal weet dat ons eintlik die knoppie 15. bedoel, hoewel ons die poortpoort 15, 16, 17 en 18 noem, maar dit is op die arduino aangedui as A1 A2 A3 en A4, dit is omdat dit is poorte wat spesifiek gebruik word vir analoog insette, hoewel ons dit slegs vir digitale insette gebruik.

Vervolgens gaan ons die voorwerpe skep wat die Liquid Crystal Displays sal beheer. Om dit te doen, plaas hierdie kode onder ons definisies

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

Wat dit doen, vertel die arduino dat wanneer ons lcdLeft of lcdRight bel, ons verwys na 'n LiquidCrystal -voorwerp. Die nommers in die aangehegte hakies vertel die arduino watter poort die voorwerp moet gebruik om boodskappe na die LCD te stuur wanneer ons hul funksies gebruik.

Nou moet ons die veranderlikes verklaar deur die volgende stukkie kode onder die voorwerpverklarings te plaas:

// hierdie veranderlikes is opsies wat u kan verander - hoër getalle = vinniger spelspoed upint intGameSpeedEasy = 10; int intGameSpeedMedium = 25; int intGameSpeedHard = 80;

// stel veranderlikes op vir die gameboolse bolPlay; // volg as die speler intScore behaal; // volg die speler se telling int intDiff; // net 'n estetiese ding om te vertel in watter moeilikheid die spel is // stel veranderlikes op vir input int intEnter; // volg of die gebruiker op die enter -knoppie int intInput druk; // volg watter knoppies die gebruiker druk boolean bolTilePressed; // verseker dat die speler nie per ongeluk 5x op 'n knoppie druk nie en verloor // stel veranderlikes op vir int intTick; // tel millies (per lus) op tot intDelay int intDelay; // die tyd wat die program wag tot die volgende draai in millis int intGameSpeed; // abit van ontfoutingsopsies boolean bolSerialBoard; // wanneer true die bord in die seriële monitor sal druk

Ons verklaar 'n veranderlike deur die datatipe te noem en dan die naam van die veranderlike, bv. int thisIsAnInteger

Booleaanse veranderlikes, soos bolSerialBoard en bolPlay, kan slegs een van twee waardes, waar of onwaar, hê.

Heelgetalveranderlike (int) soos intScore en intInput kan heelgetalle as waardes neem, soos 1, 5 of 100.

'N Paar ander noemenswaardige datatipes wat ons nie hier gebruik nie, is 'n string, 'n stuk teks, en 'n vlot, wat 'n desimale getal is.

Elke van die veranderlikes hier word op verskillende plekke deur die program gebruik; hier is 'n opsomming van wat elkeen doen

bolPlay vertel die program of die spyskaart vertoon moet word of die werklike spel moet loop.

intScore volg die speler se telling as hulle teëls slaan, intDiff word op die hoofkieslys gebruik om die program te vertel watter teks op die LCD's moet druk, intEnter word gebruik om die program te vertel of die enter -knoppie (die verste links) ingedruk word, intInput word gebruik om die program te vertel watter van die ander 4 knoppies gedruk word.

bolTilePressed word gebruik om seker te maak dat die program slegs lees as die knoppie ingedruk word en nie wanneer dit ingedruk word nie.

intGameSpeed, intGameSpeedEasy, intGameSpeedMedium en intGameSpeedHard word gebruik om te bepaal hoe vinnig die spel moet versnel, gebaseer op die moeilikheidsgraad wat gekies word.

intTick en intDelay word gebruik om te keer dat die program die bord beweeg elke keer as dit loop.

bolSerialBoard word gebruik om die program in staat te stel om die bord na die arduino se seriële monitor te stuur as 'n reeks getalle vir toetsdoeleindes.

Uiteindelik is dit tyd om ons bord as 'n skikking te verklaar met behulp van hierdie kode:

// stel game arrayint arrGame [16] [4] = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, op, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}};

'N Skikking is 'n matriks waarop enige punt waarop wiskunde kan aangevra word of verander kan word.

Jou kode moet nou so lyk;

// sluit biblioteke in#include

// hierdie veranderlikes is opsies wat u kan verander - hoër getalle = vinniger spelversnelling

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

// Definieer penne

#definieer btnVoer A0 in #definieer btn1 15 #definieer btn2 16 #definieer btn3 17 #definieer btn4 18

// skep LCD -voorwerpe (n, ~, n, ~, ~, n)

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

// stel spelreeks op

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

// stel veranderlikes vir die spel op

boolean bolPlay; // volg as die speler intScore behaal; // volg die speler se telling int intDiff; // net 'n estetiese ding om te vertel watter probleme die spel ondervind

// stel veranderlikes op vir invoer

int intEnter; // volg of die gebruiker op die enter -knoppie int intInput druk; // volg watter knoppies die gebruiker druk boolean bolTilePressed; // maak seker dat die speler nie per ongeluk 5x op 'n knoppie druk nie en verloor

// stel veranderlikes op vir beurt

int intTick; // tel millies (per lus) op tot intDelay int intDelay; // die tyd wat die program wag tot die volgende draai in millis int intGameSpeed;

// 'n groot aantal ontfoutingsopsies

boolean bolSerialBoard; // wanneer true die bord in die seriële monitor sal druk

Stap 3: Die opstelfunksie

Die opstellus is 'n funksie wat slegs deur die arduino gelees word wanneer dit aanvanklik begin.

In die opstellus stel ons net die waardes van 'n paar van ons veranderlikes in, want in plaas daarvan om hulle 'n waarde te stel wanneer ons dit verklaar, doen ons dit hier.

Begin deur hierdie kode in u nietige opstelling te plaas.

bolPlay = vals; intScore = 0; intTick = 0; intDelay = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium;

Elke reël stel net 'n veranderlike op 'n waarde.

bolPlay is op vals gestel sodat die spel nie begin speel nie.

intScore is ingestel op 0, want u telling begin natuurlik by 0.

intTick begin by 0 omdat die program tans niks tel nie.

intDelay is ingestel op 1000, want dit is die tempo waarteen die teëls begin.

intDiff is net 'n asketiese ding, sodat die program weet wat om te skryf vir die moeilikheid van die spel.

intGameSpeed is ingestel op wat intGameSpeedMedium ook al is, wat beteken dat dit op 'n medium moeilikheidsgraad is.

Plaas hierdie kode vervolgens in die Void Setup onder die kode wat u pas ingevoer het.

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

Serial.begin (9600);

Dit vertel die arduino om via die seriële monitor met die rekenaar te begin kommunikeer (sigbaar deur op die knoppie regs bo in die arduino IDE te klik).

Jou Void Setup behoort nou so te lyk!

ongeldige opstelling () {Serial.begin (9600); // begin die seriële monitor // stel die veranderlikes op bolPlay = false; intScore = 0; intTick = 0; intDelay = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium; // begin lcd's lcdLeft.begin (16, 2); lcdRight.begin (16, 2); }

Stap 4: Die lusfunksie

Die lusfunksie word bestuur deur die arduino elke herhaling van die arduino.

Kopieer die volgende kode in u Void Loop.

leemte lus () {input (); // kyk of die insette speel as (bolPlay == true) {if (intTick> = intDelay) {// kyk of die spel 'n draai moet speel, of bly wag Serial.println ("~~~~~~~ ~~ "); // druk om aan te dui dat die bord aanbeweeg // writeSerial (); // as die opsie aangeskakel is, skryf die bord in seriële buttonsGame (); // kyk na speler -insette playBoard (); // skuif die bord en voeg 'n nuwe teël clearLcd () by; // maak die LCD's skoon voordat u tekenbord trek (); // teken die bord op die onderkant van die lcdCheck (); intTick = 0; // reset intTick} else {buttonsGame (); // kyk vir speler -insette clearLcd (); // maak die LCD's skoon voordat u tekenbord trek (); // teken die bord op die lcd se intTick = intTick + intGameSpeed; // voeg by regmerkie}} anders {clearLcd (); // maak die LCD's skoon voordat u die titel teken (); // vertoon titel en telling -inligting knoppiesMenu (); // lees spelerinvoer clearBoard (); // verseker die hele bord = 0} vertraging (10); // vertraag die arduino met 'n kort oomblik}

As bolPlay gelyk is aan true, beteken dit dat die spel speel, en al die kode vir die spel moet uitgevoer word, maar ons wil net hê dat die bord 'n nuwe teël moet byvoeg en afwaarts beweeg as intTick groter is as ons intDelay, anders wil ons die gebruiker nog steeds toelaat om op 'n knoppie te druk om 'n teël te tref en intTick in spoed te verhoog.

Die meeste van hierdie kode gebruik funksies wat ons nog moet uitvoer, en ons sal dit in die volgende stappe maak. Die doel van hierdie funksies is soos volg.

Invoer lees watter knoppies die gebruiker gedruk het.

buttonsGame bepaal wat die knoppies in die spel doen, en nie in die spyskaart nie

playBoard voeg 'n nuwe teël by die bord en skuif dan alles in die bord in een spasie

clearLCD maak die LCD's skoon om seker te maak dat geen spook agter die teëls gelaat word nie

drawBoard gaan deur arrGame en druk dit op die LCD's

clearBoard maak die hele arrGame skoon wanneer die spel nie gespeel word nie

bottomCheck kyk na die onderkant van arrGame op 'n mislukkingstoestand

titel vertoon die titel van die spel en inligting oor die telling op die spyskaart

knoppies kieslys bepaal wat die gebruiker se insette in die spyskaart doen.

gameOver is 'n ander funksie, hoewel dit nie hier genoem word nie, maar dit word in die onderkant genoem Check and buttonsGame -funksies.

Stap 5: Die ClearLCD -funksie

Om 'n funksie te skep, begin ons deur dit by die kode te voeg

leegte funksie Naam () {

}

die "funksienaam" kan enigiets wees, solank dit nie reeds bestaan nie.

Kopieer hierdie kode in u program:

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

dit loop deur die hele skikking deur 2 getelde lusse te gebruik om deur elke punt op die LCD's te gaan en 'n spasie te skryf.

Sonder om terug te sit op niks, sal die LCD's handhaaf wat voorheen geskryf is

Stap 6: Die tekenbordfunksie

kopieer hierdie kode in u program

void drawBoard () {for (int i = 1; i <= 15; i ++) {// draw collums 1 and 2 on the left LCD // if the tile = 0 write nothing, = 1 write "#", = 2 skryf "@" lcdLeft.setCursor (i, 1); // stel op die eerste kolom (die verste links) as (arrGame [0] == 1) {lcdLeft.write ("#");} if (arrGame [0] == 2) {lcdLeft.write ("@");} lcdLeft.setCursor (i, 0); // stel op die tweede kolom (links in die middel) as (arrGame [1] == 1) {lcdLeft.write ("#");} if (arrGame [1] == 2) {lcdLeft.write ("@");} lcdRight.setCursor (i, 1); // stel op die derde kolom (regs in die middel) as (arrGame [2] == 1) {lcdRight.write ("#");} if (arrGame [2] == 2) {lcdRight.write ("@");} lcdRight.setCursor (i, 0); // stel op die vierde kolom (verste regs) as (arrGame [3] == 1) {lcdRight.write ("#");} if (arrGame [3] == 2) {lcdRight. skryf ("@");}}}

dit gebruik 'n lus om deur elke ry van die bord te gaan; dit kyk dan of 'n kolom in die ry gelyk is aan 1 of 2, op grond daarvan dat dit dan 'n hashtag op die LCD druk, of 'n teël nog moet verskyn treffer, of 'n @ vir 'n trefteël.

Stap 7: Die PlayBoard -funksie

kopieer hierdie kode in u program.

void playBoard () {for (int i = 0; i <= 3; i ++) {arrGame [0] = 0;} // maak die boonste ry arrGame [0] [random (0, 4)] = skoon 1; // stel 'n ewekansige punt in die boonste ry as 'n teël vir (int i = 15; i> = 1; i-) {// werk van die onderkant van die bord na die bokant vir (int ii = 0; ii <= 3; ii ++) {// vir elke collum arrGame [ii] = arrGame [i - 1] [ii]; }}}

hierdie kode begin deur die hele boonste ry uit te vee na 0, of geen teël nie, en stel dan 'n ewekansige teël as 'n 1 en ontkleed teël in.

Dit gaan dan deur 'n getelde lus in omgekeerde volgorde, van 15 tot 1, en stel die ry gelyk, ongeag die ry bo dit gelyk is aan, sodat die bord langs die LCD's af beweeg

Stap 8: Die ClearBoard -funksie

kopieer hierdie kode in u program.

void clearBoard () {// reset bosluis en vertraag waardes intTick = 0; intDelay = 1000; // gaan deur die bord en stel alles op 0 vir (int i = 0; i <= 15; i ++) {for (int ii = 0; ii <= 3; ii ++) {arrGame [ii] = 0; }}}

Hierdie kode word uitgevoer as die spel nie speel nie, om seker te maak dat die hele arrGame op 0 of geen teëls is nie, deur getelde lusse te gebruik om deur die skikking te gaan.

Die kode stel ook die waardes van intDelay en intTick terug.

Stap 9: Die titelfunksie

kopieer die volgende kode in u program

ongeldige titel () {// skryf die titel op die LCD en ruimte vir die telling lcdRight.setCursor (0, 0); lcdRight.write ("Klavierteëls"); lcdRight.setCursor (0, 1); lcdRight.write ("telling:"); // omskep die telling in 'n string char strScore [3]; sprintf (strScore, "%d", intScore); // vertoon telling op LCD lcdRight.write (strScore); // voeg die diffundu lcdRight.setCursor (10, 1) by; as (intDiff == 0) {lcdRight.write ("maklik"); } as (intDiff == 1) {lcdRight.write ("Medium"); } if (intDiff == 2) {lcdRight.write ("Hard"); } // Druk 'n bietjie instruksie lcdLeft.setCursor (0, 0); lcdLeft.write ("Druk Enter"); lcdLeft.setCursor (0, 1); lcdLeft.write ("om te begin!"); }

Hierdie kode skryf die titel van die spel en die telling op die LCD's, dit doen dit deur die LCD te vertel waar om te begin tik met behulp van LCD.setCursor en dan die string in LCD.write te skryf.

'N Nuwe veranderlike word ook hier geskep, strScore, dit word gebruik om intScore te omskep in 'n string of char data tipe met behulp van die sprintf funksie.

intDiff word ook hier gebruik, gebaseer op die waardes daarvan, druk dit die verskillende moeilikheidsopsies af.

Stap 10: Die knoppiesmenu -funksie

voeg die volgende kode in u program in

void buttonsMenu () {// wanneer enter ingedruk word, begin die spel en stel die tellingwaarde terug as (intEnter == 1) {bolPlay = true; intScore = 0; playBoard (); trekbord (); } // wanneer knoppie 3 ingedruk word, skakel die ontfoutingsopsie aan om die bord in serie te druk as (intInput == 3) {if (bolSerialBoard == false) {Serial.println ("Serial Board Active"); bolSerialBoard = waar; } anders {Serial.println ("Serial Board Disabled"); bolSerialBoard = vals; }}} // stel die spoed van die spel maklik op as (intInput == 0) {Serial.print ("Game ingestel op maklik ("); Serial.print (intGameSpeedEasy); Serial.println ("ms versnelling)")); intDiff = 0; intGameSpeed = intGameSpeedEasy; } // stel spelsnelheid op medium moeilikheid as (intInput == 1) {Serial.print ("Game ingestel op medium ("); Serial.print (intGameSpeedMedium); Serial.println ("ms versnelling)")); intDiff = 1; intGameSpeed = intGameSpeedMedium; } // stel die spoed van die spel op moeilike probleme as (intInput == 2) {Serial.print ("Game ingestel op hard ("); Serial.print (intGameSpeedHard); Serial.println ("ms versnelling)")); intDiff = 2; intGameSpeed = intGameSpeedHard; }}

hierdie kode word slegs uitgevoer wanneer bolPlay gelyk is aan vals in die leemte -lus

as intEnter op 1 gestel is, beteken dit dat die enter -knoppie ingedruk is, as dit ingedruk word, stel die program bolPlay op true en begin die spel.

Die program lees dan waarmee intInput gelyk is. as dit gelyk is aan 0 word die eerste knoppie van links gedruk, tot regs tot 3. As intInput gelyk is aan 4 word geen knoppie gedruk nie.

as knoppies 0-2 ingedruk word, verander die spel die moeilikheid, en pas ook die waarde van die spel aan, wat beteken dat dit vinniger sal versnel.

As knoppie 3 ingedruk word, sal die spel 'n ontfoutingsmodus aktiveer of deaktiveer, waar die hele bord in die seriële monitor gedruk word om probleme in die program te vind.

Stap 11: Die ButtonsGame -funksie

kopieer die volgende kode in u program

void buttonsGame () {if (intInput! = 4) {// as 'n knoppie ingedruk word as (bolTilePressed == false) {// slegs as bolTilePressed 'n vals sneller is om 'n knoppie te druk bolTilePressed = true; // stel dan bolTilePressed op true om seker te maak dat dit nie per ongeluk weer veroorsaak word int intLowestTile = 0; // om die teël met die laagste teël int intCheckedTile = 15 te stel; // om by te hou watter teëls nagegaan is terwyl (intLowestTile == 0) {// solank dit nie ingestel is op enigiets nie, kyk vir teëls vir (int i = 0; i 100) {// solank int vertraging is nie laer as 100 intDelay = intDelay - 20; // neem 'n waarde daarvan}} anders {Serial.println ("Verkeerde knoppie ingedruk"); spel verby(); // anders is die spel verby}}}}}

Die kode word slegs uitgevoer wanneer bolPlay gelyk is aan waar in die leegte -lus.

Soos knoppiesmenu, gebaseer op die waarde van intInput, kyk dit of die speler 'n teël getref het of een gemis het.

Dit word gedoen deur van onder na bo deur arrGame te gaan, met 'n while -lus om te kyk watter ry die laagste is met 'n ongehinderde teël. Dit kontroleer dan of die plek in die ry wat ooreenstem met die knoppie wat gedruk word, 'n ongehinderde teël is, of nie, dit stel dit gelyk aan 2 in plaas van 1, wat beteken dat dit as 'n @sal verskyn, anders veroorsaak dit die gameOver funksie wat ons nog moet skep.

Hierdie funksie maak ook gebruik van die veranderlike bolTilePressed deur dit op waar te stel as 'n knoppie ingedruk word en onwaar as daar nie op 'n knoppie gedruk word nie. Dit is om te verseker dat die gebruiker die spel nie per ongeluk verloor nie, omdat die program gedink het dat hulle die knoppie verskeie kere ingedruk het toe hulle dit ingedruk het.

Stap 12: Die GameOver -funksie

Kopieer die volgende kode in u program

void gameOver () {Serial.println ("Game Over!"); Serial.print ("U telling was:"); Serial.println (intScore); Serial.print ("U spoed was:"); Serial.println (intDelay); bolPlay = vals; }

Dit word veroorsaak deur óf die checkBottom- óf buttonsGame -funksies en veroorsaak die einde van die spel deur bolPlay onwaar te stel.

Dit druk ook 'n boodskap in die reeksmonitor af vir die gebruikers se telling en die spoedteëls is in millisekondes bygevoeg.

Stap 13: Die invoerfunksie

Kopieer die volgende kode in u program.

leegte invoer () {intEnter = digitalRead (btnEnter); // lees enter // lees watter van die ander insette, of indien nie een op 4 gestel is as (digitalRead (btn1) == HOOG) {intInput = 0;} anders {if (digitalRead (btn2) == HOOG) {intInput = 1;} anders {if (digitalRead (btn3) == HOOG) {intInput = 2;} anders {if (digitalRead (btn4) == HOOG) {intInput = 3;} anders {intInput = 4; }}}}} // seriële druk die insette as (intEnter == 1) {Serial.println ("Enter Pressed!");} if (intInput! = 4) {Serial.print ("Button Press:"); Serial.println (intInput); } anders {// as geen knoppie gedruk word nie, reset bolTilePressed bolTilePressed = false; }}

Hierdie kode word gebruik met die buttonsGame en buttonsMenu funksies. op grond van die knoppies wat die gebruiker ingedruk het, stel dit die waarde van intInput, of as geen knoppie gedruk word nie, stel dit intInput gelyk aan 4.

As daar nie op 'n knoppie gedruk word nie, is dit waar bolTilePressed teruggestel word vir die buttonsGame -funksie.

Dit druk ook 'n boodskap uit na die seriële monitor waarop die knoppie gedruk word.

Stap 14: Die BottomCheck -funksie

kopieer die volgende kode na u program.

void bottomCheck () {for (int i = 0; i <= 3; i ++) {// vir die 4 kolomme as (arrGame [15] == 1) {// as 'n teël onderaan die reeks is.println ("Teël onderaan"); arrGame [15] = 2; trekbord (); vertraging (400); arrGame [15] = 1; trekbord (); vertraging (400); arrGame [15] = 2; trekbord (); vertraging (400); arrGame [15] = 1; trekbord (); vertraging (400); spel verby(); }}}

Deur 'n lus te gebruik, kyk hierdie kode na die onderste ry arrGame vir enige teëls wat nie aangeskakel is nie (teëls gelyk aan 1), as daar 'n ongehinderde teël aan die onderkant van die skerm is, flits dit die teël en aktiveer dan die funksie van die spel.

Stap 15: Die WriteSerial -funksie

kopieer die volgende kode in u program

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

Dit is die funksie gevolg deur die ontfoutingsopsie wat in die buttonsMenu -funksie geaktiveer kan word. As bolSerialBoard in die funksie op true gestel is, gaan dit deur arrGame en druk die hele bord in die seriële monitor vir toetsdoeleindes deur 'n skikking te gebruik.

Stap 16: Voltooiing

Voltooiing!
Voltooiing!

Al u kode moet nie volledig wees nie en moet so lyk!

/ * * Naam - Klavierteëls; Arduino * Deur - Domenic Marulli * Datum - 11/ *

/ biblioteke insluit

#insluit

// hierdie veranderlikes is opsies wat u kan verander - hoër getalle = vinniger spelversnelling

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

// Definieer penne

#definieer btnVoer A0 in #definieer btn1 15 #definieer btn2 16 #definieer btn3 17 #definieer btn4 18

// skep LCD -voorwerpe (n, ~, n, ~, ~, n)

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

// stel spelreeks op

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

// stel veranderlikes vir die spel op

boolean bolPlay; // volg as die speler intScore behaal; // volg die speler se telling int intDiff; // net 'n estetiese ding om te vertel watter probleme die spel ondervind

// stel veranderlikes op vir invoer

int intEnter; // volg of die gebruiker op die enter -knoppie int intInput druk; // volg watter knoppies die gebruiker druk boolean bolTilePressed; // maak seker dat die speler nie per ongeluk 5x op 'n knoppie druk nie en verloor

// stel veranderlikes op vir beurt

int intTick; // tel millies (per lus) op tot intDelay int intDelay; // die tyd wat die program wag tot die volgende draai in millis int intGameSpeed;

// 'n groot aantal ontfoutingsopsies

boolean bolSerialBoard; // wanneer true die bord in die seriële monitor sal druk

// die opstelling wat een keer uitgevoer sal word

ongeldige opstelling () {Serial.begin (9600); // begin die seriële monitor // stel die veranderlikes op bolPlay = false; intScore = 0; intTick = 0; intDelay = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium; // begin lcd's lcdLeft.begin (16, 2); lcdRight.begin (16, 2); }

// die lus wat elke 10 millisekondes uitgevoer sal word

leemte lus () {input (); // kyk of die insette speel as (bolPlay == true) {if (intTick> = intDelay) {// kyk of die spel 'n draai moet speel, of bly wag Serial.println ("~~~~~~~ ~~ "); // druk om aan te dui dat die bord aanbeweeg // writeSerial (); // as die opsie aangeskakel is, skryf die bord in seriële buttonsGame (); // kyk na speler -insette playBoard (); // skuif die bord en voeg 'n nuwe teël clearLcd () by; // maak die LCD's skoon voordat u tekenbord trek (); // teken die bord op die onderkant van die lcdCheck (); intTick = 0; // reset intTick} else {buttonsGame (); // kyk vir speler -insette clearLcd (); // maak die LCD's skoon voordat u tekenbord trek (); // teken die bord op die lcd se intTick = intTick + intGameSpeed; // voeg by regmerkie}} anders {clearLcd (); // maak die LCD's skoon voordat u die titel teken (); // vertoon titel en telling -inligting knoppiesMenu (); // lees spelerinvoer clearBoard (); // verseker die hele bord = 0} vertraging (10); // vertraag die arduino met 'n kort oomblik}

// maak die LCD skoon, sodat geen selle wat daar binne kom, daar gelaat word nie

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

// teken die bord op die lcd's

void drawBoard () {for (int i = 1; i <= 15; i ++) {// draw collums 1 and 2 on the left LCD // if the tile = 0 write nothing, = 1 write "#", = 2 skryf "@" lcdLeft.setCursor (i, 1); // stel op die eerste kolom (die verste links) as (arrGame [0] == 1) {lcdLeft.write ("#");} if (arrGame [0] == 2) {lcdLeft.write ("@");} lcdLeft.setCursor (i, 0); // stel op die tweede kolom (links in die middel) as (arrGame [1] == 1) {lcdLeft.write ("#");} if (arrGame [1] == 2) {lcdLeft.write ("@");} lcdRight.setCursor (i, 1); // stel op die derde kolom (regs in die middel) as (arrGame [2] == 1) {lcdRight.write ("#");} if (arrGame [2] == 2) {lcdRight.write ("@");} lcdRight.setCursor (i, 0); // stel op die vierde kolom (verste regs) as (arrGame [3] == 1) {lcdRight.write ("#");} if (arrGame [3] == 2) {lcdRight. skryf ("@");}}}

// skuif die bord af en plaas 'n ewekansige waarde as 'n teël

void playBoard () {for (int i = 0; i <= 3; i ++) {arrGame [0] = 0;} // maak die boonste ry arrGame [0] [random (0, 4)] = skoon 1; // stel 'n ewekansige punt in die boonste ry as 'n teël vir (int i = 15; i> = 1; i-) {// werk van die onderkant van die bord na die bokant vir (int ii = 0; ii <= 3; ii ++) {// vir elke collum arrGame [ii] = arrGame [i - 1] [ii]; }}}

// stel die hele bord op 0 en stel veranderlikes terug na vooraf spel

void clearBoard () {// reset bosluis en vertraag waardes intTick = 0; intDelay = 1000; // gaan deur die bord en stel alles op 0 vir (int i = 0; i <= 15; i ++) {for (int ii = 0; ii <= 3; ii ++) {arrGame [ii] = 0; }}}

// vertoon die hoofkieslys op die LCD's

ongeldige titel () {// skryf die titel op die LCD en ruimte vir die telling lcdRight.setCursor (0, 0); lcdRight.write ("Klavierteëls"); lcdRight.setCursor (0, 1); lcdRight.write ("telling:"); // omskep die telling in 'n string char strScore [3]; sprintf (strScore, "%d", intScore); // vertoon telling op LCD lcdRight.write (strScore); // voeg die diffundu lcdRight.setCursor (10, 1) by; as (intDiff == 0) {lcdRight.write ("maklik"); } as (intDiff == 1) {lcdRight.write ("Medium"); } if (intDiff == 2) {lcdRight.write ("Hard"); } // Druk 'n bietjie instruksie lcdLeft.setCursor (0, 0); lcdLeft.write ("Druk Enter"); lcdLeft.setCursor (0, 1); lcdLeft.write ("om te begin!"); }

// kontroleer die knoppies en wat om daarvoor te doen terwyl hulle buite die spel is

void buttonsMenu () {// wanneer enter ingedruk word, begin die spel en stel die tellingwaarde terug as (intEnter == 1) {bolPlay = true; intScore = 0; playBoard (); trekbord (); } // wanneer knoppie 3 ingedruk word, skakel die ontfoutingsopsie aan om die bord in serie te druk as (intInput == 3) {if (bolSerialBoard == false) {Serial.println ("Serial Board Active"); bolSerialBoard = waar; } anders {Serial.println ("Serial Board Disabled"); bolSerialBoard = vals; }}} // stel die spoed van die spel maklik op as (intInput == 0) {Serial.print ("Game ingestel op maklik ("); Serial.print (intGameSpeedEasy); Serial.println ("ms versnelling)")); intDiff = 0; intGameSpeed = intGameSpeedEasy; } // stel spelsnelheid op medium moeilikheid as (intInput == 1) {Serial.print ("Game ingestel op medium ("); Serial.print (intGameSpeedMedium); Serial.println ("ms versnelling)")); intDiff = 1; intGameSpeed = intGameSpeedMedium; } // stel die spoed van die spel op moeilike probleme as (intInput == 2) {Serial.print ("Game ingestel op hard ("); Serial.print (intGameSpeedHard); Serial.println ("ms versnelling)")); intDiff = 2; intGameSpeed = intGameSpeedHard; }}

// kyk na die knoppies en wat u daarvoor moet doen terwyl u in die spel is

void buttonsGame () {if (intInput! = 4) {// as 'n knoppie ingedruk word as (bolTilePressed == false) {// slegs as bolTilePressed 'n vals sneller is om 'n knoppie te druk bolTilePressed = true; // stel dan bolTilePressed op true om seker te maak dat dit nie per ongeluk weer int intLowestTile = 0; // om die teël met die laagste teël int intCheckedTile = 15 te stel; // om by te hou watter teëls nagegaan is terwyl (intLowestTile == 0) {// solank dit nie ingestel is op enigiets nie, kyk vir teëls vir (int i = 0; i 100) {// solank int vertraging is nie laer as 100 intDelay = intDelay - 20; // neem 'n waarde daarvan}} anders {Serial.println ("Verkeerde knoppie ingedruk"); spel verby(); // anders is die spel verby}}}}}

void gameOver () {

Serial.println ("Game Over!"); Serial.print ("U telling was:"); Serial.println (intScore); Serial.print ("U spoed was:"); Serial.println (intDelay); bolPlay = vals; }

// kyk na die invoer van die speler

ongeldige invoer () {intEnter = digitalRead (btnEnter); // lees enter // lees watter van die ander insette, of indien nie een op 4 gestel is as (digitalRead (btn1) == HOOG) {intInput = 0;} anders {if (digitalRead (btn2) == HOOG) {intInput = 1;} anders {if (digitalRead (btn3) == HOOG) {intInput = 2;} anders {if (digitalRead (btn4) == HOOG) {intInput = 3;} anders {intInput = 4; }}}}} // seriële druk die insette as (intEnter == 1) {Serial.println ("Enter Pressed!");} if (intInput! = 4) {Serial.print ("Button Press:"); Serial.println (intInput); } anders {// as geen knoppie gedruk word nie, reset bolTilePressed bolTilePressed = false; }}

// kontroleer die onderkant van die bord op mislukking

void bottomCheck () {for (int i = 0; i <= 3; i ++) {// vir die 4 kolomme as (arrGame [15] == 1) {// as 'n teël onderaan die reeks is.println ("Teël onderaan"); arrGame [15] = 2; trekbord (); vertraging (400); arrGame [15] = 1; trekbord (); vertraging (400); arrGame [15] = 2; trekbord (); vertraging (400); arrGame [15] = 1; trekbord (); vertraging (400); spel verby(); }}}

// druk die bord op die seriële monitor af as bolSerialBoard waar is

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

Sodra al die kode ingevoer is, laai dit op na u arduino en geniet dit!

Aanbeveel: