Paso 4: Codificación del juego de 2 jugadores.
Para el jugador 2 el código juego decidí que sería mejor construir como su propio bosquejo y luego integrarlo en el bosquejo principal. Esto me permitió solucionar más fácilmente problemas que encontré. Yo había sido rebotando ideas para el código en mi cabeza para los últimos días. Así que sabía lo que sería el flujo general del código. Pero tomó 4 horas rectas de codificación para finalmente conseguirlo para trabajar. Siempre me sorprende cómo los pequeños errores pueden causar tantos problemas. Incluso el extravío de una sola línea al principio de una función cuando se trabaja mejor el final puede causar tales problemas.Decidí seguir adelante e incluir el código del juego 2 player standalone. El código no es tan refinado y puede ser un poco buggy. Pero sólo fue significado como una plantilla para levantarse la opción de 2 jugadores y el funcionamiento. No tenía sentido en las refinerías cuando iba a ser copiado al código principal de todos modos. Comencé con el juego de Simon Says de mi otros Instructable y había construido el juego de 2 jugadores a partir de allí después de eliminar innecesario código como la mayoría de la parte de audio del código y pide serial.
#include < Tone.h > //call a la biblioteca de tono
#include < LiquidCrystal.h > //call a LiquidCrustal bibliotecaTono speakerpin; permite que el altavoz
LiquidCrystal lcd (13, 12, 16, 17, 18, 19); Pins para pantalla LCD
botón Boolean [] = {2, 3, 4, 5}; Los cuatro botón pines de entrada
ledpin Boolean [] = {8, 9, 10, 11}; Pasadores LEDint vuelta = 0;
int buttonstate = 0; Comprobador de estado de botón
randomArray int [100]; Intencionalmente de largo para almacenar hasta 100 entradas (dudoso que nadie conseguirá esto ahora)
int inputArray [100]; utilizado para el control de botón empuja contra la matriz
int jugador = 1;
progreso de int = 0;void setup()
{
LCD.Begin (16, 2);
speakerpin.Begin(6); es en el pin 13
para (int x = 0; x < 4; x ++) / / LED alfileres son salidas
{
pinMode (ledpin [x], salida);
}
para (int x = 0; x < 4; x ++)
{
pinMode (botón [x], INPUT); botón pines son entradas
digitalWrite (botón [x], HIGH); permiten pullup interna; botones de inicio en posición alta; lógica invertida
}
LCD.Clear();
}void loop()
{
LCD.Clear();
Si (jugador == 1)
{
lcd.setCursor(0,0);
LCD.Print ("jugador 1!");
}
Si (jugador == 2)
{
lcd.setCursor(0,0);
LCD.Print ("jugador 2!");
}
lcd.setCursor(0,1);
LCD.Print ("Seleccione un botón");
Delay(150);
para (int v = 0; v < 4; v ++)
{
ButtonState = digitalRead(button[v]);
Si (buttonstate == baja & & botón [v] == 2)
{//Checking para pulsar botón
digitalWrite (ledpin [0], HIGH);
speakerpin.Play (NOTE_G3, 100);
Delay(500);
digitalWrite (ledpin [0], LOW);
randomArray [progreso] = 1;
Si (jugador == 1)
{
reproductor ++;
progreso ++;
Delay(500);
Output();
retorno;
}
Si (jugador == 2)
{
jugador--;
progreso ++;
Delay(500);
Output();
retorno;
}
}
Si (buttonstate == baja & & botón [v] == 3)
{
digitalWrite (ledpin [1], HIGH);
speakerpin.Play (NOTE_A3, 100);
Delay(200);
digitalWrite (ledpin [1], LOW);
randomArray [progreso] = 2;
Si (jugador == 1)
{
reproductor ++;
progreso ++;
Delay(500);
Output();
retorno;
}
Si (jugador == 2)
{
jugador--;
progreso ++;
Delay(500);
Output();
retorno;
}
}
Si (buttonstate == baja & & botón [v] == 4)
{
digitalWrite (ledpin [2], HIGH);
speakerpin.Play (NOTE_B3, 100);
Delay(200);
digitalWrite (ledpin [2], LOW);
randomArray [progreso] = 3;
Si (jugador == 1)
{
reproductor ++;
progreso ++;
Delay(500);
Output();
retorno;
}
Si (jugador == 2)
{
jugador--;
progreso ++;
Delay(500);
Output();
retorno;
}
}
Si (buttonstate == baja & & botón [v] == 5)
{
digitalWrite (ledpin [3], HIGH);
speakerpin.Play (NOTE_C4, 100);
Delay(200);
digitalWrite (ledpin [3], LOW);
randomArray [curso] = 4;
Si (jugador == 1)
{
reproductor ++;
progreso ++;
Delay(500);
Output();
retorno;
}
Si (jugador == 2)
{
jugador--;
progreso ++;
Delay(500);
Output();
retorno;
}
}
}
}
void output()
{
LCD.Clear();
Si (jugador == 1)
{
lcd.setCursor(0,0);
LCD.Print ("jugador 1");
}
Si (jugador == 2)
{
lcd.setCursor(0,0);
LCD.Print ("jugador 2");
}
lcd.setCursor(0,1);
LCD.Print ("ver las luces");
Delay(1000);
para (int x = 0; x < = vuelta; x ++)
{
para (int y = 0; y < 4; y ++)
{
Si (randomArray [x] == 1 & & ledpin [y] == 8)
{sentencias //if para mostrar los valores almacenados en la matriz
digitalWrite (ledpin [y], HIGH);
speakerpin.Play (NOTE_G3, 100);
Delay(400);
digitalWrite (ledpin [y], LOW);
Delay(100);
}
Si (randomArray [x] == 2 & & ledpin [y] == 9)
{
digitalWrite (ledpin [y], HIGH);
speakerpin.Play (NOTE_A3, 100);
Delay(400);
digitalWrite (ledpin [y], LOW);
Delay(100);
}
Si (randomArray [x] == 3 & & ledpin [y] == 10)
{
digitalWrite (ledpin [y], HIGH);
speakerpin.Play (NOTE_B3, 100);
Delay(400);
digitalWrite (ledpin [y], LOW);
Delay(100);
}
Si (randomArray [x] == 4 & & ledpin [y] == 11)
{
digitalWrite (ledpin [y], HIGH);
speakerpin.Play (NOTE_C4, 100);
Delay(400);
digitalWrite (ledpin [y], LOW);
Delay(100);
}
}
}
INPUT2();
}
void input2() {//Function para permitir la entrada del usuario y comprobación de entrada contra la matriz generada
LCD.Clear();
Si (jugador == 1)
{
lcd.setCursor(0,0);
LCD.Print ("jugador 1");
}
Si (jugador == 2)
{
lcd.setCursor(0,0);
LCD.Print ("jugador 2");
}
lcd.setCursor(0,1);
LCD.Print "(secuencia de la repetición del);
Delay(150);
para (int x = 0; x < = vuelta;)
{//Statement controlado por girar a la cuenta
para (int y = 0; y < 4; y ++)
{
ButtonState = digitalRead(button[y]);
Si (buttonstate == baja & & botón [y] == 2)
{//Checking para pulsar botón
digitalWrite (ledpin [0], HIGH);
speakerpin.Play (NOTE_G3, 100);
Delay(200);
digitalWrite (ledpin [0], LOW);
inputArray [x] = 1;
Delay(250);
Si (inputArray [x]! = randomArray[x]) {entrada de valor //Checks por el usuario y los controles contra
FAIL(); el valor en el mismo lugar en la matriz generada
} Se llama función de fail //The si no coincide con
x ++;
}
Si (buttonstate == baja & & botón [y] == 3)
{
digitalWrite (ledpin [1], HIGH);
speakerpin.Play (NOTE_A3, 100);
Delay(200);
digitalWrite (ledpin [1], LOW);
inputArray [x] = 2;
Delay(250);
Si (inputArray [x]! = {randomArray[x])}
FAIL();
}
x ++;
}
Si (buttonstate == baja & & botón [y] == 4)
{
digitalWrite (ledpin [2], HIGH);
speakerpin.Play (NOTE_B3, 100);
Delay(200);
digitalWrite (ledpin [2], LOW);
inputArray [x] = 3;
Delay(250);
Si (inputArray [x]! = {randomArray[x])}
FAIL();
}
x ++;
}
Si (buttonstate == baja & & botón [y] == 5)
{
digitalWrite (ledpin [3], HIGH);
speakerpin.Play (NOTE_C4, 100);
Delay(200);
digitalWrite (ledpin [3], LOW);
inputArray [x] = 4;
Delay(250);
Si (inputArray [x]! = randomArray[x])
{
FAIL();
}
x ++;
}
}
}
Delay(500);
a su vez ++; Aumenta la cuenta a su vez, también la última acción antes de iniciar la función de salida de nuevo
Loop();
}
void fail() {//Function utilizado si el jugador no coincide con la secuencia
LCD.Clear();
Si (juego == 2 & & jugador == 1)
{
lcd.setCursor(0,0);
LCD.Print ("jugador 1!");
}
Si (juego == 2 & & jugador == 2)
{
lcd.setCursor(0,0);
LCD.Print ("jugador 2!");
}
lcd.setCursor(0,1);
LCD.Print ("te suelto!");
Delay(150);
para (int y = 0; y < = 2; y ++)
{//Flashes de luces para el fracaso
digitalWrite (ledpin [0], HIGH);
digitalWrite (ledpin [1], HIGH);
digitalWrite (ledpin [2], HIGH);
digitalWrite (ledpin [3], HIGH);
speakerpin.Play (NOTE_G3, 300);
Delay(200);
digitalWrite (ledpin [0], LOW);
digitalWrite (ledpin [1], LOW);
digitalWrite (ledpin [2], LOW);
digitalWrite (ledpin [3], LOW);
speakerpin.Play (NOTE_C3, 300);
Delay(200);
}
Delay(500);
para (int x = 0; x < 100; x ++) //clears matriz
{
randomArray [x] = 0;
}
progreso = 0;
jugador = 1;
vuelta = -1; Restablece gire valor para que el juego se inicia sin necesidad de un botón de reset
}
Si decides probar este código tenga en cuenta que puede haber algunos errores. Los tonos de los botones/LED existen pero no son todas las canciones y tonos.