Mastermind

Bonjour,

Je voudrais coder le jeu mastermind mais j’ai besoin d’aide pour la vérification du code car ce que j’ai fait ne marche pas vraiment à tous les coups.
Un bout de mon code où je vérifie le code (je mets le code complet plus loin)

//VERIF BP
          if(code_secret[j] == code[j]){
            codeValide[j] = true;
            code_secretValide[j] = true;
            bien_place++;
          }
          else{
            codeValide[j] = false;
            code_secretValide[j] = false;
          }
          
          //VERIF MP
          if(code_secretValide[j] == false){
            for(int k=0; k<4; k++){
              if(j!= k){
                if(code_secret[j] == code[k] && codeValide[k] == false){
                  codeValide[k] = true;
                  codeValide[j] = true;
                  mal_place++;
                }
              }
            }
          }

Le code complet et une capture d’ecran du montage en pj

#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;
bool code_secretValide[4]; 
bool codeValide[4];

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[4];

char code_secret[4] = {'j','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++){
          bien_place=0;
          mal_place=0;
          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';
          }
          
                    
          //VERIF BP
          if(code_secret[j] == code[j]){
            codeValide[j] = true;
            code_secretValide[j] = true;
            bien_place++;
          }
          else{
            codeValide[j] = false;
            code_secretValide[j] = false;
          }
          
          //VERIF MP
          if(code_secretValide[j] == false){
            for(int k=0; k<4; k++){
              if(j!= k){
                if(code_secret[j] == code[k] && codeValide[k] == false){
                  codeValide[k] = true;
                  codeValide[j] = true;
                  mal_place++;
                }
              }
            }
          }
        }
        if (bien_place==4) {
          stripC1.setPixelColor(i, 255,0,0);
          stripC2.setPixelColor(i, 255,0,0);
          stripC3.setPixelColor(i, 255,0,0);
          stripC4.setPixelColor(i, 255,0,0);
        }
        else if (bien_place==3) {
          stripC1.setPixelColor(i, 255,0,0);
          stripC2.setPixelColor(i, 255,0,0);
          stripC3.setPixelColor(i, 255,0,0);
        }
        else if (bien_place==2) {
          stripC1.setPixelColor(i, 255,0,0);
          stripC2.setPixelColor(i, 255,0,0);
        }
        else if (bien_place==1) {
          stripC1.setPixelColor(i, 255,0,0);
        }

        if (mal_place==4) {
          stripC1.setPixelColor(i, 165,42,0);
          stripC2.setPixelColor(i, 165,42,0);
          stripC3.setPixelColor(i, 165,42,0);
          stripC4.setPixelColor(i, 165,42,0);
        }
        else if (mal_place==3) {
          stripC2.setPixelColor(i, 165,42,0);
          stripC3.setPixelColor(i, 165,42,0);
          stripC4.setPixelColor(i, 165,42,0);
        }
        else if (mal_place==2) {
          stripC4.setPixelColor(i, 165,42,0);
          stripC3.setPixelColor(i, 165,42,0);
        }
        else if (mal_place==1) {
          stripC4.setPixelColor(i, 165,42,0);
        }
        if (buttonbloqState == HIGH){
          stripC1.show();
          stripC2.show();
          stripC3.show();
          stripC4.show();
        }
      }
    }
    Serial.print(" BP: ");
    Serial.print(bien_place);
    Serial.print(" MP: ");
    Serial.print(mal_place);
  }
}

Par exemple si je teste en entrant le code ‘vrbr’ j’obtiens juste une couelur bien placée au lieu de 2
MERCI

Tu devrais organiser ton programme en plusieurs fonctions unitaires, ce serait plus facile à lire. Par exemple: lecture_boutons, verif_code, affichage_resultat.

Pour vérifier le code, une simple façon de faire est de prendre le code entré par le joueur dans l'ordre. Pour chaque couleur, vérifier d'abord si elle est bien placée. Sinon, vérifier si cette couleur existe ailleurs et si elle n'est pas bien placée.

Exemple : tu compares le code VRBR entré par le joueur avec le code correct JBBR :

  • V : n'est pas bien placé, n'existe pas ailleurs --> rien à faire
  • R : n'est pas bien placé, existe ailleurs mais le R est bien placé --> rien à faire
  • B : bien placé --> incrémenter bien_place
  • R : bien placé --> incrémenter bien_place
    Tu obtiens alors : bien_place = 2, mal_place = 0

Si le joueur a entré BBVR :

  • B : n'est pas bien placé, existe ailleurs mais bien placé puis encore ailleurs mais mal placé --> incrémenter mal_place
  • B : bien placé --> incrémenter bien_place
  • V : n'est pas bien placé, n'existe pas ailleurs --> rien à faire
  • R : bien placé --> incrémenter bien_place
    Tu obtiens alors : bien_place = 2, mal_place = 1