Simon en ProcessingJS

Appuyer sur 'R' pour démarrer une nouvelle partie

// simon / voir http://codelab.fr/2328
// emoc x codelab.fr / code distribué sous licence GNU-GPL
//
// principe : simon choisit une case, au joueur de cliquer sur la case choisie
// puis simon choisit une 2e case, au joueur de répéter la séquence
// dans cette version il n'y a pas de limite à la longueur de la séquence!
// disposition
// 0 - 1
// 2 - 3
// R pour redémarrer

boolean ATTENTE_JOUEUR = false;
boolean LIRE_SEQUENCE = true;
boolean NOUVELLE_CASE = true;
int touche_pressee = 12;
int compteur = 0;
int compteur_clic = 0;
String sequence_simon = "";
String sequence_joueur = "";
int compteur_carac = 0;
String next_carac = "z";
boolean[] touches = new boolean[4];
color[] touches_couleurs = {color(0, 255, 0, 190),color(255, 0, 0, 190), 
                            color(255, 255, 0, 190), color(0, 0, 255, 190)};


void setup() {
  size(400, 400);
  frameRate(25);
  sequence_simon = "" + floor(random(4));
}

void draw() {
  
  if (ATTENTE_JOUEUR) {
    
    if (compteur_clic > 0) compteur_clic --;
    
    if (NOUVELLE_CASE) {
      
      // comparer les valeurs 
      if(!sequence_simon.substring(0, sequence_joueur.length()).equals(sequence_joueur)) {
        
        // les 2 séquences sont différentes BUZZZZZ et fin!
        println("perdu! (la séquence faisait " + sequence_simon.length() + " cases) r pour recommencer une partie");
        NOUVELLE_CASE = false;
        sequence_joueur = "";
        
      } else { // les 2 séquences sont identiques, on continue
        if (sequence_joueur.length() == sequence_simon.length()) {
          if (compteur_clic == 0) {
            println("La séquence fait " + sequence_simon.length() + ", on rajoute une case");
            sequence_simon += "" + floor(random(4));
            ATTENTE_JOUEUR = false;
            LIRE_SEQUENCE = true;
            NOUVELLE_CASE = false;
          }
        }
      }
    }
    
    if (compteur_clic == 0) {
      for (int i=0; i < 4; i++) {
        touches[i] = false;
      }
    }
    
  } else {
    
    compteur_clic = 0;
    
    if (LIRE_SEQUENCE) {
      compteur = 12;
      LIRE_SEQUENCE = false;
    } else compteur--;
    
    if (compteur == -6) { // pourquoi -6 ? pour ménager un flash noir qui sépare 2 cases identiques
      if (compteur_carac < sequence_simon.length()) { // soit la séquence n'est pas terminée
        next_carac = sequence_simon.substring(compteur_carac,compteur_carac+1);
        compteur_carac ++;
        compteur = 12;
        println(next_carac);
      } else { // soit on est au bout de la séquence et on passe en mode ATTENTE_JOUEUR
        next_carac = "z";
        compteur_carac = 0;
        sequence_joueur = "";
        ATTENTE_JOUEUR = true;
      }
    }
    
    for (int i=0; i < 4; i++) {
      if ((next_carac.equals(""+i)) && (compteur > 0)) {
        touches[i] = true;
      } else touches[i] = false;
    }
  }
  
  // affichage ********************************
  background(0);
  noStroke();
  for (int i=0; i < 4; i++) {
    float touche_alpha;
    if (touches[i]) touche_alpha = 255;
    else touche_alpha = 190;
    color cc = color(red(touches_couleurs[i]), green(touches_couleurs[i]), blue(touches_couleurs[i]), touche_alpha);
    fill(cc);
    rect(i%2*(width/2), floor(i/2)*(height/2), width /2, height / 2);
  }
}

void mousePressed() {
  int case_declenchee = 0;
  println("compteur_clic" + compteur_clic);
  if ((ATTENTE_JOUEUR) && (compteur_clic == 0)) {
    compteur_clic = 6;
    case_declenchee = floor((float)mouseX/200) + (floor((float)mouseY/200) * 2);
    println("case declenchee" + case_declenchee); // + " xx " + xx + " yy " + yy);
    touches[case_declenchee] = true;
    sequence_joueur += "" + case_declenchee;
    println("sequence joueur : " + sequence_joueur + " / sequence_simon : " + sequence_simon );
    NOUVELLE_CASE = true;
  }
}

void keyPressed() {
  if (key == 'r') {
    // RESET
    println("Nouvelle partie");
    ATTENTE_JOUEUR = false;
    LIRE_SEQUENCE = true;
    NOUVELLE_CASE = true;
    compteur = 0;
    compteur_clic = 0;
    sequence_simon = "";
    sequence_joueur = "";
    compteur_carac = 0;
    next_carac = "z";
    for (int i=0; i < 4; i++) {
      touches[i] = false;
    }
  }
}