vérifier si un tableau contient un caractère

Bonjour,

Je recrée le jeu du mastermind, j'en suis à coder l'étape où je dois comparer le code couleur secret (à deviner) et la proposition du joueur.

Je sais que sur python on peut utiliser "in" pour vérifier si tel caractère du code joueur est dans le code secret mais je ne trouve pas d'équivalent en arduino.

Merci pour votre aide

Bonjour, Leabarlet.

Je pense qu'une boucle for devrais suffire pour scanner le tableau du code adverse

Tu colles la valeur lut dans ton tableau, dans une variable.

à ce moment, tu as la valeur et l'index du tableau, te reste plus qu'a gérer ce que tu veut en faire.

Par exemple, dans une série de switch / case pour chaque possibilités

ou tu fais une comparaison (==) avec des valeurs prédéfinies.

un truc du genre:

char bleu ; 
char rouge ;
char vert ;
char violet ;
char orange ;

#define NUMSAMPLE 6
char bufferColor[NUMSAMPLE]; // le tableau du code adverse
int indexBuffer;

char controleBuffer;

void setup() {

   Serial.begin(9600);

 bleu = 'B'; 
 rouge = 'R';
 vert = 'V';
 violet = 'I';
 orange = 'O';

   
   indexBuffer=0;

   controleBuffer=0;
  

}

void loop() {


//if/while peut importe(je veut lire dans le tableau){


   for(int i=0;i<NUMSAMPLE;i++){
      controleBuffer = bufferColor[i];

      indexBuffer=i;

       }

     switch(controleBuffer){

      case 'V': 
      Serial.print(indexBuffer);
      //code ici
      break;


      case 'B':
      Serial.print(indexBuffer);
      //code ici
      break;

      //ect!!
     }
//}
  
    //ou

    if (controleBuffer == 'V'){ /*code;*/}
    if (controleBuffer == 'B') { /*code;*/}
}

Bon j'ai pas regarder si le code marcher, j'ai juste compiler!! mais comme ça ta l'idee du truc un peut plus en forme!

Bon courage.

2terium:
Je pense qu'une boucle for devrais suffire pour scanner le tableau du code adverse

Merci! Sinon en cherchant j'ai trouvé la fonction strchr() tu connais ? parce que j'ai essayé qqchose avec mais j'ai pas le résultat attendu alors je sais pas trop comment l'utiliser...

Voir la fonction indexOf

void setup()
{
  Serial.begin(115200);
  String s = "BONJOUR";
  Serial.print(s.indexOf("N"));
}

void loop()
{
}

écrit -1 si la lettre ne s'y trouve pas, sinon donne l'indice

Merci! Sinon en cherchant j'ai trouvé la fonction strchr() tu connais ? parce que j'ai essayé qqchose avec mais j'ai pas le résultat attendu alors je sais pas trop comment l'utiliser...

Suggestion : si tu donnais le type de variable tableau où sont stockés les codes ?

hbachetti:
Suggestion : si tu donnais le type de variable tableau où sont stockés les codes ?

Mon code est super logn donc je voulais éviter de le mettre mais j'arrive pas à faire ce que je veux malgré tout donc le voici:

#include <Adafruit_NeoPixel.h>


int buttonPin1 = 10;
int buttonPin2 = 11;
int buttonPin3 = 12;
int buttonPin4 = 13;
int buttonPin[] = {buttonPin1,buttonPin2,buttonPin3,buttonPin4};

int counter1=0;
int counter2=0;
int counter3=0;
int counter4=0;
int counter[] = {counter1,counter2,counter3,counter4};

int bien_place=0;
int mal_place=0;
int nb_tour=0;

int buttonState1=0;
int buttonState2=0;
int buttonState3=0;
int buttonState4=0;
int buttonState[] = {buttonState1,buttonState2,buttonState3,buttonState4};


int lastbuttonState1=0;
int lastbuttonState2=0;
int lastbuttonState3=0;
int lastbuttonState4=0;
int lastbuttonState[] = {lastbuttonState1,lastbuttonState2,lastbuttonState3,lastbuttonState4};

int buttonbloqPin = 9;
int buttonbloqState = 0;
int lastbuttonbloqState = 0;
int counterbloq = 0;

char c1;
char c2;
char c3;
char c4;
char code[] = {c1,c2,c3,c4};

char code_secret[] = {'b','b','b','r'};

Adafruit_NeoPixel strip1 = Adafruit_NeoPixel(10, 2);
Adafruit_NeoPixel strip2 = Adafruit_NeoPixel(10, 3);
Adafruit_NeoPixel strip3 = Adafruit_NeoPixel(10, 4);
Adafruit_NeoPixel strip4 = Adafruit_NeoPixel(10, 5);
Adafruit_NeoPixel strip[] = {strip1, strip2, strip3, strip4};

Adafruit_NeoPixel stripC1 = Adafruit_NeoPixel(10, 6);
Adafruit_NeoPixel stripC2 = Adafruit_NeoPixel(10, 7);
Adafruit_NeoPixel stripC3 = Adafruit_NeoPixel(10, 8);
Adafruit_NeoPixel stripC4 = Adafruit_NeoPixel(10, A5);
Adafruit_NeoPixel stripC[] = {stripC1, stripC2, stripC3, stripC4};



void setup() {
  Serial.begin(9600);
  for (int i=0; i <= 3; i++){
    pinMode(buttonPin[i], INPUT);
  }
  for (int j=0; j <=3; j++) {
    strip[j].begin();
    strip[j].show(); // Initialize all pixels to 'off'
  }
  for (int j=0; j <=3; j++) {
    stripC[j].begin();
    stripC[j].show(); // Initialize all pixels to 'off'
  }
}

       

void loop() {

  while (bien_place<4) {
    buttonbloqState = digitalRead(buttonbloqPin);
    if (buttonbloqState != lastbuttonbloqState) {
      if (buttonbloqState == HIGH) {
        counterbloq++;
      }
      else{
        counterbloq =counterbloq;
      }
      lastbuttonbloqState = buttonbloqState;
    }
    
    for (int i=0; i <= 9; i++){
      
      if (counterbloq == i) { 
      
        for (int j=0; j <= 3; j++){
          uint32_t rose = strip[j].Color(255, 0, 255);
          uint32_t bleu = strip[j].Color(1, 102, 102);
          uint32_t vert = strip[j].Color(0, 255, 0);
          uint32_t jaune = strip[j].Color(255, 255, 0);
          
          
          buttonState[j] = digitalRead(buttonPin[j]);
          
          if (buttonState[j] != lastbuttonState[j]) {
            if (buttonState[j] == HIGH) {
              counter[j]++;
            }
            else{
              counter[j]=counter[j];
            }
            lastbuttonState[j] = buttonState[j];
          }
          
          if(counter[j]==0){
            strip[j].setPixelColor(i, 0, 0, 0);         //noir
            strip[j].show();
            
          }
          else if (counter[j]%4==1){
            strip[j].setPixelColor(i, rose);        //rose
            strip[j].show();
            code[j]='r';
          }
          else if (counter[j]%4==2){
            strip[j].setPixelColor(i, bleu);        //bleu
            strip[j].show();
            code[j]='b';
          }
          else if (counter[j]%4==3 ){
            strip[j].setPixelColor(i, vert);          //vert
            strip[j].show();
            code[j]='v';
          }
          else if (counter[j]%4==0){
            strip[j].setPixelColor(i, jaune);       //jaune
            strip[j].show();
            code[j]='j';
          } 
        }
        nb_tour=nb_tour+1;
    if (nb_tour>10) {
      Serial.print("PERDU!!!");
    }
    else {
      if (code[0]==code_secret[0]) {
        bien_place=bien_place+1;
      }
      else {
        if (code_secret.indexOf(code[0])!=-1) {
          mal_place=mal_place+1;
        }
      }
      if (code[1]==code_secret[1]) {
        bien_place=bien_place+1;
      }
      else {
        if (strchr(code_secret, code[1])!=0) {
          mal_place=mal_place+1;
        }
      }
      if (code[2]==code_secret[2]) {
        bien_place=bien_place+1;
      }
      else {
        if (strchr(code_secret, code[2])!=0) {
          mal_place=mal_place+1;
        }
      }
      if (code[3]==code_secret[3]) {
        bien_place=bien_place+1;
      }
      else {
        if (strchr(code_secret, code[3])!=0) {
          mal_place=mal_place+1;
        }
      }
      if (bien_place<4) {
        if (bien_place==0) {
          Serial.print("vous n avez aucune lettre bien placée.");
        }
        else {
          Serial.print("vous avez");
          Serial.print(bien_place);
          Serial.print(" lettres bien placées.\n");
        }
        if (mal_place==0) {
          Serial.print("vous n avez aucune lettre mal placée et présente dans l expression");
        }
        else {
          Serial.print("vous avez");
          Serial.print(mal_place);
          Serial.print("lettres mals placées.\n");
        }
      }
      else {
        Serial.print("GAGNE en");
        Serial.print(nb_tour);
        Serial.print("tours !!!! \n ");
      }
    }
      }
      
    }
  }
}

leabarlet:
Mon code est super logn donc je voulais éviter de le mettre mais j'arrive pas à faire ce que je veux malgré tout donc le voici:

J'ai envoyé le post avant de finir mon message désolée.

donc j'ai essayé avec la fonction strchr le code compile sans erreur mais j'obtient directement
"vous n'avez aucune lettre bien placée vous avez 4 lettres mal placées" et ainsi de suite 8,12, 16,20 etc jusqua 40 lettres mal placées puis PERDU alors que je n'ai pas encore entré de code couleur (d'ailleurs remplacez "lettres" par "couleurs" j'ai repirs un ancien proet python sans tout modifier) et en essayant avec indexOf() j'ai une erreur

request for memeber 'indexOf' in 'code_secret', whici is of non-class type 'char[5]'/code]

et je ne sais pas comment résoudre ça... MERCI

Tu aurais avantage à déclarer code_secret en C string.

char code_secret[] = "bbbr";

Car code_secret sera terminé par un caractère ZÉRO terminateur indispensable à strchr() pour savoir où finit la chaîne.

Tu devrais afficher sur la console le caractère recherché avant d'appeler strchr(). Il ne contient peut-être pas ce que tu crois.

Quant à indexOf() tu oublies. C'est une méthode de la classe String.

hbachetti:
Tu aurais avantage à déclarer code_secret en C string.

char code_secret[] = "bbbr";

c'est ce que je voulais faire au départ mais du coup code[] n'est pas du même type donc on peut quand même les comparer?

code est un tableau de caractères, comme code_secret, donc tu peux rechercher chaque élément de code dans code_secret avec strchr().

        if (strchr(code_secret, code[1])!=0) {

If the character is not found, the function returns a null pointer.

Donc ton test par rapport à ZÉRO est OK.

Ensuite on pourra finaliser en regroupant les 4 tests dans une boucle for, mais chaque chose en son temps.