11.2 La programo

Ni uzos la moduson plur-testudan. Por tiel havi plurajn testudojn sur l’ ekran’, oni uzu la primitivon testudon_provizu sekvitan de la numero de la testudo kiun oni volas elekti.

Bona skemo valoras pli ol mil klarigoj...

PIC

Ĉiu testudo numerata de 2 ĝis 12 antaŭeniros unu testudpaŝon kiam la sumo de la du kuboj ĵetitaj estas egala a ĝia numero. Por ekzemplo, se la kubo sumiĝas 8, la testudo 8a antaŭeniru unu paŝon. Inter ĉiuj du testudoj estu 30 testudpaŝoj horizontale.

Oni lokos la testudojn per koordinatoj.

 testudon_provizu 2 sitp [-150 0]  
 testudon_provizu 3 sitp [-120 0]  
 testudon_provizu 4 sitp  [-90 0]  
 testudon_provizu 5 sitp  [-60 0]  
 testudon_provizu 6 sitp  [-30 0]  
.....

Pli bone ol tajpi 11 fojojn preskaŭ la saman komandlinion, oni aŭtomatigu tion uzante la primitivon ripetupor. Per tiu primitivo, oni povas havigi al variablo sekvencon de valoroj prenitaj en intervalo laŭ samaj spacoj. Ĉi tie, oni volas ke la variablo :i prenu sinsekve la valorojn 2, 3, 4... 12. Oni tajpu:

ripetu por [i 2 12] [ listo de rulotaj instrukcioj ]

Por loki la testudojn, oni kreu do la proceduron pretigu

por pretigu  
  ev tdk  
  ripetupor [i 2 12]  
      [# Loku la testudon  
       testudon_provizu :i sitp liston -150+(:i-2)*30 0  
       # Skribu la numeron de la testudo apude sube  
       l man 15 etikedu :i an 15 ml]  
fino

Bone komprenu la formulon -150+(:i-2)*30. Oni ekiras de -150; poste por ĉiu nova testudo oni aldonas 30. Provu per la diversaj valoroj de :i se vi ne estas konvinkita.

Finfine jen la programo:

por ĵeti  
 sendu 1 + hazardon 6  
fino  
 
por pretiu  
  ev tdk  
  ripetupor [i 2 12]  
      [# Loku la testudon  
       testudon_provizu :i sitp liston -150+(:i-2)*30 0  
       # Skribu la numeron de la testudo apude sube  
       l man 15 etikedu :i an 15 ml]  
fino  
 
por startu  
pretigu  
# Realigu 1000 provoj  
ripetu 1000  
  [provizu "sumo ĵetu+ĵetu  
   testudon_provizu :sumo an 1]  
# Skribu la frekvencojn de la ĵetado  
ripetupor [i 2 12]  
 [testudon_provizu :i  
  # L’ ordinato de l’ testudo reprezentas la nombron de ĵetoj  
  loke_provizu "efika lastan sit  
  l an 10 mdn 90 an 10 dn 90 ml etikedu :efika/1000*100]  
fino

Jen ĝeneraligo de tiu programo. Oni demandos al l’ uzulo la nombron de deziratajn kubojn kaj la nombron de ĵetojn farotajn.

por ĵetu  
lokp "sumo 0  
ripetu :kuboj  
  [lokp "sumo :sumo + 1 + hazardon 6]  
sendu :sumo  
fino  
 
por pretigu  
  ev tdk testudkiomon_provizu :maks+1  
  ripetupor fr list "i :min :maks  
     [# Loku la testudon  
      testudon_provizu :i sitp list (:min-:maks)/2*30+(:i-:min)*30 0  
      # Skribu la numeron de la testudo apude sube  
      l man 15 etikedu :i an 15 ml]  
fino  
 
por startu  
leg [Nombro de kuboj:] "kuboj  
se ne nombra? :kuboj [s [La nombro enigita ne estas valida!] haltu]  
provizu "min :kuboj  
provizu "maks 6*:kuboj  
leg [Nombro de ĵetoj realigotaj] "ĵetoj  
se ne nombra? :ĵetoj [s [La nombro enigita ne estas valida!] haltu]  
pretigu  
# Realigu 1000 provoj  
ripetu :ĵetoj  
  [testudon_provizu ĵetu an 1]  
# Ŝkribu la frekvencojn de la ĵetoj  
ripetupor fr list "i :min :maks  
  [testudon_provizu :i  
   # L’ ordinato de l’ testudo reprezentas la nombron de ĵetoj  
   lokp "efika lastan sit  
   # Oni proksimumu je 0.1  
   l an 10 mdn 90 an 10 dn 90 ml etikedu (entjeran :efika/:ĵetoj*1000) / 10]  
fino