En el quinto tomo de la excepcional enciclopedia Mi computer (ya he escrito algo acerca de Mi computer en un artículo reciente), en la página 1112, venía el listado, muy bien explicado, de un juego muy sencillo escrito en Sinclair BASIC para la ZX Spectrum; estaba inspirado en una famosa escena de la película Tron: la de la lucha entre dos motos sobre una cuadrícula.
Nunca me han atraído mucho los videojuegos. Cuando me gustaba alguno solía ser porque me preguntaba cómo estaría programado. Tron es un juego muy sencillo (35 líneas de programa) pero muy adictivo. Recuerdo que lo copié para probarlo y al poco tiempo me pregunté qué tal resultaría una versión en Forth, que sin duda sería mucho más rápida.
Era abril de 1985... y recordando aquello me doy cuenta de que en algunas cosas
no he cambiado apenas: a menudo veo el código fuente de un programa escrito en
otro lenguaje y lo primero que me pasa por la cabeza es
Esto sería más fácil de hacer en Forth
o
Esto funcionaría más rápido en Forth
o
Esto ocuparía menos espacio en Forth
o
Esto tendría un aspecto más elegante en Forth
...
Dicho y hecho: escribí una versión para Abersoft Forth, el sistema Forth que más usé en la Spectrum.
Al ver este código después de tantos años advierto enseguida que sí hay algunas cosas que han cambiado: hoy no escribo Forth así.
Varios puntos del programa delatan que se trata de una adaptación de un programa en BASIC, por ejemplo las palabras INIT, MAIN y CRASH, que son demasiado largas y complejas:
para acercarlas al espíritu de Forth habría que dividirlas en partes.
Veinte años más tarde escribiría una versión de Tron para mi Forth 5mx, para la computadora Psion 5mx (con un código mucho mejor escrito).
Listado
A continuación muestro el código de mi primera versión de Tron, tanto en su formato original de bloques como editado en formato de texto para hacerlo más legible. La escasez de espacio al editar en bloques en Abersoft Forth, el sistema tradicional de Forth, me animó en su día a no incluir comentarios, pero el código es tan sencillo que puede entenderse sin ellos.
Código fuente original
Screen # 0
0 TRON
1 Copyright (C) 1985 Marcos Cruz (http://programandala.net)
2 Licencia/License: http://programandala.net/license
3 Cada jugador tiene una moto
4 a velocidad desbocada.
5 Su unico control la hace
6 girar 90 grados sin frenar.
7 Cada moto deja tras de si
8 una pared solida de luz.
9 El objetivo del juego es
10 hacer estrellarse a la otra
11 moto con el laberinto hecho.
12 Teclas:
13 Jugador 1: Q A C X
14 Jugador 2: P ENTER M N
15 Para empezar teclea TRON y pulsa la tecla ENTER.
Screen # 1
0 FORTH DEFINITIONS VOCABULARY TRON TRON DEFINIIONS : TASK ;
1 0 VARIABLE Q
2 0 VARIABLE P
3 0 VARIABLE X
4 0 VARIABLE Y
5 0 VARIABLE A1
6 0 VARIABLE B1
7 0 VARIABLE M
8 0 VARIABLE N
9 0 VARIABLE I1
10 0 VARIABLE J1
11 0 VARIABLE COL
12 : NDRAW 23678 C@ + SWAP 23677 C@ + SWAP DRAW ;
13 : RND 23670 @ 75 U* 75 0 D+ OVER OVER U< - - 1 - DUP
14 23670 ! U* SWAP DROP ;
15 -->
Screen # 2
0
1 : INIC
2 0 DUP PAPER BORDER CLS
3 6 INK ." MOTO 1=" Q ?
4 5 INK ." MOTO 2=" P ?
5 2 INK 8 DUP PLOT 239 0 NDRAW 0 159 NDRAW
6 -239 0 NDRAW 0 -159 NDRAW
7
8 40 X ! 88 Y ! 215 M ! 88 N !
9 1 A1 ! 0 B1 ! -1 I1 ! 0 J1 !
10 7 INK 10 5 AT ." PULSA 0 PARA JUGAR "
11 KEY 48 = NOT IF 0 P ! 0 Q ! CLS 0 LIST QUIT ENDIF
12 10 5 AT 19 SPACES ;
13
14
15 -->
Screen # 3
0 : CHOQUE
1 COL @ INK 1 BRIGHT
2 175 Y @ - 8 / X @ 8 / AT ." "
3 100 50 DO
4 11 I BLEEP
5 LOOP
6 COL @ 6 = IF 1 P +! ELSE 1 Q +! THEN INIC ;
7 : POKE-XY
8 175 Y @ - 8 / 32 *
9 X @ 8 /
10 + 22528 + C! ;
11 : POKE-MN
12 175 N @ - 8 / 32 *
13 M @ 8 / + 22528 + C! ;
14
15 -->
Screen # 4
0 : BUCLE
1 BEGIN
2 X @ Y @ POINT IF 6 COL ! CHOQUE ENDIF
3 M @ N @ POINT IF 5 COL ! M @ X ! N @ Y ! CHOQUE ENDIF
4 X @ Y @ PLOT 6 POKE-XY 1 0 BLEEP
5 M @ N @ PLOT 5 POKE-MN 1 100 BLEEP
6 64510 INP 254 = IF 0 A1 ! 1 B1 ! ENDIF
7 65022 INP 254 = IF 0 A1 ! -1 B1 ! ENDIF
8 65278 INP 251 = IF -1 A1 ! 0 B1 ! ENDIF
9 65278 INP 247 = IF 1 A1 ! 0 B1 ! ENDIF
10 57342 INP 254 = IF 0 I1 ! 1 J1 ! ENDIF
11 49150 INP 254 = IF 0 I1 ! -1 J1 ! ENDIF
12 32766 INP 251 = IF 1 I1 ! 0 J1 ! ENDIF
13 32766 INP 247 = IF -1 I1 ! 0 J1 ! ENDIF
14 A1 @ X +! B1 @ Y +! I1 @ M +! J1 @ N +!
15 AGAIN ; -->
Screen # 5
0 : MOTO INIC BUCLE ;
1 0 PAPER 0 BORDER 7 INK CLS 0 LIST
2 ;S
3
4
5
6
7
8
9
10
11
12
13
14
15
Código fuente formateado como texto
( Tron )
( Escrito en el fig-Forh de Abersoft Forth, para Sinclair ZX Spectrum. )
( Copyright [C] 1985,2009 Marcos Cruz - http://programandala.net )
( Licencia / License : http://programandala.net/license )
( 1985-04 Versión en fig-Forth del original en Sinclair Basic publicado en "Mi computer", tomo 5, página 1112. )
( 2009-05 Creación de este fichero de texto, a partir del fichero de bloques original, con algunos cambios. )
( Este fichero no puede utilizarse directamente en ningún Forth de Spectrum. )
( Se ofrece sólo para facilitar el acceso al código fuente original. )
( El código fuente en el formato original, necesario para ejecutar este programa en Abersoft Forth, está en el fichero tron.tap, disponible en: )
( http://programandala.net/es.programa.tron )
FORTH DEFINITIONS
VOCABULARY TRON
TRON DEFINITIONS
: TASK ;
0 VARIABLE Q
0 VARIABLE P
0 VARIABLE X
0 VARIABLE Y
0 VARIABLE A1
0 VARIABLE B1
0 VARIABLE M
0 VARIABLE N
0 VARIABLE I1
0 VARIABLE J1
0 VARIABLE COL
: NDRAW
23678 C@ + SWAP 23677 C@ + SWAP DRAW
;
: RND
23670 @ 75 U* 75 0 D+ OVER OVER U< - - 1 - DUP
23670 ! U* SWAP DROP
;
: INIT
0 DUP PAPER BORDER CLS
6 INK ." MOTO 1=" Q ?
5 INK ." MOTO 2=" P ?
2 INK 8 DUP PLOT 239 0 NDRAW 0 159 NDRAW
-239 0 NDRAW 0 -159 NDRAW
40 X ! 88 Y ! 215 M ! 88 N !
1 A1 ! 0 B1 ! -1 I1 ! 0 J1 !
7 INK 10 5 AT ." PULSA 0 PARA JUGAR "
KEY 48 = NOT IF
0 P ! 0 Q ! CLS QUIT
ENDIF
10 5 AT 19 SPACES
;
: CRASH
COL @ INK 1 BRIGHT
175 Y @ - 8 / X @ 8 / AT ." "
100 50 DO
11 I BLEEP
LOOP
COL @ 6 = IF 1 P +! ELSE 1 Q +! THEN
INIT
;
: POKE-XY
175 Y @ - 8 / 32 *
X @ 8 /
+ 22528 + C!
;
: POKE-MN
175 N @ - 8 / 32 *
M @ 8 / + 22528 + C!
;
: MAIN
BEGIN
X @ Y @ POINT IF 6 COL ! CRASH ENDIF
M @ N @ POINT IF 5 COL ! M @ X ! N @ Y ! CRASH ENDIF
X @ Y @ PLOT 6 POKE-XY 1 0 BLEEP
M @ N @ PLOT 5 POKE-MN 1 100 BLEEP
64510 INP 254 = IF 0 A1 ! 1 B1 ! ENDIF
65022 INP 254 = IF 0 A1 ! -1 B1 ! ENDIF
65278 INP 251 = IF -1 A1 ! 0 B1 ! ENDIF
65278 INP 247 = IF 1 A1 ! 0 B1 ! ENDIF
57342 INP 254 = IF 0 I1 ! 1 J1 ! ENDIF
49150 INP 254 = IF 0 I1 ! -1 J1 ! ENDIF
32766 INP 251 = IF 1 I1 ! 0 J1 ! ENDIF
32766 INP 247 = IF -1 I1 ! 0 J1 ! ENDIF
A1 @ X +!
B1 @ Y +!
I1 @ M +!
J1 @ N +!
AGAIN
;
: TRON
INIT MAIN
;
0 PAPER 0 BORDER 7 INK CLS
CR ." TRON (Forth, ZX Spectrum)"
CR ." Copyright (C) 1985,2009 Marcos Cruz (http://programandala.net)"
CR ." Licencia/License: http://programandala.net/license"
CR
CR ." Cada jugador tiene una moto a velocidad desbocada."
CR ." Su único control la hace girar 90 grados sin frenar."
CR ." Cada moto deja tras de sí una pared sólida de luz."
CR ." El objetivo del juego es hacer estrellarse a la otra moto con el laberinto hecho."
CR
CR ." Teclas:"
CR ." Jugador 1: Q A C X"
CR ." Jugador 2: P ENTER M N"
CR
CR ." Para empezar escribe TRON y pulsa la tecla ENTER"