Problemas con condiciones if

Estoy haciendo un juego de trivias con 4 botones: jugador1, jugador2, respuesta correcta y respuesta incorrecta. También de 2 leds: led1 y led2. El propósito del juego es que un juez haga una pregunta y quién sepa la respuesta oprima primero su botón encendiendo su led y el LED del otro jugador no encenderá aunque lo siga presionando, si la respuesta es correcta el juez oprimira el botón de respuesta correcta y el contador sumará un punto a ese jugador, al sumar 5 puntos el contador se reiniciará y su led parpadeara.

El problema es que el LED que se enciende es el de el último jugador que presiona su botón y para que el contador sume 1 debo mantener el botón de el jugador y el de respuesta correcta al mismo tiempo.

//Incluir boton para resetear el juego de manera manual
int p1=3;  //BOTON para el JUGADOR 1
int led1=4;  //LED que indicarà que el TURNO para responder del JUGADOR 1
int conta1=0;  //CONTADOR 1 INICIA EN 0
int p2=5;  //BOTON para el JUGADOR 2
int led2=6;  //LED que indicarà que el TURNO para responder del JUGADOR 2
int conta2=0;//CONTADOR 2 INICIA EN 0
int correcto=7;  //BOTON para indicar que la RESPUESTA es CORRECTA
int incorrecto=8;  //BOTON para indicar que la RESPUESTA es INCORRECTA
void setup() {
  Serial.begin(9600);
  pinMode(p1,INPUT);
  pinMode(led1,OUTPUT);
  pinMode(p2,INPUT);
  pinMode(led2,OUTPUT);
  pinMode(correcto,INPUT);
  pinMode(incorrecto,INPUT);

}

void loop() {
  //P1 RESPONDE 1ro y RESPUESTA CORRECTA
  if (digitalRead(p1)==HIGH && digitalRead(p2)==LOW){
    digitalWrite(led1,HIGH);
    digitalWrite(led2,LOW);
  if (digitalRead(p1)==LOW && digitalRead(p2)==LOW && digitalRead(correcto)==HIGH){
    digitalWrite(led1,LOW);
    conta1++;
    Serial.println(conta1);
    Serial.println(conta2);
    delay(100);
    }
  }
  //P1 RESPONDE 1ro y RESPUESTA INCORRECTA
  if (digitalRead(p1)==HIGH && digitalRead(p2)==LOW){
    digitalWrite(led1,HIGH);
    digitalWrite(led2,LOW);
    if (digitalRead(p1)==LOW && digitalRead(p2)==LOW && digitalRead(incorrecto)==HIGH){
      digitalWrite(led1,LOW);
      Serial.println(conta1);
      Serial.println(conta2);
    delay(100);
    }
  }
//CUANDO el CONTADOR1 LLEGUE a 5 PARPADEARAN sus LEDS y el JUEGO se REINICIARA
  if (conta1==5){
    digitalWrite(led1,HIGH); //Secuencia de victoria #1
    delay(300);
    digitalWrite(led1,LOW);
    delay(300);
digitalWrite(led1,HIGH);  ////Secuencia de victoria #2
    delay(300);
    digitalWrite(led1,LOW);
    delay(300);
digitalWrite(led1,HIGH);  ////Secuencia de victoria #3
    delay(300);
    digitalWrite(led1,LOW);
    delay(300);
digitalWrite(led1,HIGH);  ////Secuencia de victoria #4
    delay(300);
    digitalWrite(led1,LOW);
    delay(300);
digitalWrite(led1,HIGH);  ////Secuencia de victoria #5
    delay(300);
    digitalWrite(led1,LOW);
    delay(300);
    conta1=0;
    conta2=0;
    digitalWrite(led1,LOW);
    digitalWrite(led2,LOW);
  }

    //////////////////////////////////////////////////////////////////////////////////
    //P2 Respuesta Correcta
  if (digitalRead(p2)==HIGH && digitalRead(p1)==LOW){
    digitalWrite(led2,HIGH);
    digitalWrite(led1,LOW);
  if (digitalRead(p2)==LOW && digitalRead(p1)==LOW && digitalRead(correcto)==HIGH){
    digitalWrite(led2,LOW);
    conta2++;
    Serial.println(conta1);
    Serial.println(conta2);
    delay(100);
    }
  }
  //P2 Respuesta Incorrecta
  if (digitalRead(p2)==HIGH && digitalRead(p1)==LOW){
    digitalWrite(led2,HIGH);
    digitalWrite(led1,LOW);
    if (digitalRead(p2)==LOW && digitalRead(p1)==LOW && digitalRead(incorrecto)==HIGH){
      digitalWrite(led2,LOW);
      Serial.println(conta1);
      Serial.println(conta2);
    delay(100);
    }
  }
  if (conta2==5){
    digitalWrite(led2,HIGH); //1er ciclo de victoria
    delay(300);
    digitalWrite(led2,LOW);
    delay(300);
    digitalWrite(led2,HIGH);  //2do ciclo de victoria
    delay(300);
    digitalWrite(led2,LOW);
    delay(300);
    digitalWrite(led2,HIGH);  //3er ciclo de victoria
    delay(300);
    digitalWrite(led2,LOW);
    delay(300);
    digitalWrite(led2,HIGH);  //4to ciclo de victoria
    delay(300);
    digitalWrite(led2,LOW);
    delay(300);
    digitalWrite(led2,HIGH);  //5to ciclo de victoria
    delay(300);
    digitalWrite(led2,LOW);
    delay(300);
    conta2=0;             //El conteo de aciertos se reiniciarà a cero para comenzar a jugar de nuevo
    conta1=0;
    digitalWrite(led1,LOW);
    digitalWrite(led2,LOW);
  }
  }

Buenas Jesus, no he visto tu problema especifico, solo queria sugerirte que esta parte

//CUANDO el CONTADOR1 LLEGUE a 5 PARPADEARAN sus LEDS y el JUEGO se REINICIARA
  if (conta1==5){
    digitalWrite(led1,HIGH); //Secuencia de victoria #1
    delay(300);
    digitalWrite(led1,LOW);
    delay(300);
digitalWrite(led1,HIGH);  ////Secuencia de victoria #2
    delay(300);
    digitalWrite(led1,LOW);
    delay(300);
digitalWrite(led1,HIGH);  ////Secuencia de victoria #3
    delay(300);
    digitalWrite(led1,LOW);
    delay(300);
digitalWrite(led1,HIGH);  ////Secuencia de victoria #4
    delay(300);
    digitalWrite(led1,LOW);
    delay(300);
digitalWrite(led1,HIGH);  ////Secuencia de victoria #5
    delay(300);
    digitalWrite(led1,LOW);
    delay(300);
    conta1=0;
    conta2=0;
    digitalWrite(led1,LOW);
    digitalWrite(led2,LOW);
  }

la puedes resumir asi

//CUANDO el CONTADOR1 LLEGUE a 5 PARPADEARAN sus LEDS y el JUEGO se REINICIARA
  if (conta1==5){
for (int n=0; n<5; n=n+1) {
    digitalWrite(led1,HIGH); 
    delay(300);
    digitalWrite(led1,LOW);
    delay(300);
}
 conta1=0;
 conta2=0;
    digitalWrite(led1,LOW);
    digitalWrite(led2,LOW);
  }

Muchas gracias por tu sugerencia, modificaré esa parte. En la parte con la que tengo problemas es ésta:

//P1 RESPONDE 1ro y RESPUESTA CORRECTA
if (digitalRead(p1)==HIGH && digitalRead(p2)==LOW){
digitalWrite(led1,HIGH);
digitalWrite(led2,LOW);
if (digitalRead(p1)==LOW && digitalRead(p2)==LOW && digitalRead(correcto)==HIGH){
digitalWrite(led1,LOW);
conta1++;
Serial.println(conta1);
Serial.println(conta2);
delay(100);
}
}

bueno mira, trata de poner el codigo como lo has hecho en tu primer mensaje.
No me es facil darme cuenta en que estas fallando, yo te muestro una idea general de como podrias encarar el programa de tu juego como para que no haya tantos condicionales, es otra sugerencia.

(acabo de eliminarmi sugerencia pues entendi mal tu juego) Sorry

aqui estoy de nuevo, este agregado no lo probe pero sigue siendo una idea general (le falta el parpadeo de los led, etc)

int j1,j2;
int dif;
int gano =10;
void setup()
{
  Serial.begin(9600);
  pinMode(3,OUTPUT); 
  pinMode(5,OUTPUT);
  digitalWrite(3, LOW); //mantiene apagado led de J1
  digitalWrite(5, LOW); //mantiene apagado led de J2
  }

void loop()
{
while (j1 == 0 and j2 == 0) {
dif = digitalRead(2)-digitalRead(4);  // asumimos que J1 esta en pin 2 y J2 en pin 4
if (dif >0) j1=1;                     // de este bucle se sale solo cuando uno este en LOW y el otro en HIGH
if (dif <0) j2=1;            
delay(10);
}

Serial.println("si presiona primero j1 sale 1, si lo hace J2 sale -1 ");
Serial.println(dif); 

if (dif==1) digitalWrite(3, HIGH);    //enciende led de J1
if (dif==-1) digitalWrite(5, HIGH);    //enciende led de J2

while (gano = 10) {
if (digitalRead(6)== 1 and dif == 1)  gano = 1;    // asumimos que Juez da correcto en pin 6               
if (digitalRead(6)== 1 and dif == -1) gano = 2;    // de este bucle se sale solo cuando el juez toma una desicion 
if (digitalRead(7)== 1 )  gano = 0;               // asumimos que Juez da INcorrecto en pin 7            
delay(10);
}

if (gano == 1) {
 // aqui pones las cosas para J1 ganador y J2 perdedor
 //.
 //.
 j1=0;
 j2=0;
 gano=10;
}
if (gano == 2) {
 // aqui pones las cosas para J1 perdedor y J2 ganador
 //.
 //.
 j1=0;
 j2=0;
 gano=10;
}
if (gano == 0) {
 // aqui pones las cosas para ninguno ganador
 //. (no se si es necesario este if)
 //.
 j1=0;
 j2=0;
 gano=10;
}

while(1);  // esto lo usamos solo para frenar el loop, es provisorio
}

Muchas gracias, lo copie y pegue, tambien le agregué la secuencia de parpadeo del led para el jugador ganador pero me temo que no me funciona, cuando oprimo uno de los dos botones J1 o J2 solo se eniende su respectivo led pero cuando oprimo el boton de respuesta correcta o incorrecta no sucede nada, solo se queda encendido el led como si no oprimiera el boton de respuesta correcta o incorrecta. No se si tenga que ver que los botones los tengo en configuracion pull-down.

Yo tambien lo hice en pull-down.

Igual copiar y pegar solo no es la idea, fijate que dentro de los if "gano" te puse que debes agregar lo que tu quieras que suceda cuando gana uno u otro o nadie gana.

Pega el codigo completo aqui asi lo cableo y lo pruebo, no es nada dificil lo que tienes que hacer.

a ver ahora con esta parte...

int si,no; //esto va al principio del programa

while (gano = 10) {
si=digitalRead(6);
no=digitalRead(7)
if (si == 1 and dif == 1)  gano = 1;    // asumimos que Juez da correcto en pin 6               
if (si == 1 and dif == -1) gano = 2;    // de este bucle se sale solo cuando el juez toma una desicion
if (no == 1 )  gano = 0;                    // asumimos que Juez da INcorrecto en pin 7           
delay(10);
}

listo Jesus, habia varios condicionales que en vez de usar “==” puse “=”

Esto fue cableado 4 interruptores a pull-down y 2 led y en principio funciona bien

int j1,j2;
int dif;
int gano =10;
int si,no;
void setup()
{
  Serial.begin(9600);
  pinMode(3,OUTPUT); 
  pinMode(5,OUTPUT);
  digitalWrite(3, LOW); //mantiene apagado led de J1
  digitalWrite(5, LOW); //mantiene apagado led de J2
  }

void loop()
{
while (j1 == 0 and j2 == 0) {
dif = digitalRead(2)-digitalRead(4);  // asumimos que J1 esta en pin 2 y J2 en pin 4
if (dif >0) j1=1;                     // de este bucle se sale solo cuando uno este en LOW y el otro en HIGH
if (dif <0) j2=1;            
delay(10);
}

Serial.println("si presiona primero j1 sale 1, si lo hace J2 sale -1 ");
Serial.println(dif); 

if (dif==1) digitalWrite(3, HIGH);    //enciende led de J1
if (dif==-1) digitalWrite(5, HIGH);    //enciende led de J2

//while(1);

while (gano == 10) {
si=digitalRead(6);
no=digitalRead(7);
if (si == 1 and dif == 1)  gano = 1;    // asumimos que Juez da correcto en pin 6               
if (si == 1 and dif == -1) gano = 2;    // de este bucle se sale solo cuando el juez toma una desicion
if (no == 1 )  gano = 0;                // asumimos que Juez da INcorrecto en pin 7            
delay(10);
}

if (gano == 1) {
 // aqui pones las cosas para J1 ganador y J2 perdedor
 //.
 //.
 Serial.println(" entro en gano = 1");
 j1=0;
 j2=0;
 gano=10;
}
if (gano == 2) {
 // aqui pones las cosas para J1 perdedor y J2 ganador
 //.
 //.
 Serial.println(" entro en gano = 2");
 j1=0;
 j2=0;
 gano=10;
}
if (gano == 0) {
 // aqui pones las cosas para J1 perdedor o J2 perdedor (depende si dif es 1 o -1)
 //.
 //.
 Serial.println(" entro en gano = 0");
 j1=0;
 j2=0;
 gano=10;
}

//while(1);  // esto lo usamos solo para frenar el loop, es provisorio
}

Hermano, muhisimas muchisimas gracias, hace mas de un año que tengo este juego a medias porque no funcionaba y porque trabajo de lunes a domingo. No sabes cuanto te lo agradezco hermano