El programa

Vamos a utilizar el modo multitortuga, para así disponer de varias tortugas sobre la pantalla.

Se utiliza la primitiva pontortuga, seguida del número de tortuga que se quiere seleccionar.

Un buen esquema que vale más que mil explicaciones ...:

Image 15_Dados
El objetivo es que cada tortuga, numerada de 2 a 12, avance un paso de tortuga cuando el resultado de la suma de la tirada de los dos dados coincida con su número. Por ejemplo, si la tirada de dados suma 8, la tortuga número 8 avanzará un paso.

La separación horizontal entre las tortugas es de 30 pasos de tortuga, y se colocarán a las tortugas con ayuda de los datos.

es decir:
 pontortuga 2 ponpos [-150 0]
 pontortuga 3 ponpos [-120 0]
 pontortuga 4 ponpos [-90 0]
 pontortuga 5 ponpos [-60 0]
 pontortuga 6 ponpos [-30 0]
 ......
En lugar de copiar 11 veces prácticamente la misma línea de órdenes, se puede automatizar utilizando la primitiva repitepara. Con ayuda de esta primitiva, se puede asignar a una variable una serie de valores distribuidos en un intervalo a espacios regulares. Aquí, queremos que la variable :i tome sucesivamente los valores $ 2, 3, 4, \dots, 12$ . Su uso es:
 repitepara [i 2 12] [lista de las instrucciones que deben realizarse]

Para colocar a las tortugas, se crea pues el procedimiento inicia

para inicia
  borrapantalla
  ocultatortuga
  repitepara [i 2 12]
    [ 
    # coloca la tortuga
    pontortuga :i ponpos lista -150 + (:i - 2) * 30 0
    # escribe el numero de la tortuga justo debajo
    subelapiz
    retrocede 15
    rotula :i
    avanza 15
    bajalapiz 
    ]
fin

Observa la expresión -150 + (:i - 2) * 30. Con ello hacemos que el primer valor para la abscisa sea -150, y a cada nueva tortuga se añaden 30 (probar con distintos valores de :i si no se ve bien).

Finalmente se obtiene el siguiente programa:

para lanzar
  devuelve 1 + azar 6
fin

para inicia
  borrapantalla
  ocultatortuga
  repitepara [i 2 12]
    [ 
    # coloca la tortuga
    pontortuga :i ponpos lista -150 + (:i - 2)*30 0
    # escribe el numero de la tortuga justo debajo
    subelapiz
    retrocede 15
    rotula :i
    avanza 15
    bajalapiz 
    ]
fin

para empezar
inicia
# Hacemos 1000 intentos
repite 1000
 [
  haz "suma lanzar+lanzar
  pontortuga :suma
  avanza 1
]
# indicamos las frecuencias de tirada
repitepara [i 2 12]
  [
  pontortuga :i
  # la ordenada de la tortuga representa el numero de tiradas
  hazlocal "frecuencia ultimo pos 
  subelapiz
  avanza 10 giraizquierda 90
  avanza 10 giraderecha 90
  bajalapiz
  rotula :frecuencia/1000*100
  ]
fin

Veamos ahora una generalización de este programa. Aquí, se pedirán al usuario el número de dados deseados así como el número de lanzamientos a efectuar.

para lanzar
  hazlocal "suma 0
  repite :dados
   [
    hazlocal "suma :suma + 1 + azar 6
   ]
  devuelve :suma
fin

para inicia
  borrapantalla ocultatortuga
  ponmaximastortugas :max + 1
  repitepara frase lista "i :min :max
   [ 
      # coloca la tortuga
      pontortuga :i
      ponpos lista (:min - :max)/2*30 + (:i - :min)*30 0
      # escribe el numero de la tortuga justo debajo 
      subelapiz retrocede 15
      rotula :i
      avanza 15 bajalapiz 
  ]
fin

para empezar
leeteclado [Numero de dados:] "dados
si no numero? :dados [es [largoetiqueta El numero introducido no es valido!] alto]
haz "min :dados
haz "max 6*:dados
leeteclado [Numero de lanzamientos a realizar] "tiradas
si no numero? :tiradas [es [largoetiqueta El numero introducido no es valido!] alto]
inicia
# Hacemos un numero de intentos igual :tiradas
repite :tiradas
 [
  pontortuga lanzar
  avanza 1
 ]
# indicamos las frecuencias de tirada
repitepara frase lista "i :min :max [
  pontortuga :i
  # la ordenada de la tortuga representa el numero de tiradas
  hazlocal "frecuencia ultimo pos 
  # normalizamos entre 0,1
  subelapiz
  avanza 10 giraizquierda 90
  avanza 10 giraderecha 90
  bajalapiz rotula (redondea :frecuencia/:tiradas)*100
]
fin

Loïc 2007-10-30