Fonction Random

Salut à tous,

J’ai un petit problème j’ai un montage avec plusieurs servomotor qui forment une main et j’aimerai pouvoir la faire jouer de manière aléatoire à pierre, papier, ciseaux j’ai créé 3 fonctions pour les 3 mouvements. Mais quand j’utilise la fonction Random je n’arrive pas à faire jouer les 3 mouvements de manière aléatoire j’arrive a en faire jouer deux mais jamais les 3 , et ils se répètent toujours de la même manière.

Je vous mettre le code dans la journée si vous en avez besoins merci d’avance car j’ai cherché beaucoup et je n’est rien trouvé à ce sujet.

Bonjour,

random(0,3)

te donne, pseudo-aléatoire, les valeurs 0, 1 ou 2
Voir Random

et voir aussi randomSeed() si vous ne voulez pas toujours la même séquence au boot de votre Arduino

Oui j’ai deja fait avec la fonction random comme tu me montre mais ça ne me sort jamais 3 valeurs je n’est que le 0 ou 1 .

je vous met le code pour pour que vous puissez comprendre :

#include <Servo.h>

//main droite
Servo pouce;
Servo index;  
Servo majeur;
Servo annulaire;
Servo auriculaire;

//Variable
int etat = 0;
int teta = 90;        
int velocity;
int mouvementrandom = 0;

void setup() {
 
 //Initialise les servos moteurs
 pouce.attach(2);  
 index.attach(3);  
 majeur.attach(4);
 annulaire.attach(5);  
 auriculaire.attach(6);

//Initialise les variables
 velocity = 0;

 randomSeed(analogRead(0));

 Serial.begin(9600); 
}


void loop() {
if (Serial.available() > 0) {    
    etat = Serial.read();


      //selection et lancement mouvements
      if (etat=='a')
      {
        chifumi(); 
      } 

  }
}

//Mouvement pierre, papier, ciseaux

void chifumi(){
  mouvementrandom = random(0,3);

    if (mouvementrandom = random(0))
    {
      ciseaux();
    }
    else if(mouvementrandom = random(1))
    {
      pierre();
    }
     else if(mouvementrandom = random(2))
    {
      papier();
    }
  
}

void pierre(){
           velocity = 1;
                       
           pouce.write(135);    
           delay(240*velocity);
           index.write(150);
           delay(240*velocity);
           majeur.write(160);
           delay(240*velocity); 
           annulaire.write(130);    
           delay(240*velocity);
           auriculaire.write(117);

}

void ciseaux(){
           velocity = 1;

           pouce.write(135);    
           delay(240*velocity);
           index.write(0);
           delay(240*velocity);
           majeur.write(0);
           delay(240*velocity); 
           annulaire.write(130);    
           delay(240*velocity);
           auriculaire.write(117);

}

void papier(){
           velocity = 1;

           pouce.write(0);    
           delay(240*velocity);
           index.write(0);
           delay(240*velocity);
           majeur.write(0);
           delay(240*velocity); 
           annulaire.write(0);    
           delay(240*velocity);
           auriculaire.write(0);

}

}

C’est bizarre, essaye un code simple :

void setup () {
  Serial.begin(9600);
  randomSeed(analogRead(0));
}

void loop() {
  Serial.println(random(3));
}

Est-ce que ça affiche des 0, 1 et aussi des 2 ?

… OK, ton erreur est plus loin :

void chifumi(){
  mouvementrandom = random(0,3);

    if (mouvementrandom = 0) // et pas random(0))
    {
      ciseaux();
    }
    else if(mouvementrandom = 1) // random(1))
    {
      pierre();
    }
     else if(mouvementrandom = 2) //random(2))
    {
      papier();
    }
  
}

Tu peux faire un code plus lisible avec switch / case

void chifumi(){
  int mouvementrandom = random(0,3); // <-- le définir ici, et pas en global
  switch (mouvementrandom) {
    case 0 :
      ciseaux();
      break;
    case 1 :
      pierre();
      break;
    default :
      papier();
  }
}

et enlève la déclaration de mouvementrandom dans l’entête du code.

Re,
Il y a pire :

if (mouvementrandom = 0) // et pas random(0))

n'est pas juste, il faut faire

if (mouvementrandom == 0) // et pas random(0))

C’est vrai, j’aurais dû les voir ! D’où l’intérêt du switch, qui évite ce genre d’erreur…

Re,

lesept:
D'où l'intérêt du switch, qui évite ce genre d'erreur...

Ce n'est pas faux, mais il reste le piège du :

break;

:wink:

Merci j'ai corriger mon code a l'aide de vos explication merci beaucoup je vais pouvoir jouer a chi fu mi avec le debut de mon robot :wink:

Une petite vidéo pour montrer le robot joueur ?

Je vous fais ça dans l’après midi et je post ça se soir

Cool !

Salut la vidéo est presque fini je la mettrai samedi matin sur ma chaine voici le lien :

Chaîne Youtube

Bonne soirée à tous

Re,
Très belle réalisation. Bravo