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