boucle Comparer 2 valeurs

Bonjour,

Je suis livre pour les nuls en s'amusant depuis quelques jours. Je suis arrivé à un chapire appelé Devinuim.
Dans ce jeu, on doit deviner des nombres en binaire à partir de 4 diodes en fonctio qu'elle s'allume ou s'éteigne. J'ai voulu améliorer le code source de ce jeu et le voici:

#define PAUSE 400 
#define LUMIN 100
const byte yLed1 = 11;
const byte yLed2 = 10;
const byte yLed4 = 9;
const byte yLed8 = 6;

byte ayTablo[10];   // Le fameux tableau!
byte compteur = 0;
byte ActuelNumb = 0; 
byte PrecNumb = 0;

void setup() {
  pinMode(yLed1, OUTPUT);
  pinMode(yLed2, OUTPUT);
  pinMode(yLed4, OUTPUT);
  pinMode(yLed8, OUTPUT);
  Serial.begin(9600);
  Serial.println("*** Bienvenue chez DEVINUM ***");
}

void loop() {
  for (byte i = 0; i < 10; i++) {
    do{ 
      ActuelNumb = ayTablo[i];
      ayTablo[i] = random(1, 15);
      PrecNumb = ayTablo[i];
      compteur++;
    }while( ActuelNumb == PrecNumb && compteur > 1);
      
      Serial.println(" ");
      Serial.print(ayTablo[i]);
      afficherBin(ayTablo[i]);
      toutEteindre();
    
  
  }
  afficherReponses();
  attendreSaisie();
}

void afficherBin(byte bNum) {
  if (bNum == 0) return;
  Serial.print("\t Binaire ");
///////////////////////////////////////////////////////////
// ERRATA DANS LE LIVRE: IL FAUT AFFICHER LE MSB EN PREMIER
  if (bitRead(bNum, 3)) agir(yLed8, LUMIN);
  else agir(yLed8, 0);
  if (bitRead(bNum, 2)) agir(yLed4, LUMIN);
  else agir(yLed4, 0);
  if (bitRead(bNum, 1)) agir(yLed2, LUMIN);
  else agir(yLed2, 0);
  if (bitRead(bNum, 0)) agir(yLed1, LUMIN);
  else agir(yLed1, 0);
  delay(PAUSE*3);
}

void agir(byte bBroche, byte bValeur) {
  analogWrite(bBroche, bValeur);
  Serial.print(boolean(bValeur));
}

void toutEteindre() {
  analogWrite(yLed8, 0);
  analogWrite(yLed4, 0);
  analogWrite(yLed2, 0);
  analogWrite(yLed1, 0);
  delay(PAUSE*3);
}

void afficherReponses() {
  delay(PAUSE*10);
  Serial.println();
  Serial.println("Maitre Devinum te donne les solutions : ");
  for (byte i = 0; i < 10; i++) {
    Serial.print(ayTablo[i]);
    Serial.print(" | ");
  }
  Serial.println();
  Serial.println("****************** ");
  Serial.println("Clic dans zone de saisie en haut du Moniteur...");
  Serial.println("... puis Espace et Entree pour autre partie !");
}

void attendreSaisie(){
  while ( Serial.available() == 0 ) ;     // Vigilance ici
  while ( Serial.available() > 0 ) Serial.read();
  Serial.flush();
}

Dans la fonction Loop, J'ai voulu rajouter une boucle do while pour éviter les doublons mais cela n'a pas eu l'effet escompter. Seriez-vous en mesure de m'aider ?

regardez du côté de && compteur > 1(et une fois vue l’erreur demandez vous à quoi sert le compteur)

Cette ligneSerial.flush();ne sert à rien.

Ok, je viens de supprimer le compteur mais ma boucle anti-doublon ne fonctionne toujours pas.

postez le code modifié

Voici le code modifié:

#define PAUSE 400 
#define LUMIN 100
const byte yLed1 = 11;
const byte yLed2 = 10;
const byte yLed4 = 9;
const byte yLed8 = 6;

byte ayTablo[10];   // Le fameux tableau!
byte compteur = 0;
byte ActuelNumb = 0; 
byte PrecNumb = 0;

void setup() {
  pinMode(yLed1, OUTPUT);
  pinMode(yLed2, OUTPUT);
  pinMode(yLed4, OUTPUT);
  pinMode(yLed8, OUTPUT);
  Serial.begin(9600);
  Serial.println("*** Bienvenue chez DEVINUM ***");
}

void loop() {
  for (byte i = 0; i < 10; i++) {
    do{ 
      ActuelNumb = ayTablo[i];
      ayTablo[i] = random(1, 15);
      PrecNumb = ayTablo[i];
      
    }while( ActuelNumb == PrecNumb);
      
      Serial.println(" ");
      Serial.print(ayTablo[i]);
      afficherBin(ayTablo[i]);
      toutEteindre();
    
  
  }
  afficherReponses();
  attendreSaisie();
}

void afficherBin(byte bNum) {
  if (bNum == 0) return;
  Serial.print("\t Binaire ");
///////////////////////////////////////////////////////////
// ERRATA DANS LE LIVRE: IL FAUT AFFICHER LE MSB EN PREMIER
  if (bitRead(bNum, 3)) agir(yLed8, LUMIN);
  else agir(yLed8, 0);
  if (bitRead(bNum, 2)) agir(yLed4, LUMIN);
  else agir(yLed4, 0);
  if (bitRead(bNum, 1)) agir(yLed2, LUMIN);
  else agir(yLed2, 0);
  if (bitRead(bNum, 0)) agir(yLed1, LUMIN);
  else agir(yLed1, 0);
  delay(PAUSE*3);
}

void agir(byte bBroche, byte bValeur) {
  analogWrite(bBroche, bValeur);
  Serial.print(boolean(bValeur));
}

void toutEteindre() {
  analogWrite(yLed8, 0);
  analogWrite(yLed4, 0);
  analogWrite(yLed2, 0);
  analogWrite(yLed1, 0);
  delay(PAUSE*3);
}

void afficherReponses() {
  delay(PAUSE*10);
  Serial.println();
  Serial.println("Maitre Devinum te donne les solutions : ");
  for (byte i = 0; i < 10; i++) {
    Serial.print(ayTablo[i]);
    Serial.print(" | ");
  }
  Serial.println();
  Serial.println("****************** ");
  Serial.println("Clic dans zone de saisie en haut du Moniteur...");
  Serial.println("... puis Espace et Entree pour autre partie !");
}

void attendreSaisie(){
  while ( Serial.available() == 0 ) ;     // Vigilance ici
  while ( Serial.available() > 0 ) Serial.read();
}

en faisant

    do {
      PrecNumb = ayTablo[i];
      ayTablo[i] = random(1, 15);
      ActuelNumb = ayTablo[i];
    } while ( ActuelNumb == PrecNumb);

(j'ai échange Prec et Actuel pour que ce soit plus proche de a réalité), vous générez effectivement une nouvelle valeur.

qu'est-ce qui ne va pas?

PS/ rajoutez un randomSeed(analogRead(A0)); // un peu d'aléatoiredans le setup()

La boucle do while devait éviter des doublons c'est à dire que aytablo ne peux pas renvoyer 2 valeurs idntique sauf que cela n'a pas fonctionné.

Rakushi:
La boucle do while devait éviter des doublons c'est à dire que aytablo ne peux pas renvoyer 2 valeurs idntique sauf que cela n'a pas fonctionné.

ce que vous avez codé c'est que vous ne pouvez pas avoir - à la position i la même valeur qu'il y avait avant dans cette position.

Vous n'avez pas codé qu'il ne peut pas y avoir à la position i une valeur déjà utilisée auparavant dans le tableau (si vous voulez que toutes les valeurs du tableau soient différentes)

--> que voulez vous faire vraiment ?