Stap 4: Codering het spel voor 2 spelers.
Om de code van de 2-speler spel heb ik besloten dat het beste zou zijn om het te bouwen als eigen schets dan integreren met de belangrijkste schets. Dit liet mij gemakkelijker oplossen van eventuele problemen die ik tegenkwam. Ik had al stuiteren rond ideeën voor de code in mijn hoofd voor de afgelopen paar dagen. Dus wist ik wat de algemene stroom van de code zou zijn. Maar het duurde 4 rechte uren van codering eindelijk ertoe brengen om te werken. Het verbaast me altijd hoe de kleinste fouten kan zo veel probleem. Zelfs het omdat van een enkele regel aan het begin van een functie als het zou werken kan beter aan het eind dergelijke problemen veroorzaken.Ik besloot te gaan en de code van het spel van de standalone speler 2. De code is niet zo verfijnd en wellicht een beetje buggy. Maar het was alleen bedoeld als een sjabloon voor de speler 2 optie krijgen up and running. Geen zin in het verfijnen van het toen het ging naar de belangrijkste code hoe dan ook worden gekopieerd had. Ik begon met het spel van Simon Says van mijn andere Instructable en de 2 spelerspel opgebouwd vanaf daar na het verwijderen van zoals de meeste van de audio kant van de code en de seriële oproepen code overbodige.
#include < Tone.h > //call aan Toon bibliotheek
#include < LiquidCrystal.h > //call LiquidCrustal bibliotheekToon speakerpin; Laat de spreker
LiquidCrystal lcd (13, 12, 16, 17, 18 en 19); pinnen voor LCD display
Booleaanse knop [] = {2, 3, 4, 5}; De vier knop input pinnen
Booleaanse ledpin [] {8, 9, 10, 11} =; LED pinnenint draaien = 0;
int buttonstate = 0; knop staat checker
int randomArray [100]; Opzettelijk lang voor het opslaan van maximaal 100 ingangen (twijfelachtig iedereen krijgt dit ver)
int inputArray [100]; gebruikt voor de controle knop duwt tegen de matrix
int speler = 1;
int vorderingen = 0;VOID Setup
{
LCD.begin (16, 2);
speakerpin.begin(6); spreker is op pin 13
voor (int x = 0; x < 4; x ++) / / LED pinnen zijn uitgangen
{
pinMode (ledpin [x], OUTPUT);
}
voor (int x = 0; x < 4; x ++)
{
pinMode (knop [x], INPUT); knop pinnen zijn ingangen
digitalWrite (knop [x] hoge); inschakelen van interne pullup; toetsen beginnen in hoge positie; logica omgedraaid
}
LCD.Clear();
}void loop
{
LCD.Clear();
Als (speler == 1)
{
lcd.setCursor(0,0);
LCD.Print ("speler 1!");
}
Als (speler == 2)
{
lcd.setCursor(0,0);
LCD.Print ("speler 2!");
}
lcd.setCursor(0,1);
LCD.Print ("Kies een knop");
delay(150);
voor (int v = 0; v < 4; v ++)
{
buttonstate = digitalRead(button[v]);
Als (buttonstate == LOW & & knop [v] == 2)
{//Checking voor knop duwen
digitalWrite (ledpin [0], hoge);
speakerpin.Play (NOTE_G3, 100);
delay(500);
digitalWrite (ledpin [0], laag);
randomArray [vooruitgang] = 1;
Als (speler == 1)
{
speler ++;
vooruitgang ++;
delay(500);
output();
terugkeer;
}
Als (speler == 2)
{
speler--;
vooruitgang ++;
delay(500);
output();
terugkeer;
}
}
Als (buttonstate == LOW & & knop [v] == 3)
{
digitalWrite (ledpin [1], hoge);
speakerpin.Play (NOTE_A3, 100);
delay(200);
digitalWrite (ledpin [1], laag);
randomArray [vooruitgang] = 2;
Als (speler == 1)
{
speler ++;
vooruitgang ++;
delay(500);
output();
terugkeer;
}
Als (speler == 2)
{
speler--;
vooruitgang ++;
delay(500);
output();
terugkeer;
}
}
Als (buttonstate == LOW & & knop [v] == 4)
{
digitalWrite (ledpin [2], hoge);
speakerpin.Play (NOTE_B3, 100);
delay(200);
digitalWrite (ledpin [2], laag);
randomArray [vooruitgang] = 3;
Als (speler == 1)
{
speler ++;
vooruitgang ++;
delay(500);
output();
terugkeer;
}
Als (speler == 2)
{
speler--;
vooruitgang ++;
delay(500);
output();
terugkeer;
}
}
Als (buttonstate == LOW & & knop [v] == 5)
{
digitalWrite (ledpin [3], hoge);
speakerpin.Play (NOTE_C4, 100);
delay(200);
digitalWrite (ledpin [3], laag);
randomArray [vooruitgang] = 4;
Als (speler == 1)
{
speler ++;
vooruitgang ++;
delay(500);
output();
terugkeer;
}
Als (speler == 2)
{
speler--;
vooruitgang ++;
delay(500);
output();
terugkeer;
}
}
}
}
VOID output()
{
LCD.Clear();
Als (speler == 1)
{
lcd.setCursor(0,0);
LCD.Print ("1 speler");
}
Als (speler == 2)
{
lcd.setCursor(0,0);
LCD.Print ("speler 2");
}
lcd.setCursor(0,1);
LCD.Print ("Watch the lights");
delay(1000);
voor (int x = 0; x < = beurt; x ++)
{
voor (int y = 0; y < 4; y ++)
{
Als (randomArray [x] == 1 & & ledpin [y] == 8)
{//if verklaringen om weer te geven van de opgeslagen waarden in de matrix
digitalWrite (ledpin [y], hoge);
speakerpin.Play (NOTE_G3, 100);
delay(400);
digitalWrite (ledpin [y], laag);
delay(100);
}
Als (randomArray [x] == 2 & & ledpin [y] == 9)
{
digitalWrite (ledpin [y], hoge);
speakerpin.Play (NOTE_A3, 100);
delay(400);
digitalWrite (ledpin [y], laag);
delay(100);
}
Als (randomArray [x] == 3 & & ledpin [y] == 10)
{
digitalWrite (ledpin [y], hoge);
speakerpin.Play (NOTE_B3, 100);
delay(400);
digitalWrite (ledpin [y], laag);
delay(100);
}
Als (randomArray [x] == 4 & & ledpin [y] == 11)
{
digitalWrite (ledpin [y], hoge);
speakerpin.Play (NOTE_C4, 100);
delay(400);
digitalWrite (ledpin [y], laag);
delay(100);
}
}
}
input2();
}
VOID input2() {//Function voor het toestaan van gebruikersinvoer en controleren van de invoer tegen de gegenereerde matrix
LCD.Clear();
Als (speler == 1)
{
lcd.setCursor(0,0);
LCD.Print ("1 speler");
}
Als (speler == 2)
{
lcd.setCursor(0,0);
LCD.Print ("speler 2");
}
lcd.setCursor(0,1);
LCD.Print ("Repeat volgorde");
delay(150);
voor (int x = 0; x < = beurt;)
{//Statement gecontroleerd door zet de graaf
voor (int y = 0; y < 4; y ++)
{
buttonstate = digitalRead(button[y]);
Als (buttonstate == LOW & & knop [y] == 2)
{//Checking voor knop duwen
digitalWrite (ledpin [0], hoge);
speakerpin.Play (NOTE_G3, 100);
delay(200);
digitalWrite (ledpin [0], laag);
inputArray [x] = 1;
delay(250);
Als (inputArray [x]! = randomArray[x]) {//Checks waarde input door gebruiker en controleert het tegen
Fail(); de waarde op dezelfde plek op de gegenereerde array
} //The fail functie wordt aangeroepen als het niet overeenkomt met
x ++;
}
Als (buttonstate == LOW & & knop [y] == 3)
{
digitalWrite (ledpin [1], hoge);
speakerpin.Play (NOTE_A3, 100);
delay(200);
digitalWrite (ledpin [1], laag);
inputArray [x] = 2;
delay(250);
Als (inputArray [x]! = randomArray[x]) {}
Fail();
}
x ++;
}
Als (buttonstate == LOW & & knop [y] == 4)
{
digitalWrite (ledpin [2], hoge);
speakerpin.Play (NOTE_B3, 100);
delay(200);
digitalWrite (ledpin [2], laag);
inputArray [x] = 3;
delay(250);
Als (inputArray [x]! = randomArray[x]) {}
Fail();
}
x ++;
}
Als (buttonstate == LOW & & knop [y] == 5)
{
digitalWrite (ledpin [3], hoge);
speakerpin.Play (NOTE_C4, 100);
delay(200);
digitalWrite (ledpin [3], laag);
inputArray [x] = 4;
delay(250);
Als (inputArray [x]! = randomArray[x])
{
Fail();
}
x ++;
}
}
}
delay(500);
beurt ++; Verhoogt de beurt tellen, ook de laatste handeling voordat de uitgangsfunctie opnieuw
loop;
}
VOID fail() {//Function gebruikt als de speler niet overeenkomt met de reeks opdrachten
LCD.Clear();
Als (spel == 2 & & speler == 1)
{
lcd.setCursor(0,0);
LCD.Print ("speler 1!");
}
Als (spel == 2 & & speler == 2)
{
lcd.setCursor(0,0);
LCD.Print ("speler 2!");
}
lcd.setCursor(0,1);
LCD.Print ("u losse!');
delay(150);
voor (int y = 0; y < = 2; y ++)
{//Flashes licht voor mislukking
digitalWrite (ledpin [0], hoge);
digitalWrite (ledpin [1], hoge);
digitalWrite (ledpin [2], hoge);
digitalWrite (ledpin [3], hoge);
speakerpin.Play (NOTE_G3, 300);
delay(200);
digitalWrite (ledpin [0], laag);
digitalWrite (ledpin [1], laag);
digitalWrite (ledpin [2], laag);
digitalWrite (ledpin [3], laag);
speakerpin.Play (NOTE_C3, 300);
delay(200);
}
delay(500);
voor (int x = 0; x < 100; x ++) //clears matrix
{
randomArray [x] = 0;
}
vooruitgang = 0;
speler = 1;
Draai = -1; Hiermee herstelt u terecht waarde het spel opnieuw gestart zonder noodzaak van een reset-knop
}
Als u besluit om te proberen deze code zich bewust dat kunnen er enkele bugs. De tonen voor de knoppen/LED's zijn er, maar alle andere muziek en tonen zijn niet.