Innholdsfortegnelse:

Arduino - Piano Fliser: 16 trinn (med bilder)
Arduino - Piano Fliser: 16 trinn (med bilder)

Video: Arduino - Piano Fliser: 16 trinn (med bilder)

Video: Arduino - Piano Fliser: 16 trinn (med bilder)
Video: Piano Tiles Arduino Robot 2024, Juli
Anonim
Arduino - Pianofliser
Arduino - Pianofliser

Hei internett folk, Dette kommer til å handle om hvordan du lager det DEFINITIVT ikke er et rip off av et mobilspill på en arduino uno r3.

så for å starte, trenger du alle delene, som er som følger! 1x Arduino Uno r3 ($ 42)

2x LCD -tastaturskjerm ($ 19 hver)

5x knapper

5x 220Ω motstander

28x ledninger

Ok, når du har fått alle delene, er det på tide å komme i gang!

Trinn 1: Kabling

Kabling
Kabling
Kabling
Kabling
Kabling
Kabling

Begynn med å koble til din arduino og venner som vist på diagrammet, Sørg for at knappene er koblet opp på riktig måte med A0-4-sporene på baksiden av knappeskinnene, ellers vil arduinoen i stedet tro at knappene holdes nede konstant i stedet for bare ved et trykk.

Trinn 2: Erklæringserklæringer

All kode her bør gå før ditt ugyldige oppsett og hulrom, dette er fordi alle disse variablene og objektene brukes i flere av funksjonene vi skal sette opp.

Begynn med å sette:

#inkludere

øverst i koden din, forteller dette arduinoen å bruke biblioteket "LiquidCrystal.h" og funksjonene som er en del av den.

Det neste trinnet er å definere pinnene vi bruker for knappene våre ved å sette denne koden under #include:

#define btnEnter A0 #define btn1 15 #define btn2 16 #define btn3 17 #define btn4 18

Vi definerer begrepene btnEnter og btn1 til btn 4 for å gjøre koden lettere for oss å lese, eller endre om nødvendig. Det betyr at når vi skriver btn1 vil arduinoen vite at vi faktisk mener knappen 15. Selv om vi kaller portene 15, 16, 17 og 18, er de merket på arduinoen som A1 A2 A3 og A4, dette er fordi de er porter som brukes spesielt for analoge innganger, selv om vi bare bruker dem for digitale innganger.

Deretter skal vi lage objektene som skal kontrollere Liquid Crystal Displays. For å gjøre dette, legg denne koden under definisjonene våre

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

Hva dette gjør er å fortelle arduinoen at når vi kaller lcdLeft eller lcdRight, refererer vi til et LiquidCrystal -objekt. Tallene i de vedlagte parentesene forteller arduinoen hvilken port objektet skal bruke for å sende meldinger til LCD -skjermen når vi bruker funksjonene.

Nå må vi deklarere variablene ved å sette den neste koden under objektdeklarasjonene:

// disse variablene er alternativer du kan endre - høyere tall = raskere spillhastighet upint intGameSpeedEasy = 10; int intGameSpeedMedium = 25; int intGameSpeedHard = 80;

// sette opp variabler for gameboolsk bolPlay; // sporer hvis spilleren int intScore; // sporer spillerens poengsum int intDiff; // bare en estetisk ting for å fortelle hvilken vanskelighet spillet er på // sette opp variabler for input int intEnter; // sporer hvis brukeren trykker på enter -knappen int intInput; // sporer hvilke knapper brukeren trykker på boolsk bolTilePressed; // sørg for at spilleren ikke ved et uhell trykker på en knapp 5x og mister // konfigurer variabler for turn int intTick; // teller opp millies (per sløyfe) til intDelay int intDelay; // tiden programmet venter til neste sving i millis int intGameSpeed; // abit av feilsøkingsalternativer boolske bolSerialBoard; // når true vil skrive ut kortet i den serielle skjermen

Vi erklærer en variabel ved å oppgi datatypen og deretter variabelens navn, eks. int thisIsAnInteger

Boolske variabler, for eksempel bolSerialBoard og bolPlay, kan bare ha én av to verdier, true eller false.

Heltallsvariabel (int) som intScore og intInput kan ta hele tall som verdier, for eksempel 1, 5 eller 100.

Noen andre bemerkelsesverdige datatyper som vi ikke bruker her er en streng, som er en bit tekst, og en float, som er et desimaltall.

Hver av variablene her brukes på flere forskjellige steder av programmet. Her er en oversikt over hva hver enkelt gjør

bolPlay forteller programmet om menyen skal vises eller om selve spillet skal kjøres.

intScore sporer spillerens poengsum når de treffer fliser, intDiff brukes på hovedmenyen for å fortelle programmet hvilken tekstbit som skal skrives ut på LCD -skjermen, intEnter brukes til å fortelle programmet om enter -knappen (lengst til venstre) er trykket, intInput brukes til å fortelle programmet hvilken av de fire andre knappene som trykkes.

bolTilePressed brukes til å sikre at programmet bare leser på når knappen trykkes og ikke når den holdes inne.

intGameSpeed, intGameSpeedEasy, intGameSpeedMedium og intGameSpeedHard brukes til å kontrollere hvor raskt spillet skal øke hastigheten basert på hvilken vanskelighet som velges.

intTick og intDelay brukes til å stoppe programmet fra å flytte brettet hver gang det sløyfes.

bolSerialBoard brukes til å la deg få programmet til å sende brettet til arduinoens serielle skjerm som en serie med tall for testformål.

Endelig er det på tide å erklære styret vårt som en matrise ved å bruke denne koden:

// konfigurere game arrayint 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}};

En matrise er en matrise som et hvilket som helst punkt som kan kalles for matematikk eller endres.

Koden din skal nå se slik ut;

// inkludere biblioteker#inkludere

// disse variablene er alternativer du kan endre - høyere tall = raskere hastighet på spillet

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

// Definer pins

#define btnEnter A0 #define btn1 15 #define btn2 16 #define btn3 17 #define btn4 18

// lage LCD -objekter (n, ~, n, ~, ~, n)

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

// sette opp spillarray

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

// sette opp variabler for spillet

boolsk bolPlay; // sporer hvis spilleren int intScore; // sporer spillerens poengsum int intDiff; // bare en estetisk ting for å fortelle hvilken vanskelighet spillet er på

// sette opp variabler for input

int intEnter; // sporer hvis brukeren trykker på enter -knappen int intInput; // sporer hvilke knapper brukeren trykker på boolsk bolTilePressed; // sørg for at spilleren ikke ved et uhell trykker på en knapp 5x og taper

// sette opp variabler for tur

int intTick; // teller opp millies (per sløyfe) til intDelay int intDelay; // tiden programmet venter til neste sving i millis int intGameSpeed;

// abit av feilsøkingsalternativer

boolsk bolSerialBoard; // når true vil skrive ut kortet i den serielle skjermen

Trinn 3: Oppsettfunksjonen

Oppsettsløyfen er en funksjon som bare leses av arduinoen når den starter.

I oppsettsløyfen setter vi bare inn verdiene til noen av våre variabler fordi vi i stedet for å sette dem en verdi når vi erklærer dem gjør det her.

Begynn med å sette denne koden i det ugyldige oppsettet.

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

Hver linje setter bare en variabel til en verdi.

bolPlay er satt til false slik at spillet ikke begynner å spille.

intScore er satt til 0, fordi poengsummen din starter naturligvis på 0.

intTick starter på 0 fordi programmet for øyeblikket ikke teller noe.

intDelay er satt til 1000 fordi det er hastigheten flisene starter med.

intDiff er bare en asketisk ting, slik at programmet vet hva de skal skrive for spillets vanskeligheter.

intGameSpeed er satt til hva intGameSpeedMedium er, noe som betyr at det er satt til middels vanskelighetsgrad.

Sett deretter denne koden i Void Setup under koden du nettopp la inn.

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

Serial.begin (9600);

Dette forteller arduinoen å begynne å kommunisere med datamaskinen gjennom den serielle skjermen (synlig ved å klikke på knappen øverst til høyre på arduino IDE).

Din ugyldige oppsett skal nå se slik ut!

ugyldig oppsett () {Serial.begin (9600); // start seriell skjerm // sett opp variablene bolPlay = false; intScore = 0; intTick = 0; intDelay = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium; // begynne lcd's lcdLeft.begin (16, 2); lcdRight.begin (16, 2); }

Trinn 4: Loop -funksjonen

Sløyfefunksjonen drives av arduino hver iterasjon av arduinoen.

Kopier følgende kode til din Void Loop.

void loop () {input (); // sjekk for å spille input hvis (bolPlay == true) {if (intTick> = intDelay) {// sjekk om spillet skal spille en sving eller fortsett å vente Serial.println ("~~~~~~~ ~~ "); // skriv ut for å indikere at tavlen går videre // writeSerial (); // hvis alternativet er aktivert, skriv brettet inn i serielle knapperGame (); // se etter spillerinnganger playBoard (); // flytt brettet og legg til en ny flis clearLcd (); // rengjør LCD -skjermene før du tegner drawBoard (); // tegn brettet på LCD -skjermen bottomCheck (); intTick = 0; // reset intTick} else {buttonsGame (); // se etter spillerinngangene clearLcd (); // rengjør LCD -skjermene før du tegner drawBoard (); // tegne tavlen på lcd's intTick = intTick + intGameSpeed; // legg til i kryss}} else {clearLcd (); // rengjør LCD -skjermene før du tegner tittel (); // Vis tittel og poengsum info knapperMeny (); // lese spillerinngang clearBoard (); // sikre hele brettet = 0} forsinkelse (10); // forsink arduinoen med et kort øyeblikk}

Når bolPlay er lik sann betyr det at spillet spiller, og all koden for når spillet skal kjøres, men vi vil bare at brettet skal legge til en ny brikke og flytte ned når intTick er større enn vår intDelay, ellers ønsker vi fortsatt å la brukeren trykke på en knapp for å treffe en flis og for intTick å øke hastigheten.

Mesteparten av denne koden bruker funksjoner vi ennå ikke har laget, og vi vil gjøre dem i de neste trinnene. Formålet med disse funksjonene er som følger.

Inndata leser hvilke knapper brukeren har trykket på.

buttonsGame styrer hva knappene gjør når de er i spillet, og ikke i menyen

playBoard legger til en ny flis på brettet, og flytter deretter alt i brettet ned ett mellomrom

clearLCD renser LCD -skjermene for å sikre at ingen spøkelser blir etterlatt bak flisene

drawBoard går gjennom arrGame og skriver det ut på LCD -skjermene

clearBoard tømmer hele arrGame når spillet ikke er i spill

bottomCheck sjekker bunnen av arrGame for en feilstilstand

tittel viser spillets tittel og poengsuminformasjon når du er på menyen

knappene meny styrer hva brukerens innganger gjør når de er i menyen.

gameOver er en annen funksjon, selv om den ikke kalles her som den i stedet kalles i bunnen Sjekk og knapper Spillfunksjoner.

Trinn 5: ClearLCD -funksjonen

for å lage en funksjon starter vi med å legge dette til koden

void functionName () {

}

"funksjonsnavn" kan være hva som helst, så lenge det ikke allerede eksisterer.

Kopier denne koden til programmet ditt:

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

dette går gjennom hele matrisen ved å bruke 2 tellede sløyfer for å gå gjennom hvert punkt på LCD -skjermene og skrive et mellomrom.

Uten å bli tilbakestilt til ingenting vil LCD -skjermene opprettholde det som ble skrevet tidligere

Trinn 6: DrawBoard -funksjonen

kopier denne koden til programmet ditt

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 skriv "@" lcdLeft.setCursor (i, 1); // sett til den første kolonnen (lengst til venstre) hvis (arrGame [0] == 1) {lcdLeft.write ("#");} if (arrGame [0] == 2) {lcdLeft.write ("@");} lcdLeft.setCursor (i, 0); // sett til den andre kolonnen (midt til venstre) hvis (arrGame [1] == 1) {lcdLeft.write ("#");} if (arrGame [1] == 2) {lcdLeft.write ("@");} lcdRight.setCursor (i, 1); // sett til den tredje kolonnen (midt til høyre) hvis (arrGame [2] == 1) {lcdRight.write ("#");} if (arrGame [2] == 2) {lcdRight.write ("@");} lcdRight.setCursor (i, 0); // sett til fjerde kolonne (lengst til høyre) hvis (arrGame [3] == 1) {lcdRight.write ("#");} if (arrGame [3] == 2) {lcdRight.skrive("@");} } }

denne bruker en sløyfe for å gå gjennom hver rad på tavlen, den sjekker deretter om en kolonne i raden er lik 1 eller 2, basert på at den deretter skriver ut på LCD -en enten en hashtag, for en flis som ikke skal være hit, eller en @ for en hitflis.

Trinn 7: PlayBoard -funksjonen

kopier denne koden til programmet ditt.

void playBoard () {for (int i = 0; i <= 3; i ++) {arrGame [0] = 0;} // tøm den øverste raden arrGame [0] [random (0, 4)] = 1; // sett et tilfeldig punkt på den øverste raden som en flis for (int i = 15; i> = 1; i-) {// arbeider fra bunnen av brettet til toppen for (int ii = 0; ii <= 3; ii ++) {// for hver collum arrGame [ii] = arrGame [i - 1] [ii]; }}}

denne koden begynner med å fjerne hele den øverste raden til 0, eller ingen flis, og angir deretter en tilfeldig flis til å være en 1 og uhelt flis.

Den går deretter gjennom en tellet sløyfe i revers, fra 15 til 1, og setter raden til lik uansett raden over den er lik, noe som får brettet til å bevege seg nedover LCD -skjermen

Trinn 8: ClearBoard -funksjonen

kopier denne koden til programmet ditt.

void clearBoard () {// tilbakestill kryss og forsink verdier intTick = 0; intDelay = 1000; // gå gjennom tavlen og sett alt til 0 for (int i = 0; i <= 15; i ++) {for (int ii = 0; ii <= 3; ii ++) {arrGame [ii] = 0; }}}

Denne koden kjøres når spillet ikke spilles for å sikre at hele arrGame er satt til 0, eller ingen brikker, ved å bruke tellede løkker for å gå gjennom matrisen.

Koden tilbakestiller også verdiene til intDelay og intTick.

Trinn 9: Tittelfunksjonen

kopier følgende kode til programmet

void title () {// skriv tittel på LCD og plass til score lcdRight.setCursor (0, 0); lcdRight.write ("Pianofliser"); lcdRight.setCursor (0, 1); lcdRight.write ("Poengsum:"); // konverter poengsummen til en string char strScore [3]; sprintf (strScore, "%d", intScore); // vise poengsum på LCD lcdRight.write (strScore); // legg til diffictuly lcdRight.setCursor (10, 1); hvis (intDiff == 0) {lcdRight.write ("Easy"); } if (intDiff == 1) {lcdRight.write ("Medium"); } if (intDiff == 2) {lcdRight.write ("Hard"); } // Trykk på litt instruksjon lcdLeft.setCursor (0, 0); lcdLeft.write ("Trykk Enter"); lcdLeft.setCursor (0, 1); lcdLeft.write ("å begynne!"); }

Denne koden skriver tittelen på spillet og poengsummen på LCD -skjermene, den gjør dette ved å fortelle LCD -en hvor du skal begynne å skrive med LCD.setCursor og deretter skrive strengen i LCD.write.

En ny variabel opprettes også her, strScore, den brukes til å konvertere intScore til en streng- eller char -datatype ved hjelp av sprintf -funksjonen.

intDiff brukes også her, basert på verdiene det skriver ut de forskjellige vanskelighetsalternativene.

Trinn 10: ButtonsMenu -funksjonen

sett inn følgende kode i programmet

void buttonsMenu () {// når enter trykkes, start spillet og tilbakestill poengsumverdien hvis (intEnter == 1) {bolPlay = true; intScore = 0; playBoard (); drawBoard (); } // når knapp 3 trykkes, slå på feilsøkingsalternativ for å skrive ut kortet i serie hvis (intInput == 3) {if (bolSerialBoard == false) {Serial.println ("Serial Board Active"); bolSerialBoard = true; } annet {Serial.println ("Serial Board deaktivert"); bolSerialBoard = false; }} // sett spillhastigheten til enkel vanskelighet hvis (intInput == 0) {Serial.print ("Game satt til easy ("); Serial.print (intGameSpeedEasy); Serial.println ("ms akselerasjon)"); intDiff = 0; intGameSpeed = intGameSpeedEasy; } // sett spillhastigheten til middels vanskelighet hvis (intInput == 1) {Serial.print ("Game satt til medium ("); Serial.print (intGameSpeedMedium); Serial.println ("ms akselerasjon)"); intDiff = 1; intGameSpeed = intGameSpeedMedium; } // sett spillhastigheten til harde vanskeligheter hvis (intInput == 2) {Serial.print ("Game satt til hard ("); Serial.print (intGameSpeedHard); Serial.println ("ms akselerasjon)"); intDiff = 2; intGameSpeed = intGameSpeedHard; }}

denne koden kjøres bare når bolPlay er lik falsk i hulrommet

Hvis intEnter er satt til 1 betyr det at enter -knappen har blitt trykket, hvis den trykkes på, setter programmet bolPlay til true og spillet starter.

Programmet leser deretter hva intInput er lik. Hvis den er lik 0, trykkes den første knappen fra venstre og går opp til høyre opp til 3. Hvis intInput er lik 4, trykkes ingen knapp.

Hvis du trykker på knappene 0-2, endrer spillet vanskeligheten, og justerer også hastigheten på spillet, noe som betyr at det vil akselerere raskere.

Hvis du trykker på knapp 3, vil spillet aktivere eller deaktivere en feilsøkingsmodus der hele brettet skrives ut i den serielle skjermen for å hjelpe til med å finne problemer i programmet.

Trinn 11: ButtonsGame -funksjonen

kopier følgende kode til programmet

void buttonsGame () {if (intInput! = 4) {// hvis en knapp trykkes hvis (bolTilePressed == false) {// bare hvis bolTilePressed er en falsk triggerhandling for å kontrollere et knappetrykk bolTilePressed = true; // sett deretter bolTilePressed til true for å sikre at det ikke utilsiktet utløses igjen int intLowestTile = 0; // som skal settes til flisen med den laveste flisen int intCheckedTile = 15; // for å holde oversikt over hvilke fliser som er sjekket mens (intLowestTile == 0) {// så lenge det ikke er satt til noe, sjekk fliser for (int i = 0; i 100) {// så lenge int forsinkelsen er ikke lavere enn 100 intDelay = intDelay - 20; // ta en verdi fra det}} else {Serial.println ("Feil knapp trykket"); spillet er over(); // ellers er spillet over}}}}}

Koden kjøres bare når bolPlay er lik true i void Loop.

Liker knapper Meny basert på verdien av intInput den sjekker om spilleren har truffet en flis eller savnet en.

Det gjør dette ved å gå gjennom arrGame fra bunn til topp ved å bruke en while -sløyfe for å se etter hvilken rad som er lavest med en unhit -flis. Den kontrollerer deretter om stedet i den raden som tilsvarer knappen du trykker på er en unhit -flis eller ikke, hvis den er unhit, setter den den til lik 2 i stedet for 1, noe som betyr at den vil vises som en @, ellers utløser gameOver funksjon som vi ennå ikke skal lage.

Denne funksjonen benytter også bolTilePressed -variabelen ved å sette den til true når en knapp trykkes og falsk når ingen knapp trykkes. Dette er for å sikre at brukeren ikke ved et uhell mister spillet fordi programmet trodde at de trykket på knappen flere ganger da de holdt det nede.

Trinn 12: GameOver -funksjonen

Kopier følgende kode til programmet ditt

void gameOver () {Serial.println ("Game Over!"); Serial.print ("Poengsummen din var:"); Serial.println (intScore); Serial.print ("Din hastighet var:"); Serial.println (intDelay); bolPlay = false; }

Dette utløses av enten CheckBottom eller buttonsGame -funksjonene og utløser slutten av spillet ved å sette bolPlay til å være falsk.

Den skriver også ut en melding til den serielle skjermen for brukernes poengsum, og hastighetsbrikkene ble lagt til i millisekunder.

Trinn 13: Inngangsfunksjonen

Kopier følgende kode til programmet ditt.

void input () {intEnter = digitalRead (btnEnter); // les enter // les hvilken av de andre inngangene, eller hvis ingen er satt til 4 hvis (digitalRead (btn1) == HIGH) {intInput = 0;} else {if (digitalRead (btn2) == HIGH) {intInput = 1;} annet {if (digitalRead (btn3) == HIGH) {intInput = 2;} else {if (digitalRead (btn4) == HIGH) {intInput = 3;} else {intInput = 4; }}}}} // seriell skrive ut inngangene hvis (intEnter == 1) {Serial.println ("Enter Pressed!");} if (intInput! = 4) {Serial.print ("Button Press:"); Serial.println (intInput); } annet {// hvis ingen knapp trykkes nullstill bolTilePressed bolTilePressed = false; }}

Denne koden brukes med knappene Spill og knapper Meny -funksjoner. basert på knappene brukeren har trykket på, setter den verdien til intInput, eller hvis ingen knapp trykkes, setter den intInput til lik 4.

Hvis det ikke trykkes på en knapp, tilbakestilles bolTilePressed for knappene Spill -funksjonen.

Den skriver også ut en melding til den serielle skjermen som du trykker på knappen på.

Trinn 14: BottomCheck -funksjonen

kopier følgende kode til programmet ditt.

void bottomCheck () {for (int i = 0; i <= 3; i ++) {// for de 4 kolonnene hvis (arrGame [15] == 1) {// hvis en flis er nederst i serienummeret.println ("Flis nederst"); arrGame [15] = 2; drawBoard (); forsinkelse (400); arrGame [15] = 1; drawBoard (); forsinkelse (400); arrGame [15] = 2; drawBoard (); forsinkelse (400); arrGame [15] = 1; drawBoard (); forsinkelse (400); spillet er over(); }}}

ved hjelp av en sløyfe sjekker denne koden den nederste raden av arrGame for eventuelle uhit -fliser (fliser lik 1), hvis det er en uhit -flis nederst på skjermen, blinker den flisen og deretter utløser overspillingsfunksjonen.

Trinn 15: WriteSerial -funksjonen

kopier følgende kode til programmet

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

Dette er funksjonen etterfulgt av feilsøkingsalternativet som kan aktiveres i knappene Meny -funksjon. Hvis bolSerialBoard er satt til true i den funksjonen, går den gjennom arrGame og skriver ut hele kortet på den serielle skjermen for testformål ved å bruke en matrise.

Trinn 16: Fullføring

Fullføring!
Fullføring!

Hele koden din skal ikke være fullstendig og se slik ut!

/ * * Navn - Pianofliser; Arduino * Av - Domenic Marulli * Dato - 11/ *

/ inkluderer biblioteker

#inkludere

// disse variablene er alternativer du kan endre - høyere tall = raskere hastighet på spillet

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

// Definer pins

#define btnEnter A0 #define btn1 15 #define btn2 16 #define btn3 17 #define btn4 18

// lage LCD -objekter (n, ~, n, ~, ~, n)

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

// sette opp spillarray

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

// sette opp variabler for spillet

boolsk bolPlay; // sporer hvis spilleren int intScore; // sporer spillerens poengsum int intDiff; // bare en estetisk ting for å fortelle hvilken vanskelighet spillet er på

// sette opp variabler for input

int intEnter; // sporer hvis brukeren trykker på enter -knappen int intInput; // sporer hvilke knapper brukeren trykker på boolsk bolTilePressed; // sørg for at spilleren ikke ved et uhell trykker på en knapp 5x og taper

// sette opp variabler for tur

int intTick; // teller opp millies (per sløyfe) til intDelay int intDelay; // tiden programmet venter til neste sving i millis int intGameSpeed;

// abit av feilsøkingsalternativer

boolsk bolSerialBoard; // når true vil skrive ut kortet i den serielle skjermen

// oppsettet som skal kjøres en gang

ugyldig oppsett () {Serial.begin (9600); // start seriell skjerm // sett opp variablene bolPlay = false; intScore = 0; intTick = 0; intDelay = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium; // begynne lcd's lcdLeft.begin (16, 2); lcdRight.begin (16, 2); }

// sløyfen som vil bli kjørt hver 10. millisekon

void loop () {input (); // sjekk for å spille input hvis (bolPlay == true) {if (intTick> = intDelay) {// sjekk om spillet skal spille en sving eller fortsett å vente Serial.println ("~~~~~~~ ~~ "); // skriv ut for å indikere at tavlen går videre // writeSerial (); // hvis alternativet er aktivert, skriv brettet inn i serielle knapperGame (); // se etter spillerinnganger playBoard (); // flytt brettet og legg til en ny flis clearLcd (); // rengjør LCD -skjermene før du tegner drawBoard (); // tegn brettet på LCD -skjermen bottomCheck (); intTick = 0; // reset intTick} else {buttonsGame (); // se etter spillerinngangene clearLcd (); // rengjør LCD -skjermene før du tegner drawBoard (); // tegne tavlen på lcd's intTick = intTick + intGameSpeed; // legg til i kryss}} else {clearLcd (); // rengjør LCD -skjermene før du tegner tittel (); // Vis tittel og poengsum info knapperMeny (); // lese spillerinngang clearBoard (); // sikre hele brettet = 0} forsinkelse (10); // forsink arduinoen med et kort øyeblikk}

// renser LCD -skjermen, slik at ikke -sentrerte celler ikke blir igjen der

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

// tegner brettet på LCD -skjermen

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 skriv "@" lcdLeft.setCursor (i, 1); // sett til den første kolonnen (lengst til venstre) hvis (arrGame [0] == 1) {lcdLeft.write ("#");} if (arrGame [0] == 2) {lcdLeft.write ("@");} lcdLeft.setCursor (i, 0); // sett til den andre kolonnen (midt til venstre) hvis (arrGame [1] == 1) {lcdLeft.write ("#");} if (arrGame [1] == 2) {lcdLeft.write ("@");} lcdRight.setCursor (i, 1); // sett til den tredje kolonnen (midt til høyre) hvis (arrGame [2] == 1) {lcdRight.write ("#");} if (arrGame [2] == 2) {lcdRight.write ("@");} lcdRight.setCursor (i, 0); // sett til fjerde kolonne (lengst til høyre) hvis (arrGame [3] == 1) {lcdRight.write ("#");} if (arrGame [3] == 2) {lcdRight.skrive("@");} } }

// flytter brettet ned og plasserer en tilfeldig verdi som en flis

void playBoard () {for (int i = 0; i <= 3; i ++) {arrGame [0] = 0;} // tøm den øverste raden arrGame [0] [random (0, 4)] = 1; // sett et tilfeldig punkt på den øverste raden som en flis for (int i = 15; i> = 1; i-) {// arbeider fra bunnen av brettet til toppen for (int ii = 0; ii <= 3; ii ++) {// for hver collum arrGame [ii] = arrGame [i - 1] [ii]; }}}

// setter hele brettet til 0 og tilbakestiller variabler til forspill

void clearBoard () {// tilbakestill kryss og forsink verdier intTick = 0; intDelay = 1000; // gå gjennom tavlen og sett alt til 0 for (int i = 0; i <= 15; i ++) {for (int ii = 0; ii <= 3; ii ++) {arrGame [ii] = 0; }}}

// viser hovedmenyen på LCD -skjermen

void title () {// skriv tittel på LCD og plass til score lcdRight.setCursor (0, 0); lcdRight.write ("Pianofliser"); lcdRight.setCursor (0, 1); lcdRight.write ("Poengsum:"); // konverter poengsummen til en string char strScore [3]; sprintf (strScore, "%d", intScore); // vise poengsum på LCD lcdRight.write (strScore); // legg til diffictuly lcdRight.setCursor (10, 1); hvis (intDiff == 0) {lcdRight.write ("Easy"); } if (intDiff == 1) {lcdRight.write ("Medium"); } if (intDiff == 2) {lcdRight.write ("Hard"); } // Trykk på litt instruksjon lcdLeft.setCursor (0, 0); lcdLeft.write ("Trykk Enter"); lcdLeft.setCursor (0, 1); lcdLeft.write ("å begynne!"); }

// sjekker knappene og hva de skal gjøre for dem mens de er ute av spillet

void buttonsMenu () {// når enter trykkes, start spillet og tilbakestill poengsumverdien hvis (intEnter == 1) {bolPlay = true; intScore = 0; playBoard (); drawBoard (); } // når knapp 3 trykkes, slå på feilsøkingsalternativ for å skrive ut kortet i serie hvis (intInput == 3) {if (bolSerialBoard == false) {Serial.println ("Serial Board Active"); bolSerialBoard = true; } annet {Serial.println ("Serial Board deaktivert"); bolSerialBoard = false; }} // sett spillhastigheten til enkel vanskelighet hvis (intInput == 0) {Serial.print ("Game satt til easy ("); Serial.print (intGameSpeedEasy); Serial.println ("ms akselerasjon)"); intDiff = 0; intGameSpeed = intGameSpeedEasy; } // sett spillhastigheten til middels vanskelighet hvis (intInput == 1) {Serial.print ("Game satt til medium ("); Serial.print (intGameSpeedMedium); Serial.println ("ms akselerasjon)"); intDiff = 1; intGameSpeed = intGameSpeedMedium; } // sett spillhastigheten til harde vanskeligheter hvis (intInput == 2) {Serial.print ("Game satt til hard ("); Serial.print (intGameSpeedHard); Serial.println ("ms akselerasjon)"); intDiff = 2; intGameSpeed = intGameSpeedHard; }}

// sjekker knappene og hva de skal gjøre for dem mens de er i spillet

void buttonsGame () {if (intInput! = 4) {// hvis en knapp trykkes hvis (bolTilePressed == false) {// bare hvis bolTilePressed er en falsk triggerhandling for å kontrollere et knappetrykk bolTilePressed = true; // sett deretter bolTilePressed til true for å sikre at det ikke utilsiktet utløses igjen int intLowestTile = 0; // som skal settes til flisen med den laveste flisen int intCheckedTile = 15; // for å holde oversikt over hvilke fliser som er sjekket mens (intLowestTile == 0) {// så lenge det ikke er satt til noe, sjekk fliser for (int i = 0; i 100) {// så lenge int forsinkelsen er ikke lavere enn 100 intDelay = intDelay - 20; // ta en verdi fra det}} else {Serial.println ("Feil knapp trykket"); spillet er over(); // ellers er spillet over}}}}}

void gameOver () {

Serial.println ("Game Over!"); Serial.print ("Poengsummen din var:"); Serial.println (intScore); Serial.print ("Hastigheten din var:"); Serial.println (intDelay); bolPlay = false; }

// sjekker om spillerinngang

void input () {intEnter = digitalRead (btnEnter); // les enter // les hvilken av de andre inngangene, eller hvis ingen er satt til 4 hvis (digitalRead (btn1) == HIGH) {intInput = 0;} else {if (digitalRead (btn2) == HIGH) {intInput = 1;} annet {if (digitalRead (btn3) == HIGH) {intInput = 2;} else {if (digitalRead (btn4) == HIGH) {intInput = 3;} else {intInput = 4; }}}}} // seriell skrive ut inngangene hvis (intEnter == 1) {Serial.println ("Enter Pressed!");} if (intInput! = 4) {Serial.print ("Button Press:"); Serial.println (intInput); } annet {// hvis ingen knapp trykkes nullstill bolTilePressed bolTilePressed = false; }}

// kontrollerer bunnen av brettet for feil

void bottomCheck () {for (int i = 0; i <= 3; i ++) {// for de 4 kolonnene hvis (arrGame [15] == 1) {// hvis en flis er nederst i serienummeret.println ("Flis nederst"); arrGame [15] = 2; drawBoard (); forsinkelse (400); arrGame [15] = 1; drawBoard (); forsinkelse (400); arrGame [15] = 2; drawBoard (); forsinkelse (400); arrGame [15] = 1; drawBoard (); forsinkelse (400); spillet er over(); }}}

// skriver ut kortet inn i den serielle skjermen hvis bolSerialBoard er sant

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

Når all koden er lagt inn, last opp til arduinoen din og nyt!

Anbefalt: