viernes, 19 de octubre de 2012

UCBLogo: videojuego del tiro parabólico


Este videojuego fue uno de los primeros que hice (y versionado posteriormente con una segunda versión en la que incluí la selección de dibujos hechos por los alumnos). El juego se trata de manejar un disparador al que podemos cambiar la inclinación de ángulo y la fuerza del mismo con el objetivo de que el proyectil alcance a un tanque.



Comentario: el videojuego hace uso de las ecuaciones del tiro parabólico, que serían:

x = x0 + v0x·t
y = y0 + v0y·t -½g·t2

que en el programa toman la forma de :

make "x -260+((v0x*tiempo)/100)
make "y -130+(((v0y*tiempo)-(0.5*9.8*tiempo*tiempo))/100)

A estas alturas supongo que todo el código sería entendible.

Código del juego

;
; Juego del tiro parabolico
; Raultecnologia
; ejemplo de aplicacion de programacion en LOGO con el programa UCBLogo
; para empezar el juego teclea el procedimiento inicio
;

; en primer lugar definimos unas cuestiones de inicio: la información en pantalla
;
make "intentos 0
make "dianas 0

to inicio
clearscreen
setpencolor 7
tanque
penup
showturtle
setxy -80 180
label "Disparo_Recarga_teclas_m_n
setxy 150 150
label "Numero_de_intentos
setxy 150 130
label intentos
setxy 150 100
label "Numero_de_aciertos
setxy 150 80
label dianas
setxy -300 150
label "Fuerza_teclas_k_l
make "grados 45
make "fuerza 500
make "tiempo 0
setxy -300 130
label fuerza
setxy -300 100
label "Inclinacion_teclas_i_o
setxy -300 80
label grados
rt grados
setxy -260 -130
pendown
parabola
end

;
; el procedimiento tanque sencillmente dibuja el tanque en un lugar aleatorio
;
to tanque
penup
make "xtanque random 200
setxy xtanque -130
pendown
fd 5 rt 90 fd 20 rt 90 fd 5 rt 90 fd 20 rt 180
penup
fd 8 lt 90 fd 5
pendown
fd 5 rt 90 fd 10 rt 90 fd 5
penup
back 2 rt 90 fd 10
pendown
fd 12 rt 90 fd 2 rt 90 fd 12 lt 90
end

;
; el procedimiento parabola describe las condiciones de velocidad inicial y grados del tiro
;
to parabola
penup
make "var1 rc
if var1 = "i [left 1 make "grados grados+1 setxy -300 80 label grados setxy -260 -130]
if var1 = "o [rt 1 make "grados grados-1 setxy -300 80 label grados setxy -260 -130]
if var1 = "l [make "fuerza fuerza+10 setxy -300 130 label fuerza setxy -260 -130]
if var1 = "k [make "fuerza fuerza-10 setxy -300 130 label fuerza setxy -260 -130]
if var1 = "m [make "v0x fuerza*cos grados make "v0y fuerza*sin grados hideturtle setpencolor 6 disparo v0x v0y]
parabola
end

;
; el procedimiento disparo dibuja la trayectoria parabolica del tiro
;
to disparo :v0x :v0y
pendown
make "x -260+((v0x*tiempo)/100)
make "y -130+(((v0y*tiempo)-(0.5*9.8*tiempo*tiempo))/100)
setxy x y
arc 360 4
make "tiempo tiempo+1
wait 1
penerase
arc 360 4
penpaint
if y < -130 [explosion1 acierto xtanque x]
disparo v0x v0y
end

;
; el procedimiento acierto define que ocurre cuando el proyectil llega al suelo
;
to acierto :xtanque :xmisil
make "intentos intentos+1
make "diferencia int xtanque-xmisil
make "intdiferencia diferencia*diferencia
if intdiferencia < 1000 [if diferencia < 0 [explosion2 make "dianas dianas+1]]
recarga
end

;
; el procedimiento recarga sirve para reiniciar el siguiente tiro
;
to recarga
wait 5
make "var2 rc
if var2 = "n [inicio]
recarga
end

to explosion1
lt 90-grados
fd 10
back 10
rt 30
fd 8
back 8
rt 30
fd 8
back 8
lt 90
fd 8
back 8
lt 30
fd 8
back 8
rt 60
end


to explosion2
setpencolor 4
fd 25
back 25
rt 30
fd 15
back 15
rt 30
fd 15
back 15
lt 90
fd 15
back 15
lt 30
fd 15
back 15
rt 60
end