martes, 16 de octubre de 2012

UCBLogo: videojuego del tenis



Una variante muy sencilla de hacer del juego anterior del frontón, es extenderlo a un juego de tenis que sirva para dos jugadores a la vez. El código va a ser muy parecido y los procedimientos también: inicio (con condiciones iniciales), presentacion (con pantalla de presentación), campo y raqueta (para dibujar campo y raquetas) y un procedimiento principal con el juego.

Tendremos, eso sí, que guardar también la posición de la otra raqueta (que llamaremos “raketa” para el uso con variables: yraketa, velraketa, etc...) y calcular también en este caso si golpea o no a la bola de idéntica manera a la ya expuesta en el videojuego anterio.

Una captura de este videojuego es el siguiente:



Las diferencias básicas serán las siguientes:

1.- Evitar conflicto con la pulsación de las teclas: en este caso, al haber dos jugadores, podría haber había un conflicto si mantenemos el esquema de pulsación de teclas desarrollado en el videojuego del frontón (básicamente si algún jugador mantiene alguna tecla pulsada durante cierto tiempo). Para este caso usaremos una ecuación del movimiento similar al seguido para la pelota, es decir, y = y0+ vy·t, ya visto y que en código sería make "yraqueta yraqueta+velraqueta, pues el tiempo puede anularse al tomarse incrementos de uno en uno. En resumen, en cada ciclo de tiempo no sólo se va a calcular la posición de la pelota a partir de la posición anterior y su velocidad, sino que así será también para el caso de las dos raquetas. De esta forma, la pulsación de una tecla lo único que hará será variar la velocidad:

if tecla = "q [make "velraqueta 1]  ;tecla “q” para subir
if tecla = "a [make "velraqueta -1] ;tecla “a” para bajar

para la otra raqueta:

if tecla = "p [make "velraketa 1]
if tecla = "l [make "velraketa -1]

2.- Dos finales diferentes en función de quién pierde: realizamos dos procedimientos finales en función de que pierda uno u otro jugador, básicamente para indicar qué jugador es el que ha perdido.

Con todo esto y lo explicado anteriormente el código del programa sería entendible y es el siguiente:

;
; juego del tenis
; Raultecnologia
; ejemplo de aplicacion de programacion en LOGO con el programa UCBLogo
;
;
; el procedimiento campo sencillamente dibuja los limites del juego
;
to campo
penup
setxy -250 -100
pendown
rt 90
fd 500
lt 90
fd 10
lt 90
fd 500
lt 90
fd 10
penup
lt 180
fd 270
rt 90
pendown
fd 500
lt 90
fd 10
lt 90
fd 500
lt 90
fd 10
rt 180
penup
end
;
; el procedimiento raqueta dibuja la "raqueta", es decir, el rectangulo que movemos
;
to raqueta
fd 20
rt 90
fd 5
rt 90
fd 20
rt 90
fd 5
rt 90
end
;
; el procedimiento inicio establece una serie de parametros iniciales para el juego
;
to inicio
clearscreen
hideturtle
presentacion            ; llama al procedimiento de la pantalla de presentacion
clearscreen
pendown
penpaint
campo                      ; llama el procedimiento de dibujar el campo
make "yraqueta 0    ; posicion inicial de la raqueta
make "yraketa 0      ; posicion inicial de la raqueta 2
make "xbola 0          ; xbola, ybola son las coordenadas iniciales de la pelota
make "ybola 0
make "xvelbola 1     ; xvelbola, yvelbola son las velocidades iniciales de la pelota
make "yvelbola 1
make "velraqueta 0 ; velocidad inicial de la raqueta 1
make "velraketa 0
make "velocidad 100  ; velocidad es una variable que usaremos para "perder tiempo"
penup
setxy xbola ybola
pendown
arc 360 5         ; dibujamos la bola
arc 360 4
arc 360 3
penup
setxy -250 yraqueta
pendown
raqueta            ; dibujamos la raqueta 1
penup
setxy 245 yraketa
pendown
raqueta            ; dibujamos la raqueta 2
make "tecla 0
fronton
end
;
; este procedimiento no es mas que una pantalla inicial con la informacion del juego
;
to presentacion
penup
setxy -100 110
setpencolor 4
label "Juego_del_Fronton_para_dos_jugadores
setxy -100 80
label "Teclas_jugador_1:_q_arriba_a_abajo
setxy -100 50
label "Teclas_jugador_2:_p_arriba_l_abajo
setxy -100 20
setpencolor 7
label "Evita_que_la_bola_salga_del_campo_de_juego
setxy -100 -10
label "Con_cada_golpe_la_bola_aumenta_de_velocidad
setxy -100 -40
label "Pulsa_cualquier_tecla_para_empezar
make "var2 rc
end
;
; en el procedimiento fronton esta el alma del juego
;
to fronton
if keyp [make "tecla rc] ; si hay tecla pulsada, lee el teclado
;
; las siguientes instrucciones establecen si podemos mover las raquetas y como
;
if tecla = "q [make "velraqueta 1]
if tecla = "a [make "velraqueta -1]
if tecla = "p [make "velraketa 1]
if tecla = "l [make "velraketa -1]
if yraqueta = 149 [make "velraqueta 0 if tecla = "a [make "velraqueta -1]]
if yraqueta = -89 [make "velraqueta 0 if tecla = "q [make "velraqueta 1]]
penup setxy -250 yraqueta penerase raqueta make "yraqueta yraqueta+velraqueta setxy -250 yraqueta penpaint raqueta
if yraketa = 149 [make "velraketa 0 if tecla = "l [make "velraketa -1]]
if yraketa = -89 [make "velraketa 0 if tecla = "p [make "velraketa 1]]
penup setxy 245 yraketa penerase raqueta make "yraketa yraketa+velraketa setxy 245 yraketa penpaint raqueta

penup
setxy xbola ybola
pendown
penerase
arc 360 5
arc 360 4
arc 360 3
;
; ahora vienen las condiciones del choque con las paredes y la raqueta
;
if ybola = 164 [make "yvelbola -yvelbola]
if ybola = -83 [make "yvelbola -yvelbola]
if xbola = -240 [if ((ybola-(yraqueta+10))*(ybola-(yraqueta+10))) < 225 [make "xvelbola -xvelbola make "velocidad velocidad/1.5]]
if xbola = 238 [if ((ybola-(yraketa+10))*(ybola-(yraketa+10))) < 225 [make "xvelbola -xvelbola make "velocidad velocidad/1.5]]
if xbola = -280 [final stop]
if xbola = 268 [final2 stop]
make "xbola xbola+xvelbola
make "ybola ybola+yvelbola
penpaint
setxy xbola ybola
arc 360 5
arc 360 4
arc 360 3
for [i 0 velocidad 1] [arc 360 5]   ; esto sirve para perder tiempo
fronton
end
;
; el procedimiento final controla lo que ocurre cuando el juego termina
;
to final
clearscreen
penup
setxy -100 50
label "Jugador_1_ha_perdido_la_partida
setxy -100 30
label "Escribe_inicio_para_volver_a_jugar
end
to final2
clearscreen
penup
setxy -100 50
label "Jugador_2_ha_perdido_la_partida
setxy -100 30
label "Escribe_inicio_para_volver_a_jugar
end