Las funciones son un tema un tanto abstracto, pero nada como una buena motivacion para empezar como hacer un simple juego de Whack-a-Mole.  Para empezar presento la funcion al final del archivo, comparandolo a alguien que le doy dados para que tire por mi y me devuelva el resultado de esos números aleatorios.

FUNCIONES 

Como se ve en la imagen, debajo del comentario marcado con el símbolo numeral hay una función. En la línea 15  int() convierte lo que ponemos entre paréntesis a un número entero ya que RAND genera números que van del 0.0 al 1.0, por ello al multiplicarlos por 10 nos devolvera numeros del 0.0 al 10.0 que en enteros seria 0 a 10, finalmente sumo 1 para evitar el número 0, y si es 0 lle asignamos 5 a C (el if de las lineas 16, 17, y 18) retornando el número C al programa.
En el programa, como vemos en las líneas 7 y 8, multiplicamos ambos números por 30, para que los números puedan ir hasta 300 ya que por defecto la pantalla gráfica es de 300x300 pixels, si hacemos un cambio con graphsize 600x600, debemos multiplicar ambos por 60, de esa forma los enemigos podrán aparecer por toda la pantalla.

En las líneas 9 y 10 le pedimos que muestre los valores en el área de texto, en éste caso X contiene el valor 60 e Y contiene el valor 120, en cada ejecución, tendremos valores distintos.

Creando Enemigos en la Pantalla





en la línea 10 y 11 creamos un círculo que estará en las posiciones x, e y, con un tamaño 20, refresh da la orden de presenta gráficos (funciona cuando tenemos FASTGRAPHICS, como se ve en la línea 3).



En las líneas 6 y 14 usamos WHILE TRUE y ENDWHILE para encerrar las líneas en un bucle infinito, por lo tanto el círculo se dibujará en una posición aleatoria de la pantalla, esperará 0.1 segundos (línea 12), limpiará la pantalla (línea 13) y volvera a correr el ciclo para dibujarlo en otra parte, y así sucesivamente.

Preguntar donde esta el enemigo

    Usaremos el puntero del mouse para matar al enemigo, por lo tanto mousex y mousey tienen la posición del mismo, así que debemos saber si está dentro del espacio donde dibujamos el círculo.

Como vemos en el gráfico, debemos saber si mousex esta dentro del área cian siendo menos a x+10 y menor a x-10, pero además mousey debe ser menos a y+10 y mayor a y-10. Si esas 4 condiciones son ciertas TODAS AL MISMO TIEMPO, es porque el puntero del mouse está en la misma área que el enemigo (círculo verde).

Para eso usamos un if con múltiples validaciones, separadas por paréntesis y AND, dentro del mismo puse un print "auch" y un say "ouch" para que veamos en pantalla y escuchemos que dimos con el enemigo.




Creando los enemigos

En la aplicación PISKEL he creado una bestia que es algo asi como un tiburon con tentáculos (si hacia un conejito triturado seguro alguien se quejaría), con varios cuadros animados donde aparece y el último cuadro está destruído.
Luego se exporta la secuencia de imágenes en un archivo .zip a la misma carpeta donde tenemos guardado el archivo de basic (El proceso de trabajo con piskel está descripto en la clase 8).


A continuación les dejo los archivos en formato .png con fondo transparente, sus nombes son bestia0.png, bestia1.png... etc excepto el ultimo que se llama muere.png

La bestia se mueve

En las líneas 6 y 7 como vemos he agregado un array con los nombres de los archivos que compondrán la animación, y un ciclo FOR que cuenta de 0 a 7 (lineas 12 y 31), para que el enemigo se quede en una posicion durante 0.7 segundos (en cada ciclo esperara 0.1 segundos, como se ve en la linea 26).

Dentro de la estructura del IF agregamos el imgload para la imagen "muere", y en el else, b$[i] que mostrará en secuencia de nombres cada imagen de la animación contenidos en el array  a$, tal y como hicimos en la clase 8 para las imágenes del MARIO y BB8.

Refinamientos

En las líneas 10 y 11 ya no multiplicamos por 30 los valores que devuelve numr(), de hecho moví esa multiplicación dentro de la función, ya que ahora trabajamos con un graphsize de 800x800 (linea 3), en la función multiplico por 80 el random generado.
En la línea 8 declaré una variable puntos, y dentro del IF, cuando la condición es cierta y se dibuja la imagen MUERE.PNG, incremento los puntos por 10 (linea 17), y muestro los valores en la imagen con un TEXT (linea 21).





Multiples SharkTopus

Para hacerlo un poco más interesante, he creado x2 e y2 con nuevos valores aleatorios (lineas 12 y 13), por lo tanto debemos replicar el IF con todas sus validaciones pero para x2 e y2 (lineas 27 a 32).
En las líneas 15 y 41 agregué una imagen de fondo, y eliminé un CLG.


#codigo completo
clg
fastgraphics
graphsize 800,800
x=1
y=1
dim b$(8)
b$={"bestia0","bestia1","bestia2","bestia3","bestia4","bestia2","bestia1","bestia0"}
puntos=0
while true
       x=numr()
       y=numr()
       x2=numr()
       y2=numr()
       FOR i = 0 TO 7
          imgload 400,400,3,"fondo"
                    #averigua si en mouse esta cerca de la bestia1
          if (x<mousex+64) and (x>mousex-64) and (y<mousey+64) and (y>mousey-64) then
                    imgload x,y, .5,"muere"
                    puntos = puntos + 10
                              #Puntaje en pantalla
                    color yellow
                    font "impact", 40, 10
                    text x, y-32, lower(puntos)
          else
                    imgload x,y, .5, b$[i]
          endif
                    #averigua si en mouse esta cerca de la bestia2
          if (x2<mousex+64) and (x2>mousex-64) and (y2<mousey+64) and (y2>mousey-64)          then
                    imgload x2,y2, .5,"muere"
                    puntos = puntos + 10
                              #Puntaje en pantalla
                    color yellow
                    font "impact", 40, 10
                    text x2, y2-32, lower(puntos)
          else
                    imgload x2,y2, .5, b$[i]
          endif
          refresh
          pause .2
      next i
   imgload 400,400,3,"fondo"
   refresh
endwhile
          #-------------------------funcion aleatoria
function numr()
c = int(rand * 10) +1
if c=0 then
c=5
endif
numr =c * 80
return
end function