1
votes

Rock Paper Scissors Game utilisant Arduino - le code ne respecte pas la déclaration IF

J'essaie de créer le jeu pour les enfants, j'ai cherché d'autres façons de jouer au jeu mais je le fais différemment.

J'utilise 3 boutons pour chaque joueur pour Rock, Paper et Scissor. Les joueurs appuieraient sur un bouton en même temps et celui qui gagnerait verrait sa LED allumée.

Le problème est que tout bouton qui répond à l'une des conditions des instructions if est enfoncé, le voyant s'allumera même s'il est une condition "ET".

pour l'instant je n'ai qu'une seule possibilité pour les boutons R1 && S2 enfoncés qui rapportent au joueur 1 l'emporte (R> S), mais quand j'ai appuyé sur les boutons individuellement, la LED tourne toujours allumé, il ne respecte pas la condition AND.

Qu'est-ce que je fais de mal?

//
// Rock Paper Scissor Game
//
// Each player gets 3 buttons for R, P and S.
//
// If player 1 presses R and player 2 presses S, led on W1 will turn on indicating player 1 wins
//

int R1 = 3;     //Rock player 1
int P1 = 4;     //Paper player 1
int S1 = 5;     //Scissor player 1

int R2 = 6;
int P2 = 7;
int S2 = 8;

int W1 = 9;     //player 1 wins led
int W2 = 10;    //player 2 wins led

void setup() {
  //input buttons for player 1
  pinMode(R1, INPUT_PULLUP);
  pinMode(P1, INPUT_PULLUP);
  pinMode(S1, INPUT_PULLUP);
  
  //input buttons for player 2
  pinMode(R2, INPUT_PULLUP);
  pinMode(P2, INPUT_PULLUP);
  pinMode(S2, INPUT_PULLUP);

  pinMode(W1, OUTPUT);
  pinMode(W2, OUTPUT);

  pinMode(13, OUTPUT);
}

void loop() {

//Reading push buttons
 int x1 = digitalRead(R1);    //player 1 choses Rock
 Serial.println(x1);
 
 int x2 = digitalRead(P1);
 Serial.println(x2);

 int x3 = digitalRead(S1);
 Serial.println(x3);

 int y1 = digitalRead(R2);
 Serial.println(y1);

 int y2 = digitalRead(P2);
 Serial.println(y2);

 int y3 = digitalRead(S2);    //player 2 choses Scissor
 Serial.println(y3);

 //first possibility if player 1 choses R and player 2 choses S.
    if (x1 == HIGH && y3 == HIGH)
    digitalWrite(9, LOW);         //Player 1 LED on indicating winning
    else                          //is this else necessary
    digitalWrite(9, HIGH);
    
}


2 commentaires

Vos impressions affichent-elles le résultat attendu?


Publiez la sortie série.


3 Réponses :


1
votes

Une réponse partielle concernant la façon dont vous gérez vos entrées:

Comme vos entrées sont des pull-ups, lorsque vous appuyez sur un bouton, il devrait établir une connexion de la broche à la terre.

Cela signifie que vous devez connecter les broches normalement ouvertes de votre bouton entre la broche et la terre.

Désormais, lorsque vous lisez une épingle, elle se lit comme suit: 1 ou HIGH lorsque le bouton n'est pas enfoncé, car il est tiré vers le haut par défaut. Et il sera lu comme 0 ou LOW lorsque le bouton est enfoncé, car il y a maintenant un chemin entre la broche et le sol.

Il existe un tutoriel Arduino spécifiquement sur ce sujet: https://www.arduino.cc/en/Tutorial/DigitalInputPullup


0 commentaires

1
votes

votre code doit aboutir à ce que la LED soit sur LOW par défaut, car les broches d'entrée sont définies sur HIGH en tant que pull-ups: https://www.arduino.cc/en/Tutorial/InputPullupSerial

if(x1==LOW && y3==LOW)
{
   digitalWrite(9,HIGH); //Rock wins over Scissor
   delay(2000);
}
.... all the Rest of the Button combinations......


digitalWrite(9,LOW);
digitalWrite(10,LOW);

Cela signifie que toutes vos variables entières remplissent un (x_i = = HIGH && y_j == HIGH) instruction. Vous continuez ensuite d'appuyer sur un bouton, ce qui fait que la variable qui est lue à partir de ce bouton est définie sur BAS.

Avec maintenant une variable étant HIGH et celle dont vous venez d'appuyer sur le bouton étant BAS se retrouvent dans la branche else de votre instruction if. Ceci allume votre LED.

Vous pouvez faire fonctionner votre idée comme ceci (LOW est le signal qu'un bouton est enfoncé):

if (x1 == HIGH && y3 == HIGH)
  {
  digitalWrite(9, LOW);   
  }
else         
  {                 
  digitalWrite(9, HIGH);
  }

Le loop est probablement plus rapide que n'importe quel joueur qui appuie sur les boutons, vous devez donc vous assurer qu'une condition gagnante n'est jamais remplie si un seul bouton est enfoncé en même temps.


0 commentaires

0
votes

Que faire si un joueur appuie sur plus d'un bouton? Et si un joueur change rapidement son choix?

En général, avec 6 boutons, il n'y a que 2 ^ 6 = 64 possibilités, la plupart "entrée invalide", 6 "pas encore prêt" (le joueur 1 ou 2 n'a encore appuyé sur aucun bouton), 3 égalité, 3 victoires pour le joueur 1 et 3 victoires pour le joueur 2.

Créez une table avec 64 entrées et vous avez terminé. Vous pouvez même développer cela pour montrer quel joueur essaie de tricher ou n'a pas encore répondu :)


0 commentaires