11.2 Le programme

Nous allons utiliser le mode multi-tortues. Pour disposer ainsi de plusieurs tortues sur l’écran, on utilise la primitive fixetortue suivi du numéro de la tortue que l’on veut sélectionner.
Un bon schéma valant mieux que mille explications....

PIC

Sur le principe, chaque tortue numérotée de 2 à 12 avancera d’un pas de tortue, lorsque le tirage de la somme des deux dés sera identique à son numéro. Par exemple, si les dés ont pour somme 8, la tortue numéro 8 avancera d’un pas. Toutes les tortues sont espacées de 30 pas de tortues horizontalement.

On placera les tortues à l’aide des coordonnées.

 fixetortue 2 fpos [-150 0]  
 fixetortue 3 fpos [-120 0]  
 fixetortue 4 fpos [-90 0]  
 fixetortue 5 fpos [-60 0]  
 fixetortue 6 fpos [-30 0]  
.....

Plutôt que de taper 11 fois quasiment la même ligne de commande, on peut automatiser cela en utilisant la primitive repetepour. A l’aide de cette primitive, on peut affecter à une variable une succession de valeurs prises dans un intervalle à espaces réguliers. Ici, on veut que la variable :i prenne successivement les valeurs 2, 3, 4, ... , 12. On tapera :
repetepour [i 2 12] [ liste des instructions à exécuter ]

Pour placer les tortues, on crée donc la procédure initialise

pour initialise  
  ve ct  
  repetepour [i 2 12] [  
      # On place la tortue  
      fixetortue :i fpos liste -150+(:i-2)*30 0  
      # On écrit le numéro de la tortue juste en dessous  
      lc re 15 etiquette :i av 15 bc  
  ]  
fin

Bien comprendre la formule -150+( :i-2)*30. On part de -150, puis à chaque nouvelle tortue on rajoute 30. (Tester avec les différentes valeurs de :i si vous n’êtes pas convaincu)

Au final on obtient le programme suivant :

pour lancer  
 retourne 1+hasard 6  
fin  
 
pour initialise  
  ve ct  
  repetepour [i 2 12] [  
      # On place la tortue  
      fixetortue :i fpos liste -150+(:i-2)*30 0  
      # On écrit le numéro de la tortue juste en dessous  
      lc re 15 etiquette :i av 15 bc  
  ]  
fin  
 
pour demarrer  
initialise  
# On effectue 1000 tentatives  
repete 1000 [  
  donne "somme lancer+lancer  
  fixetortue :somme av 1  
]  
# On affiche les fréquences de tirage  
repetepour [i 2 12] [  
  fixetortue :i  
  # L’ordonnée de la tortue représente le nombre de tirages  
  soit "effectif dernier pos  
  lc av 10 tg 90 av 10 td 90 bc etiquette :effectif/1000*100  
]  
fin

Voici une généralisation de ce programme. Ici, on demandera à l’utilisateur le nombre de dés souhaités ainsi que le nombre de lancers à effectuer.

pour lancer  
soit "somme 0  
repete :des [  
   soit "somme :somme+1 +hasard 6  
 ]  
retourne :somme  
fin  
 
pour initialise  
  ve ct fixemaxtortues :max+1  
  repetepour ph liste "i :min :max [  
      # On place la tortue  
      fixetortue :i fpos liste (:min-:max)/2*30+(:i-:min)*30 0  
      # On écrit le numéro de la tortue juste en dessous  
      lc re 15 etiquette :i av 15 bc  
  ]  
fin  
 
pour demarrer  
lis [Nombre de dés:] "des  
si non nombre? :des [ec [Le nombre rentré n’est pas valide!] stop]  
donne "min :des  
donne "max 6*:des  
lis [Nombre de lancers à effectuer] "tirages  
si non nombre? :tirages [ec [Le nombre rentré n’est pas valide!] stop]  
initialise  
# On effectue 1000 tentatives  
repete :tirages [  
  fixetortue lancer av 1  
]  
# On affiche les fréquences de tirage  
repetepour ph liste "i :min :max [  
  fixetortue :i  
  # L’ordonnée de la tortue représente le nombre de tirages  
  soit "effectif dernier pos  
  # On arrondit à 0,1  
  lc av 10 tg 90 av 10 td 90 bc etiquette (arrondi :effectif/:tirages*1000)/10  
]  
fin