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...

pict

Ĉ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