Total Recall - Arduino Simon Says på steroider! (4 / 6 steg)
Steg 4: Kodning av 2 spelare.
För att koden 2 spelaren spelet bestämde jag mig för det skulle vara bäst att bygga den som en egen skiss och sedan integrera den i den huvudsakliga skissen. Detta får mig att lättare felsöka problem jag kom över. Jag hade studsar runt idéer för koden i huvudet under de senaste dagarna. Så visste jag vad det allmänna flödet av koden skulle vara. Men det tog 4 timmar i sträck av kodning för att äntligen få det att fungera. Det förvånar mig alltid hur de minsta misstag kan orsaka så många problem. Även placeringen av en enda rad i början av en funktion när det skulle fungera kan bättre i slutet orsaka sådana problem.Jag bestämde mig att gå vidare och inkludera kod från de 2 fristående spelare. Koden är inte lika raffinerad och kan vara lite buggig. Men det var bara menat som en mall för att få alternativet 2 spelare upp och kör. Det var meningslöst att förfina det när det kommer att kopieras över till huvudkoden ändå. Jag började med Simon Says game från min andra Instructable och byggde 2 spelare spelet därifrån efter att ta bort onödiga kod som de flesta av koden och följetong samtal ljud sida.
#include < Tone.h > //call till tonen bibliotek
#include < LiquidCrystal.h > //call LiquidCrustal bibliotekTone speakerpin; gör att talaren
LiquidCrystal lcd (13, 12, 16, 17, 18, 19); stift för LCD-skärm
booleska knappen [] = {2, 3, 4, 5}; Fyra knappen input stiften
booleska ledpin [] = {8, 9, 10, 11}; LED stiftint vända = 0;
int buttonstate = 0; knappen stat checker
int randomArray [100]. Avsiktligt länge att lagra upp till 100 ingångar (tveksamt någon vilja få detta långt)
int inputArray [100]. används för att kontrollera knapptryckningar mot matrisen
int spelare = 1;
int framsteg = 0;void setup()
{
LCD.BEGIN (16, 2);
speakerpin.BEGIN(6); högtalaren är på stift 13för (int x = 0; x < 4; x ++) / / LED stift är utgångar
{
pinMode (ledpin [x], produktionen);
}för (int x = 0; x < 4; x ++)
{
pinMode (knappen [x], indata); knappen stift är ingångar
digitalWrite (knappen [x], hög); Aktivera inre pullup; knapparna starta i hög position; logiken omvänd
}
LCD.Clear();
}void loop()
{
LCD.Clear();
om (spelare == 1)
{
lcd.setCursor(0,0);
LCD.Print ("Player 1!");
}
om (spelare == 2)
{
lcd.setCursor(0,0);
LCD.Print ("spelare 2!");
}
lcd.setCursor(0,1);
LCD.Print ("Välj en knapp");
Delay(150);
för (int v = 0; v < 4; v ++)
{ButtonState = digitalRead(button[v]);
om (buttonstate == låg & & knappen [v] == 2)
{//Checking för knappen push
digitalWrite (ledpin [0], hög);
speakerpin.Play (NOTE_G3, 100);
Delay(500);
digitalWrite (ledpin [0], låg);
randomArray [framsteg] = 1;om (spelare == 1)
{
Player ++;
framsteg ++;
Delay(500);
output();
hemkomst.
}
om (spelare == 2)
{
spelare--;
framsteg ++;
Delay(500);
output();
hemkomst.
}}
om (buttonstate == låg & & knappen [v] == 3)
{
digitalWrite (ledpin [1], hög);
speakerpin.Play (NOTE_A3, 100);
Delay(200);
digitalWrite (ledpin [1], låg);
randomArray [framsteg] = 2;om (spelare == 1)
{
Player ++;
framsteg ++;
Delay(500);
output();
hemkomst.
}
om (spelare == 2)
{
spelare--;
framsteg ++;
Delay(500);
output();
hemkomst.
}}
om (buttonstate == låg & & knappen [v] == 4)
{
digitalWrite (ledpin [2], hög);
speakerpin.Play (NOTE_B3, 100);
Delay(200);
digitalWrite (ledpin [2], låg);
randomArray [framsteg] = 3;om (spelare == 1)
{
Player ++;
framsteg ++;
Delay(500);
output();
hemkomst.
}
om (spelare == 2)
{
spelare--;
framsteg ++;
Delay(500);
output();
hemkomst.
}}
om (buttonstate == låg & & knappen [v] == 5)
{
digitalWrite (ledpin [3], hög);
speakerpin.Play (NOTE_C4, 100);
Delay(200);
digitalWrite (ledpin [3], låg);
randomArray [framsteg] = 4;om (spelare == 1)
{
Player ++;
framsteg ++;
Delay(500);
output();
hemkomst.
}
om (spelare == 2)
{
spelare--;
framsteg ++;
Delay(500);
output();
hemkomst.
}
}
}
}
void output()
{
LCD.Clear();
om (spelare == 1)
{
lcd.setCursor(0,0);
LCD.Print ("Player 1");
}
om (spelare == 2)
{
lcd.setCursor(0,0);
LCD.Print ("spelare 2");
}
lcd.setCursor(0,1);
LCD.Print ("se ljuset");
Delay(1000);
för (int x = 0; x < = slå; x ++)
{
för (int y = 0; y < 4; y ++)
{
om (randomArray [x] == 1 & & ledpin [y] == 8)
{//if deklarationer Visa lagrade värden i matrisen
digitalWrite (ledpin [y], hög);
speakerpin.Play (NOTE_G3, 100);
Delay(400);
digitalWrite (ledpin [y], låg);
Delay(100);
}
om (randomArray [x] == 2 & & ledpin [y] == 9)
{
digitalWrite (ledpin [y], hög);
speakerpin.Play (NOTE_A3, 100);
Delay(400);
digitalWrite (ledpin [y], låg);
Delay(100);
}
om (randomArray [x] == 3 & & ledpin [y] == 10)
{
digitalWrite (ledpin [y], hög);
speakerpin.Play (NOTE_B3, 100);
Delay(400);
digitalWrite (ledpin [y], låg);
Delay(100);
}
om (randomArray [x] == 4 & & ledpin [y] == 11)
{
digitalWrite (ledpin [y], hög);
speakerpin.Play (NOTE_C4, 100);
Delay(400);
digitalWrite (ledpin [y], låg);
Delay(100);
}
}
}
INPUT2();
}
void input2() {//Function för att tillåta användarindata och kontrollera ingång mot genererade matrisen
LCD.Clear();
om (spelare == 1)
{
lcd.setCursor(0,0);
LCD.Print ("Player 1");
}
om (spelare == 2)
{
lcd.setCursor(0,0);
LCD.Print ("spelare 2");
}
lcd.setCursor(0,1);
LCD.Print ("Repeat sequence");
Delay(150);
för (int x = 0; x < = slå;)
{//Statement kontrolleras av vända greve
för (int y = 0; y < 4; y ++)
{
ButtonState = digitalRead(button[y]);
om (buttonstate == låg & & knappen [y] == 2)
{//Checking för knappen push
digitalWrite (ledpin [0], hög);
speakerpin.Play (NOTE_G3, 100);
Delay(200);
digitalWrite (ledpin [0], låg);
inputArray [x] = 1;
Delay(250);
om (inputArray [x]! = randomArray[x]) {//Checks värde input av användare och kontrollerar att den mot
Fail(); värdet i samma plats på den genererade arrayen
} //The misslyckas funktion kallas om det inte matchar
x ++;
}
om (buttonstate == låg & & knappen [y] == 3)
{
digitalWrite (ledpin [1], hög);
speakerpin.Play (NOTE_A3, 100);
Delay(200);
digitalWrite (ledpin [1], låg);
inputArray [x] = 2;
Delay(250);
om (inputArray [x]! = randomArray[x]) {
Fail();
}
x ++;
}
om (buttonstate == låg & & knappen [y] == 4)
{
digitalWrite (ledpin [2], hög);
speakerpin.Play (NOTE_B3, 100);
Delay(200);
digitalWrite (ledpin [2], låg);
inputArray [x] = 3;
Delay(250);
om (inputArray [x]! = randomArray[x]) {
Fail();
}
x ++;
}
om (buttonstate == låg & & knappen [y] == 5)
{
digitalWrite (ledpin [3], hög);
speakerpin.Play (NOTE_C4, 100);
Delay(200);
digitalWrite (ledpin [3], låg);
inputArray [x] = 4;
Delay(250);
om (inputArray [x]! = randomArray[x])
{
Fail();
}
x ++;
}
}
}
Delay(500);
tur ++; Ökar antalet tur, även den senaste åtgärden innan du startar funktionen output om igen
loop();
}
void fail() {//Function används om spelaren inte matchar sekvensen
LCD.Clear();
om (spel == 2 & & spelare == 1)
{
lcd.setCursor(0,0);
LCD.Print ("Player 1!");
}
om (spel == 2 & & spelare == 2)
{
lcd.setCursor(0,0);
LCD.Print ("spelare 2!");
}
lcd.setCursor(0,1);
LCD.Print ("du lös!");
Delay(150);
för (int y = 0; y < = 2; y ++)
{//Flashes ljus för misslyckande
digitalWrite (ledpin [0], hög);
digitalWrite (ledpin [1], hög);
digitalWrite (ledpin [2], hög);
digitalWrite (ledpin [3], hög);
speakerpin.Play (NOTE_G3, 300);
Delay(200);
digitalWrite (ledpin [0], låg);
digitalWrite (ledpin [1], låg);
digitalWrite (ledpin [2], låg);
digitalWrite (ledpin [3], låg);
speakerpin.Play (NOTE_C3, 300);
Delay(200);
}
Delay(500);
för (int x = 0; x < 100; x ++) //clears array
{
randomArray [x] = 0;
}
framsteg = 0;
Player = 1;
sväng = -1; Återställer stänga värde så att spelet startar över utan behov av en återställningsknapp
}
Om du vill prova denna kod vara medvetna om det kan finnas några fel. Toner för knappar/lysdioder finns där men alla andra musik och toner finns inte.