Bertie

Abersoft Forth, el Forth que más usé con la ZX Spectrum, traía un juego de demostración llamado Bertie. Desgraciadamente no era una maravilla ni aprovechaba las capacidades de Forth. Los gráficos eran bloques de 2x2 caracteres que se movían a saltos de 2 caracteres.

Tampoco el código fuente servía para aprender, porque estaba escrito de forma muy densa y sin un solo comentario, comprimido en ocho bloques del disco-RAM.

Muchos años después, en 2009, extraje el código fuente del fichero original. Lo maqueté en un fichero de texto para poder leerlo mejor y entender cómo funcionaba. Por ejemplo, descubrí que el programa modificaba una variable del sistema para cambiar los colores de impresión y hacía la detección de choques comprobando dichos atributos en la esquina superior izquierda de cada gráfico. Aproveché para hacer una modificación: le cambié las teclas de control por las teclas habituales de muchos juegos de la Spectrum (5, 6, 7, 8).

En enero de 2010 tuve la idea de hacer una versión de Bertie para la computadora Jupiter Ace. Al poco de examinar el código con atención descubrí y corregí un error: el desconocido programador (posiblemente John Jones-Steel, autor de Abersoft Forth) se había «comido» dos palabras en una expresión, alterando con ello el movimiento de uno de los gráficos en la cuarta pantalla del juego.

En principio la tarea de traducir un programa de Abersoft Forth a Ace Forth parecía fácil porque la ZX Spectrum tiene más capacidades gráficas que la Jupiter Ace. Pero entender y reescribir con buen estilo Forth el denso y oscuro código original de Bertie resultó un desafío. El resultado está en avanzado estado de desarrollo y se llamará Bertie's Face.

En esta página publico este sencillo juego con mis modificaciones y formateado para facilitar su lectura.

Pantallazos

La primera pantalla con todos los elementos del juego: los bloques que forman el laberinto, las dos formas locas, la llave, la cerradura y el sonriente Bertie:

Bertie

Efecto final cuando se acaban las tres vidas disponibles:

Bertie

Listado

Los caracteres recuadrados representan caracteres gráficos definidos por el usuario (A-U); los caracteres gráficos de bloques se representan con su equivalente en Unicode.


\ Bertie

\ This is the demo game bundled with Abersoft Forth
\ (for the Sinclair ZX Spectrum)

\ Modified by Marcos Cruz (http://programandala.net):

\ Changes
\ 2009-05-23 Control keys changed to: 5 6 7 and 8.
\ 2010-01-18 Bug fixed in SHMOVE .
\ 2010-03-03 Unnecessary word removed in GO .
\ 2010-03-10 Bug discovered but not fixed: the shapes can destroy the key.

: RND 
	23670 @ 75 U* 75 0 D+ OVER OVER U< - - 1 - DUP 23670 !
	U* SWAP DROP 
	; 

: RANDOM 
	23672 @ 23670 ! 
	; 

6 BORDER 5 PAPER CLS

: GR 
	1 -  8 * UDG 1 - + DUP 8 +
	DO 
		I C! -1 
	+LOOP
	;

0 3 12 16 46 42 78 64 1 GR 
0 192 48 8 116 84 114 2 2 GR
65 65 44 39 17 12 3 0 3 GR 
130 130 52 228 136 48 192 0 4 GR
0 0 0 0 0 0 0 1 5 GR 
0 28 54 34 54 124 224 192 6 GR
3 7 14 28 56 52 8 0 7 GR 
128 0 0 0 0 0 0 0 8 GR
255 255 252 248 240 240 248 252 9 GR 
255 255 63 31 15 15 31 63 10 GR 
254 254 252 252 248 240 255 255 11 GR 
127 127 63 63 31 15 255 255 12 GR 

224 CONSTANT 208

0 7 7 7 7 127 127 127 13 GR 
0 208 208 208 208 254 254 254 14 GR
127 127 127 7 7 7 7 0 15 GR 
254 254 254 208 208 208 208 0 16 GR
0 8 28 60 127 63 31 15 17 GR 
0 16 56 124 254 252 248 240 18 GR
15 31 63 127 60 28 8 0 19 GR 
240 248 252 254 124 56 16 0 20 GR
170 85 170 85 170 85 170 85 21 GR

0 VARIABLE MX 
0 VARIABLE MY 
0 VARIABLE DX 
0 VARIABLE DY 
RANDOM 
0 VARIABLE KX 
0 VARIABLE KY 
7 PAPER 7 BORDER CLS 
0 VARIABLE KEY?
1 VARIABLE MAZE 
0 VARIABLE SCORE 
3 VARIABLE LIVES 
3 PAPER 4 INK
 
: PRMAN 
	1 INK MX @ MY @ OVER 1+ OVER AT ." CD" AT ." AB" 
	;

: PRBLANK 
	1 INK MX @ MY @ OVER 1+ OVER AT 2 SPACES AT 2 SPACES 
	;
 
: PRMAZE 
	MAZE @ 5 * 5 + 0 DO 10 RND 2 * 14 RND 2 * OVER 1+
	OVER AT ." UU" AT ." UU" LOOP 7 PAPER 10 RND 2 * DX ! 30 DY ! DX
	@ DY @ OVER 1+ OVER 2 INK AT ." KL" AT ." IJ" 8 RND 2 * 4 + KX
	! 16 KY ! KX @ KY @ OVER 1+ OVER 3 INK AT ." GH" AT ." EF"
	57 23693 C! 2 0 AT ."     " 3 0 AT ."     " 
	;

: TUNE1 
	1000 500 DO 10 I BLEEP 50 +LOOP 
	;

: TUNE2 
	500 1000 DO 10 I BLEEP I -5 / +LOOP 
	; 

PRMAZE PRMAN

: PAUSE 
	32767 0 DO LOOP 
	; 

: NMAZE
	5 0 DO TUNE1 TUNE2 LOOP 1 MAZE +! PAUSE 0 MX ! 0 MY ! 
	;

: TUNE3 
	1500 500 DO 50 I BLEEP 100 +LOOP 400 600 DO 30 I BLEEP
	-25 +LOOP 10 0 DO TUNE2 LOOP 
	; 

6 BORDER TUNE3 

0 VARIABLE CX 
0 VARIABLE CY 
0 VARIABLE SX 
0 VARIABLE SY

: FIN 
	50 0 DO 127 87 PLOT 255 RND 175 RND DRAW LOOP 
	CLS
	10 0 DO TUNE1 LOOP 
	5 9 AT ." You scored " 2 INK SCORE @ .
	1 INK 7 7 AT ." You reached maze " 3 INK MAZE @ . 
	1 INK 9 5 AT ." To replay type......." 235 23693 C!
	11 11 AT ." " 
	12 11 AT ."  " 
	13 11 AT ." "
	57 23693 C! TUNE3 QUIT 
	;

: CRASH 
	10 0 DO 
		256 0 DO 
			I 254 OUTP 
		LOOP 
	LOOP 
	6 BORDER -1 LIVES +! 
	LIVES @ 0= IF FIN ENDIF 
	0 MX ! 0 MY ! 18 SX ! 28 SY !
	PAUSE CLS 
	28 23693 C! 
	PRMAZE PRMAN TUNE3 
	;

: Z 0 23672 ! ;

: A 
	10000 23672 @ - 75 / SCORE +!
	SCORE @ 0< IF 0 SCORE ! ENDIF 
	;

: CHECK 
	MX @ DUP 0< IF CRASH ENDIF 
	20 > IF CRASH ENDIF 
	MY @ DUP 0< IF CRASH ENDIF 
	30 > IF CRASH ENDIF 
	MX @ MY @ ATTR 
	CASE 
		231 OF CRASH ENDOF 
		28 OF CRASH ENDOF 
		58 OF 
				KEY? @ 0= 
				IF CRASH 
				ELSE
					0 KEY? ! 100 SCORE +! NMAZE 
					CLS A 28 23693 C! PRMAZE PRMAN Z
				ENDIF 
			ENDOF
		59 OF 1 KEY? ! TUNE1  10 SCORE +! ENDOF 
	ENDCASE 
	; 

: DOWN 2 MX +! ;

: LEFT -2 MY +! ; 

: RIGHT 2 MY +! ; 

: UP -2 MX +! ;

: MOVE 
	INKEY PRBLANK
	CASE 
		53 OF LEFT ENDOF 
		56 OF RIGHT ENDOF 
		55 OF UP ENDOF 
		54 OF DOWN ENDOF 
		49 OF QUIT ENDOF 
	ENDCASE 
	CHECK PRMAN TUNE2 
	; 

: PRSC
	0 23659 C! 
	15 23693 C! 
	21 0 AT CR 
	." Score:" SCORE @ . 3 SPACES
	." Maze:" MAZE @ . 3 SPACES 
	." Lives:" LIVES @ . 
	57 23693 C!
	2 23659 C! 
	;


: PRBLCS 
	57 23693 C! CX @ CY @ OVER 1+ OVER
	AT 2 SPACES AT 2 SPACES 
	SX @ SY @ OVER 1+ OVER 
	AT 2 SPACES AT 2 SPACES 
	; 

: PRSHAPE 
	231 23693 C! CX @ CY @ OVER 1+ OVER 
	AT ." OP" AT ." MN" 
	SX @ SY @ OVER 1+ OVER 
	AT ." ST" AT ." QR" 57 23693 C! 
	;

: SHMOVE 
	KEY? @ 0= 
	IF 
		3 INK KX @ KY @ OVER 1+ OVER 
		AT ." GH" AT ." EF" 
		2 INK DX @ DY @ OVER 1+ OVER 
		AT ." KL" AT ." IJ" 
	ENDIF
	PRBLCS MAZE @ 4 < 
	IF 
		2 CY ! 28 SY ! 3 RND 1 - 2 * CX +! 3 RND 1
		- 2 * SX +! 
	ELSE 
		MAZE @ 5 > IF 26 CY ! ENDIF 
		( Bug: ) 
		( MAZE 4 = IF 16 CY ENDIF )
		( 2010-01-18 Fixed: )
		MAZE @ 4 = IF 16 CY ! ENDIF 
		MX @ SX @ = IF 20 SX ! ENDIF 
		23672 @ 3 MOD 0= 
		IF
			MX @ SX @ > IF 2 SX +! ELSE -2 SX +! ENDIF 
		ENDIF
		MAZE @ 4 > 
		IF 
			MX @ CX @ > IF 2 CX +! ELSE -2 CX +! ENDIF 
		ENDIF
		MY @ SY @ > IF 2 SY +! ELSE -2 SY +! ENDIF 
		MAZE @ 5 >
		IF 
			MY @ CY @ > IF 2 CY +! ELSE -2 CY +! ENDIF 
		ENDIF 
	ENDIF
	SX @ DUP 0< IF 0 SX ! ENDIF 
	20 > IF 20 SX ! ENDIF
	SY @ DUP 0< IF 0 SY ! ENDIF 
	28 > IF 28 SY ! ENDIF
	CX @ DUP 0< IF 0 CX ! ENDIF 
	20 > IF 20 CX ! ENDIF
	CY @ DUP 0< IF 0 CY ! ENDIF 
	28 > IF 28 CY ! ENDIF
	PRSHAPE 
	; 

: GAME 
	BEGIN 
		CHECK MOVE PRSC SHMOVE 
	AGAIN 
	; 

: INST 
	CLS 1 INK
	9 2 AT ." Do you want instructions" 7 INK 
	KEY
	KEY 89 = IF 
		2 BORDER 2 PAPER 7 INK CLS
		." " CR        
		."     " CR
		."       " CR
		."     " CR CR CR
		6 INK ."   The object of the game is to" CR
		." gain as many points as"
		CR ." possible by picking up the" CR ." key and using it to"
		."  unlock" CR ." the door. " 1 BRIGHT ." BUT" 0 BRIGHT
		."  you must" CR ." avoid the shapes which" CR ." are trying"
		."  to catch you." CR ." At each new maze the shapes" CR
		." become more difficult to avoid." CR CR
		."    Press any key to continue" 2 INK KEY
		CR CR 5 INK ." Controls:" 7 INK CR CR
		4 SPACES ." 5  Left" 7 SPACES ." 8  Right" CR CR
		4 SPACES ." 6  Down" 7 SPACES ." 7  Up" CR CR CR
		5 INK ." Scores:" CR 7 INK CR
		."  Picking up the key scores" CR 20 SPACES ." 10 points" CR CR
		."  Unlocking the door scores" CR 19 SPACES ." 100 points" CR CR
		."  If you complete a maze quickly  you will get bonus points"
		CR ."  depending on your time" CR CR CR
		."    Press any key to continue" 
		2 INK KEY
	ENDIF 
	7 PAPER 6 BORDER 1 INK CLS 
	;

: GO 
	( Unnecessary word: ) 
	( [COMPILE] 0 MX !  )
	( 2010-03-03 Fixed: )
	INST 0 MX ! 0 MY ! 1 MAZE ! 3 LIVES ! 0 SCORE !
	10 CX ! 10 SX ! 2 CY ! 28 SY ! CLS 28 23693 C! PRMAZE PRMAN
	RANDOM Z GAME 
	; 

GO


Descarga

Páginas relacionadas

Glosario

RAM
Random Access Memory (memoria volátil de lectura y escritura)