viernes, 19 de octubre de 2012

UCBLogo: videojuego del tetris


El Tetris es un videojuego clásico en el que unas piezas van descendiendo y el objetivo es hacer líneas completas.
 

Consideraciones: es importante analizar primero cómo es el Tetris para abordar su programación. Veamos primero las piezas:



Tenemos 7 piezas (las de la imagen superior en la que hemos puesto un número como identificador de la pieza que es la que usaremos para la programación) con un denominador común: todas ellas están formadas por 4 cuadrados (de ahí la palabra Tetris, de cuatro). Además, las piezas se pueden girar y desplazar lateralmente a voluntad y van descendiendo lentamente. El “campo de juego” es un rectángulo de base 10 cuadraditos y altura 20, por lo que parece adecuado volver a usar una matriz o tabla para realizar los cálculos del programa.

1.- Piezas como conjunto de 4 cuadrados: como las 7 piezas están hechas de 4 cuadrados, vamos a entender que cada pieza es un conjunto de 4 cuadrados. Las coordenadas de cada cuadrado serán x1,y1 para el primero, x2, y2 para el segundo y así x3,y3 y x4,y4 para el 3º y 4º respectivamente. En realidad vamos a manejar las coordenadas del primer cuadrado y el resto se calcularán de manera relativa para el resto. Veámoslo para la pieza llamada T:


Si las coordenadas del primer cuadrado son x1,y1, las del resto de cuadraditos, relativas a estas, serían las siguientes:

x2 = x1+1, y2 = y1
x3 = x1+2, y2 = y1
x4 = x1+1, y4 = y1+1

que en código es:

make "x2 x1+1 make "x3 x1+2 make "x4 x1+1 make "y2 y1 make "y3 y1 make "y4 y1+1

Pues bien, esto está hecho para todas las piezas en el procedimiento eligepieza, donde de paso se elige el color con la variable c:

make "pieza random 7
;
; pieza 0 es la 0, 1 la I, 2 la L, 3, la J, 4 la T, 5 la S y 6 la Z
;
if [pieza=0][make "c 1 make "x2 x1+1 make "x3 x1 make "x4 x1+1 make "y2 y1 make "y3 y1+1 make "y4 y1+1]
if [pieza=1][make "c 4 make "x2 x1 make "x3 x1 make "x4 x1 make "y2 y1+1 make "y3 y1+2 make "y4 y1+3]
if [pieza=2][make "c 5 make "x2 x1 make "x3 x1 make "x4 x1+1 make "y2 y1+1 make "y3 y1+2 make "y4 y1]
if [pieza=3][make "c 7 make "x2 x1+1 make "x3 x1+1 make "x4 x1+1 make "y2 y1 make "y3 y1+1 make "y4 y1+2]
if [pieza=4][make "c 8 make "x2 x1+1 make "x3 x1+2 make "x4 x1+1 make "y2 y1 make "y3 y1 make "y4 y1+1]
if [pieza=5][make "c 2 make "x2 x1+1 make "x3 x1+1 make "x4 x1+2 make "y2 y1 make "y3 y1+1 make "y4 y1+1]
if [pieza=6][make "c 3 make "x2 x1+1 make "x3 x1-1 make "x4 x1 make "y2 y1 make "y3 y1+1 make "y4 y1+1]

2.- Los giros como transformaciones de coordenadas de los 4 cuadrados: una vez establecida cada pieza como un conjunto de 4 cuadrados, podemos aplicar la misma filosofía a la hora de aplicar los giros: en vez de giros, estos serán transformaciones de coordenadas respecto a su situación anterior de tal forma que pondremos los cuadraditos en función de dónde estaban antes. Ahora bien, hay que tener en cuenta la situación de cada pieza, así que el procedimiento girar llama a uno u otro procedimiento en función de qué pieza es y de qué situación de giro lleve:

to girar
if [pieza=1][ifelse [giro=0][p1a][p1b]]
if [pieza=5][ifelse [giro=0][p5a][p5b]]
if [pieza=6][ifelse [giro=0][p6a][p6b]]
if [pieza=2][ifelse [giro=0][p2a][ifelse[giro=1][p2b][ifelse[giro=2][p2c][p2d]]]]
if [pieza=3][ifelse [giro=0][p3a][ifelse[giro=1][p3b][ifelse[giro=2][p3c][p3d]]]]
if [pieza=4][ifelse [giro=0][p4a][ifelse[giro=1][p4b][ifelse[giro=2][p4c][p4d]]]]
end

La pieza 1 sólo tiene dos posibles posiciones, de tal forma que si la variable giro vale 0 se ejecuta el procedimiento p1a y si la variable giro vale 1 entonces se ejecuta el procedimiento p1b (esto es lo que hace el comando ifelse, si se cumple la condición ejecuta la primera sentencia y si no se cumple, ejecuta la segunda), procedimientos que toman esta forma:

to p1a
make "c1 x1 make "d1 y1 make "c2 x2+1 make "d2 y2-1 make "c3 x3+2 make "d3 y3-2 make "c4 x4+3 make "d4 y4-3
choque
if [haychoque=0][make "x2 x2+1 make "y2 y2-1 make "x3 x3+2 make "y3 y3-2 make "x4 x4+3 make "y4 y4-3 make "giro 1]
end
to p1b
make "c1 x1 make "d1 y1 make "c2 x2-1 make "d2 y2+1 make "c3 x3-2 make "d3 y3+2 make "c4 x4-3 make "d4 y4+3
choque
if [haychoque=0][make "x2 x2-1 make "y2 y2+1 make "x3 x3-2 make "y3 y3+2 make "x4 x4-3 make "y4 y4+3 make "giro 0]
end

P1a y p1b establecen las nuevas coordenadas si hay posibilidad de giro, pues invocan al procedimiento choque que lo que hace es mirar si las nuevas coordenadas de giro están o no ocupadas (si están ocupadas no podrá ser realizado el giro).

Las piezas 2, 3 y 4 tienen 4 posibilidades, luego la variable giro podrá tomar 4 valores. Para ello usaremos varios ifelse anidados, tal y como se ve en el código.

Si analizamos de nuevo lo que ocurre con la pieza 4, podemos ver que durante los giros la pieza adopta estas 4 posibilidades:



Numeramos los 4 cuadraditos para cada transformación de coordenadas. El punto rojo marca la posición inicial del cuadradito 1 (el que deriva las coordenadas x1,y1). De esta forma tenemos las siguientes transformaciones:

Giro 1: x1=x1, y1=y1, x2=x2-1, y2=y2+1, x3=x3-2, y3=y3+2, x4=x4, y4=y4
Siendo giro 1 la transformación de la primera forma a la segunda forma.

Que en código toma esta expresión:

if [haychoque=0][make "x2 x2-1 make "y2 y2+1 make "x3 x3-2 make "y3 y3+2 make "giro 1]

(notando que aquellas transformaciones que quedan igual como y4=y4 no hace falta escribirlas). El resto de transformaciones se hacen igual y son las escritas en el código.

3.- Manejando dos tablas a la vez: si se mira el código, se verá que hay dos tablas, una denominada tabla y otra denominada tablacolor. La primera es para la jugabilidad general y la principal y la segunda la hice con el objetivo de poder recordar los colores cuando se hace una línea, pues los cuadraditos bajan y, como cada pieza es de un color diferente, el cuadradito que desciende debe tener el color que tenía. El contenido de tablacolor se establece cuando la pieza se detiene y hace que los cuadraditos de esa pieza queden con el color que tenían. El contenido de la tabla es la siguiente: 0 para no ocupación, 5 para las paredes, 6 para las piezas paradas.

4.- Saber si hay o no línea: el procedimiento para saber si hay o no línea es el siguiente: el procedimiento juego llama, cuando la variable contador es 0, al procedimiento bajapieza que es el encargado de bajar la pieza. El procedimiento bajapieza llama al procedimiento choque para saber si va a chocar la pieza con algo (si va a chocar la pieza con algo es que no puede bajar más y se parará). Si la pieza debe parar, entonces se invoca el procedimiento parapieza, que es el encargado de transformar la pieza en una pieza parada (valor 6 en la tabla) y llama al procedimiento lineasiono (para saber si hay o no línea). El procedimiento lineasiono comprueba si hubo o no línea (contando el número de cuadraditos de la fila) y, si la hubo, invoca al procedimiento haylinea (encargado de sumar los puntos) y al procedimiento caer (pues las línea se elimina y los cuadraditos de abajo deben caer). Como al eliminar una línea y haber cuadraditos por encima puede ser que se hagan más de una línea, el procedimiento caer llama al procedimiento caehasta. Como vemos, algo un poco complicado.


Código del juego

;
; Videojuego Tetris
; Raultecnologia
; el programa esta en LOGO para usar directamente en el UCBLogo
; para empezar el juego teclea el procedimiento inicio
;

;
; Pantalla de presentacion
;
to inicio
hideturtle
clearscreen
setpensize 1
penup
setxy -200 140
setpencolor 4
label "|Videojuego Tetris|
setxy -200 110
setpencolor 7
label "|teclas o p para mover y tecla q para rotar|
setxy -200 -20
label "|Elige 1 juego facil o 2 juego dificil|
make "tecla rc
clearscreen
setpencolor 7
if [tecla="1] [make "contadorinicio 500 comienzo]
if [tecla="2] [make "contadorinicio 200 comienzo]
inicio
end



;
; el procedimiento campo dibuja la pantalla principal
;
to campo
setpencolor 15
for [i 0 11][penup setxy i*11+11 0+11 cuadrado mdsetitem (list :i+1 1) :tabla 5]
for [j 0 25][penup setxy 0+11 j*11+11 cuadrado mdsetitem (list 1 :j+1) :tabla 5]
for [j 0 25][penup setxy 11*11+11 j*11+11 cuadrado mdsetitem (list 12 :j+1) :tabla 5]
end

;
; el procedimiento cuadrado dibuja un cuadrado
;
to cuadrado
pendown
fd 10
rt 90
fd 10
rt 90
fd 10
rt 90
fd 10
rt 90
rt 45
fd 14
back 14
rt 45
fd 10
lt 90
lt 45
fd 14
back 14
lt 45
fd 10
rt 90
penup
end


;
; procedimiento eligepieza sirve para elegir la pieza
;
to eligepieza
make "giro 0
make "pieza random 7
;make "pieza 4
make "x1 5
make "y1 25
;
; pieza 0 es la 0, 1 la I, 2 la L, 3, la J, 4 la T, 5 la S y 6 la Z
;
if [pieza=0][make "c 1 make "x2 x1+1 make "x3 x1 make "x4 x1+1 make "y2 y1 make "y3 y1+1 make "y4 y1+1]
if [pieza=1][make "c 4 make "x2 x1 make "x3 x1 make "x4 x1 make "y2 y1+1 make "y3 y1+2 make "y4 y1+3]
if [pieza=2][make "c 5 make "x2 x1 make "x3 x1 make "x4 x1+1 make "y2 y1+1 make "y3 y1+2 make "y4 y1]
if [pieza=3][make "c 7 make "x2 x1+1 make "x3 x1+1 make "x4 x1+1 make "y2 y1 make "y3 y1+1 make "y4 y1+2]
if [pieza=4][make "c 8 make "x2 x1+1 make "x3 x1+2 make "x4 x1+1 make "y2 y1 make "y3 y1 make "y4 y1+1]
if [pieza=5][make "c 2 make "x2 x1+1 make "x3 x1+1 make "x4 x1+2 make "y2 y1 make "y3 y1+1 make "y4 y1+1]
if [pieza=6][make "c 3 make "x2 x1+1 make "x3 x1-1 make "x4 x1 make "y2 y1 make "y3 y1+1 make "y4 y1+1]

make "dentro mditem (list :x1 :y1) :tabla
if [dentro>3][fin]
make "dentro mditem (list :x2 :y2) :tabla
if [dentro>3][fin]
make "dentro mditem (list :x3 :y3) :tabla
if [dentro>3][fin]
make "dentro mditem (list :x4 :y4) :tabla
if [dentro>3][fin]

end

to pintapieza
setpencolor c
penup
setxy x1*11 y1*11
cuadrado
setxy x2*11 y2*11
cuadrado
setxy x3*11 y3*11
cuadrado
setxy x4*11 y4*11
cuadrado
end

to borrapieza
penup
setpc 0
setxy x1*11 y1*11
cuadrado
setxy x2*11 y2*11
cuadrado
setxy x3*11 y3*11
cuadrado
setxy x4*11 y4*11
cuadrado
end



;
; el procedimiento comienzo establece las condiciones iniciales
;
to comienzo
clearscreen
;
; definimos una tabla llenas de ceros salvo que esté ocupada por paredes o por restos de piezas
; tambien definimos una tabla para guardar la informacion del color de las piezas
;
make "size_x 15
make "size_y 30
make "tabla (mdarray (list :size_x :size_y) 1)
for [i 1 size_x 1] [for [j 1 size_y 1] [mdsetitem (list :i :j) :tabla 0]]
make "tablacolor (mdarray (list :size_x :size_y) 1)
for [i 1 size_x 1] [for [j 1 size_y 1] [mdsetitem (list :i :j) :tablacolor 0]]
campo
penup
hideturtle
make "contador contadorinicio

make "puntos 0
make "giro 0
setpencolor 7
setxy 30 -40
label "Puntos
setxy 100 -40
label puntos
make "tecla 0
eligepieza
pintapieza
juego
end




;
; el procedimiento juego controla las condiciones del juego
;
to juego

make "contador contador-1
if keyp [make "tecla rc]
if [tecla = "o][tecla_o make "tecla 0]
if [tecla = "p][tecla_p make "tecla 0]
if [tecla = "q][copia borrapieza girar pintapieza make "tecla 0]
;if [contador=0][comprueba compruebacolor bajapieza]
if [contador=0][bajapieza]
juego
end

;
; bajapieza es el procedimiento para cuando toca bajar una linea
;
to bajapieza
make "c1 x1 make "c2 x2 make "c3 x3 make "c4 x4 make "d1 y1-1
make "d2 y2-1 make "d3 y3-1 make "d4 y4-1
choque
ifelse [haychoque=0][borrapieza make "contador contadorinicio make "y1 y1-1 make "y2 y2-1 make "y3 y3-1 make "y4 y4-1 pintapieza][parapieza]
end

;to comprueba
;penup
;setpencolor 7
;for [i 1 13][for[j 1 30] [make "dentro mditem (list :i :j) :tabla setxy -200+12*i -100+12*j label dentro]]
;end

;to compruebacolor
;penup
;setpencolor 7
;for [i 1 13][for[j 1 30] [make "dentro mditem (list :i :j) :tablacolor setxy -400+12*i -100+12*j label dentro]]
;end

;
; procedimiento que indica que la pieza ya no puede bajar
;
to parapieza
mdsetitem (list :x1 :y1) :tabla 6
mdsetitem (list :x2 :y2) :tabla 6
mdsetitem (list :x3 :y3) :tabla 6
mdsetitem (list :x4 :y4) :tabla 6
mdsetitem (list :x1 :y1) :tablacolor c
mdsetitem (list :x2 :y2) :tablacolor c
mdsetitem (list :x3 :y3) :tablacolor c
mdsetitem (list :x4 :y4) :tablacolor c
lineasiono
eligepieza
pintapieza
make "contador contadorinicio
end

;
; procedimiento para ver si hay o no una linea de tetris
;
to lineasiono
make "cuenta 0
make "hubolinea 0
for [j 2 30][make "cuenta 0 for[i 2 11][make "dentro mditem (list :i :j) :tabla if[dentro=6][make "cuenta cuenta+1] if [cuenta=10][make "ylinea j haylinea make "hubolinea 1]]]
if [hubolinea=1][caer]
if [hubolinea=1][lineasiono]
end

to caer
for [i 2 11][for[j 3 30] [make "ii i make "jj j make "dentro mditem (list :i :j) :tabla make "dentrocolor mditem (list :i :j) :tablacolor if[dentro=6][caehasta]]]
end

to caehasta
setpencolor 0 setxy ii*11 jj*11 cuadrado
setpencolor dentrocolor
mdsetitem (list :ii :jj) :tabla 0
mdsetitem (list :ii :jj) :tablacolor 0
make "k jj-1
make "dentrok mditem (list :ii :k) :tabla
while [dentrok=0][make "k k-1 make "dentrok mditem (list :ii :k) :tabla]
mdsetitem (list :ii :k+1) :tabla 6
mdsetitem (list :ii :k+1) :tablacolor dentrocolor
setxy ii*11 (k+1)*11 cuadrado
end

to haylinea
for [i 2 11][mdsetitem (list :i :ylinea) :tabla 0]
for [i 2 11][mdsetitem (list :i :ylinea) :tablacolor 0]
for [i 2 11][setpencolor 0 setxy i*11 ylinea*11 cuadrado]
penup
make "puntos puntos+10
setpencolor 7
setxy 30 -40
label "Puntos
setxy 100 -40
label puntos
end

to copia
make "c1 x1 make "c2 x2 make "c3 x3 make "c4 x4 make "d1 y1 make "d2 y2 make "d3 y3 make "d4 y4
end

to tecla_o
make "c1 x1-1 make "c2 x2-1 make "c3 x3-1 make "c4 x4-1 make "d1 y1 make "d2 y2 make "d3 y3 make "d4 y4
choque
if [haychoque=0][borrapieza make "x1 x1-1 make "x2 x2-1 make "x3 x3-1 make "x4 x4-1 pintapieza]
end

to tecla_p
make "c1 x1+1 make "c2 x2+1 make "c3 x3+1 make "c4 x4+1 make "d1 y1 make "d2 y2 make "d3 y3 make "d4 y4
choque
if [haychoque=0][borrapieza make "x1 x1+1 make "x2 x2+1 make "x3 x3+1 make "x4 x4+1 pintapieza]
end

;
; choque mira si cuando hay un cambio de posicion esta es posible
;
to choque
make "dentroa mditem (list :c1 :d1) :tabla
make "dentrob mditem (list :c2 :d2) :tabla
make "dentroc mditem (list :c3 :d3) :tabla
make "dentrod mditem (list :c4 :d4) :tabla
ifelse[dentroa>4][make "haychoque 1][ifelse[dentrob>4][make "haychoque 1][ifelse[dentroc>4][make "haychoque 1][ifelse[dentrod>4][make "haychoque 1][make "haychoque 0]]]]
end

to girar
if [pieza=1][ifelse [giro=0][p1a][p1b]]
if [pieza=5][ifelse [giro=0][p5a][p5b]]
if [pieza=6][ifelse [giro=0][p6a][p6b]]

if [pieza=2][ifelse [giro=0][p2a][ifelse[giro=1][p2b][ifelse[giro=2][p2c][p2d]]]]
if [pieza=3][ifelse [giro=0][p3a][ifelse[giro=1][p3b][ifelse[giro=2][p3c][p3d]]]]
if [pieza=4][ifelse [giro=0][p4a][ifelse[giro=1][p4b][ifelse[giro=2][p4c][p4d]]]]
end

;
; aqui vienen los procedimientos para los giros
;
to p1a
make "c1 x1 make "d1 y1 make "c2 x2+1 make "d2 y2-1 make "c3 x3+2 make "d3 y3-2 make "c4 x4+3 make "d4 y4-3
choque
if [haychoque=0][make "x2 x2+1 make "y2 y2-1 make "x3 x3+2 make "y3 y3-2 make "x4 x4+3 make "y4 y4-3 make "giro 1]
end
to p1b
make "c1 x1 make "d1 y1 make "c2 x2-1 make "d2 y2+1 make "c3 x3-2 make "d3 y3+2 make "c4 x4-3 make "d4 y4+3
choque
if [haychoque=0][make "x2 x2-1 make "y2 y2+1 make "x3 x3-2 make "y3 y3+2 make "x4 x4-3 make "y4 y4+3 make "giro 0]
end

to p5a
make "c1 x1+1 make "d1 y1 make "c2 x2 make "d2 y2+1 make "c3 x3-1 make "d3 y3 make "c4 x4-2 make "d4 y4+1
choque
if [haychoque=0][make "x1 x1+1 make "y2 y2+1 make "x3 x3-1 make "x4 x4-2 make "y4 y4+1 make "giro 1]
end
to p5b
make "c1 x1-1 make "d1 y1 make "c2 x2 make "d2 y2-1 make "c3 x3+1 make "d3 y3 make "c4 x4+2 make "d4 y4-1
choque
if[haychoque=0][make "x1 x1-1 make "y2 y2-1 make "x3 x3+1 make "x4 x4+2 make "y4 y4-1 make "giro 0]
end

to p6a
make "c1 x1 make "d1 y1+1 make "c2 x2-1 make "d2 y2+2 make "c3 x3 make "d3 y3-1 make "c4 x4-1 make "d4 y4
choque
if [haychoque=0][make "y1 y1+1 make "x2 x2-1 make "y2 y2+2 make "y3 y3-1 make "x4 x4-1 make "giro 1]
end
to p6b
make "c1 x1 make "d1 y1-1 make "c2 x2+1 make "d2 y2-2 make "c3 x3 make "d3 y3+1 make "c4 x4+1 make "d4 y4
choque
if [haychoque=0][make "y1 y1-1 make "x2 x2+1 make "y2 y2-2 make "y3 y3+1 make "x4 x4+1 make "giro 0]
end


;
; p2a, p2b, p2c y p2d son las transformaciones de coordenadas en los giros para la pieza 2
;
to p2a
make "d1 y1+1 make "c2 x2+1 make "c3 x3+2 make "d3 y3-1 make "c4 x4-1
choque
if [haychoque=0][make "y1 y1+1 make "x2 x2+1 make "x3 x3+2 make "y3 y3-1 make "x4 x4-1 make "giro 1]
end
to p2b
make "c1 x1+1 make "d1 y1-1 make "c3 x3-1 make "d3 y3+1 make "d4 y4+2
choque
if [haychoque=0][make "x1 x1+1 make "y1 y1-1 make "x3 x3-1 make "y3 y3+1 make "y4 y4+2 make "giro 2]
end
to p2c
make "c1 x1-1 make "d2 y2-1 make "c3 x3+1 make "d3 y3-2 make "c4 x4+2 make "d4 y4-1
choque
if [haychoque=0][make "x1 x1-1 make "y2 y2-1 make "x3 x3+1 make "y3 y3-2 make "x4 x4+2 make "y4 y4-1 make "giro 3]
end
to p2d
make "c2 x2-1 make "d2 y2+1 make "c3 x3-2 make "d3 y3+2 make "c4 x4-1 make "d4 y4-1
choque
if [haychoque=0][make "x2 x2-1 make "y2 y2+1 make "x3 x3-2 make "y3 y3+2 make "x4 x4-1 make "y4 y4-1 make "giro 0]
end

;
; p3a, p3b, p3c y p3d son las transformaciones de coordenadas en los giros para la pieza 3
;
to p3a
make "d1 y1+1 make "c2 x2-1 make "d3 y3-1 make "c4 x4+1 make "d4 y4-2
choque
if [haychoque=0][make "y1 y1+1 make "x2 x2-1 make "y3 y3-1 make "x4 x4+1 make "y4 y4-2 make "giro 1]
end
to p3b
make "c1 x1+1 make "d1 y1+1 make "d2 y2+2 make "c3 x3-1 make "d3 y3+1 make "c4 x4-2
choque
if [haychoque=0][make "x1 x1+1 make "y1 y1+1 make "y2 y2+2 make "x3 x3-1 make "y3 y3+1 make "x4 x4-2 make "giro 2]
end
to p3c
make "c1 x1+1 make "d1 y1-2 make "c2 x2+2 make "d2 y2-1 make "c3 x3+1 make "d4 y4+1
choque
if [haychoque=0][make "x1 x1+1 make "y1 y1-2 make "x2 x2+2 make "y2 y2-1 make "x3 x3+1 make "y4 y4+1 make "giro 3]
end
to p3d
make "c1 x1-2 make "c2 x2-1 make "d2 y2-1 make "c4 x4+1 make "d4 y4+1
choque
if [haychoque=0][make "x1 x1-2 make "x2 x2-1 make "y2 y2-1 make "x4 x4+1 make "y4 y4+1 make "giro 0]
end

;
; p4a, p4b, p4c y p4d son las transformaciones de coordenadas en los giros para la pieza 4
;
to p4a
make "c2 x2-1 make "d2 y2+1 make "c3 x3-2 make "d3 y3+2
choque
if [haychoque=0][make "x2 x2-1 make "y2 y2+1 make "x3 x3-2 make "y3 y3+2 make "giro 1]
end
to p4b
make "d1 y1+1 make "c2 x2+1 make "c3 x3+2 make "d3 y3-1 make "d4 y4-1
choque
if [haychoque=0][make "y1 y1+1 make "x2 x2+1 make "x3 x3+2 make "y3 y3-1 make "y4 y4-1 make "giro 2]
end
to p4c
make "c1 x1+1 make "d1 y1-1 make "c3 x3-1 make "d3 y3+1 make "c4 x4-1 make "d4 y4+1
choque
if [haychoque=0][make "x1 x1+1 make "y1 y1-1 make "x3 x3-1 make "y3 y3+1 make "x4 x4-1 make "y4 y4+1 make "giro 3]
end
to p4d
make "c1 x1-1 make "d2 y2-1 make "c3 x3+1 make "d3 y3-2 make "c4 x4+1
choque
if [haychoque=0][make "x1 x1-1 make "y2 y2-1 make "x3 x3+1 make "y3 y3-2 make "x4 x4+1 make "giro 0]
end

;
; fin finaliza el juego
;
to fin
setpencolor 1
penup
setxy 0 -70
label "|FIN DE LA PARTIDA|
setxy 0 -90
label "|Pulsa una tecla para empezar|
wait 120
make "tecla rc
inicio
end