jueves, 18 de octubre de 2012

UCBLogo: videojuego Tron



Tron es un videojuego clásico en el que dos jugadores manejan dos motos y pierde aquel que choca contras las paredes del campo de juego o bien contra la estela de cualquiera de las dos motos.



Consideraciones generales: el código de este videojuego es muy fácil de hacer si partimos del código del videojuego de la serpiente anterior, por lo que de nuevo definimos una tabla que es sobre la que controlamos el juego (en este caso más grande). En realidad es más fácil de programar que el videojuego de la serpiente, pues en este caso no tenemos que ir borrando la serpiente según va pasando, pues las estelas permanecen en el sitio donde pasó la moto. Como tenemos dos motos (una llamada serpiente y otra culebra) definimos dos finales.

Código del juego

;
; Videojuego TRON
; Raultecnologia
; El código es funcional para el UCBLogo versión 5.5
; y evidentemente está para que puedas mejorarlo...
; en este juego usaremos los procedimientos MDARRAY, MDITEM y MDSETITEM
; para trabajar con vectores que tienen la informacion de que hay en cada celda
;

;
; el procedimiento inicio establece la pantalla de presentacion
;
to inicio
clearscreen
hideturtle
setpencolor 7
penup
setxy -200 140
setpencolor 4
label "|Videojuego de TRON|
setxy -200 110
setpencolor 7
label "|teclas de moto blanca: w s a d|
setxy -200 80
setpencolor 6
label "|teclas de moto amarilla: i k j l|
setxy -200 0
setpencolor 3
label "|Pulsa cualquier tecla para empezar|
wait 120
make "tecla rc
setpencolor 7
comienzo
end



; el procedimiento comienzo establece las condiciones iniciales
;
to comienzo
clearscreen
campo
penup
make "x -80
make "y -80
make "xx ((x/8)+30)
make "yy ((y/8)+16)
make "a 80
make "b -72
make "aa ((x/8)+30)
make "bb ((y/8)+16)
  ;manejamos dos tipos de coordenadas. x, y son las de la pantalla para dibujar
  ;xx, yy son las de las celdas correspondientes
make "vx -8
make "vy 0
make "va 8
make "vb 0
 ;vx, vy son las velocidades iniciales
make "size_x 50
make "size_y 40
make "tabla (mdarray (list :size_x :size_y) 1)
  ;definimos el tamanio de la tabla
for [i 1 50 1] [for [j 1 40 1] [mdsetitem (list :i :j) :tabla 0]]
serpiente
culebra
juego
end



;
; el procedimiento campo sencillamente dibuja el campo de juego
;
to campo
setpencolor 4
penup
setxy -228 -117
setpensize 8
pendown
fd 320
rt 90
fd 400
rt 90
fd 320
rt 90
fd 400
rt 90
penup
end

;
; el procedimiento serpiente dibuja la cabeza de la serpiente
;
to serpiente
penup
setxy x y
mdsetitem (list :xx :yy) :tabla 1
pendown
setpensize 1
setpencolor 7
for [i 1 8 1] [fd i rt 90 fd i rt 90 fd i rt 90 fd i rt 90]
end

;
; el procedimiento culebra dibuja la cabeza de la otra serpiente
;
to culebra
penup
setxy a b
mdsetitem (list :aa :bb) :tabla 2
pendown
setpensize 1
setpencolor 6
for [i 1 8 1] [fd i rt 90 fd i rt 90 fd i rt 90 fd i rt 90]
end




;
; el procedimiento juego controla las condiciones del juego
;
to juego
mdsetitem (list :xx :yy) :tabla 1
mdsetitem (list :xx :yy) :tabla 2
if keyp [make "tecla rc]
if tecla = "w [make "vx 0 make "vy 8]
if tecla = "s [make "vx 0 make "vy -8]
if tecla = "d [make "vx 8 make "vy 0]
if tecla = "a [make "vx -8 make "vy 0]
if tecla = "i [make "va 0 make "vb 8]
if tecla = "k [make "va 0 make "vb -8]
if tecla = "l [make "va 8 make "vb 0]
if tecla = "j [make "va -8 make "vb 0]
if x >= 160 [fins]
if x <= -230 [fins]
if y >= 192 [fins]
if y <= -116 [fins]
if a >= 160 [finc]
if a <= -230 [finc]
if b >= 192 [finc]
if b <= -116 [finc]
make "x x+vx
make "y y+vy
make "xx ((x/8)+30)
make "yy ((y/8)+16)
make "a a+va
make "b b+vb
make "aa ((a/8)+30)
make "bb ((b/8)+16)
make "contenidos mditem (list :xx :yy) :tabla
make "contenidoc mditem (list :aa :bb) :tabla
if contenidos >= 1 [fins]
if contenidoc >= 1 [finc]
serpiente
culebra
for [i 1 1000][make "pierdotiempo i+i]
juego
end



;
; el procedimiento fins establece el final de la partida
; si pierde la serpiente
;
to fins
penup
setxy x y
pendown
setpencolor 1
arc 360 8
arc 360 16
setpencolor 3
arc 360 32
setpencolor 7
penup
setxy x-40 y-5
label "!!!CRASH!!!
setxy -250 -180
label "|perdio la moto blanca, pulsa cualquier tecla para empezar|
wait 120
make "tecla rc
inicio
end

;
; el procedimiento finc establece el final de la partida
; si pierde la culebra
;
to finc
penup
setxy a b
pendown
setpencolor 1
arc 360 8
arc 360 16
setpencolor 3
arc 360 32
setpencolor 6
penup
setxy a-40 b-5
label "!!!CRASH!!!
setxy -250 -180
label "|perdio la moto amarilla, pulsa cualquier tecla para empezar|
wait 120
make "tecla rc
inicio
end