Caza Tesoros: mi primer juego en BASIC para ZX Spectrum (con DIM incluido)
Llevo un tiempo trasteando con el BASIC del Spectrum y hoy quiero compartir un pequeño proyecto que sirve, de paso, como excusa perfecta para explicar una de las sentencias más útiles del lenguaje: DIM.
La idea
Caza Tesoros es justo lo que promete: un jugador (O) se mueve por una cuadrícula de 20x30 casillas buscando 10 tesoros (*) escondidos al azar, mientras esquiva a tres enemigos (X) que se desplazan de forma aleatoria. Si te pillan, pierdes; si recoges los 10 tesoros, ganas. Al final, tu puntuación puede entrar en una tabla de récords con nombre incluido.
Nada del otro mundo en cuanto a jugabilidad, pero es un ejercicio perfecto para tocar varios conceptos clásicos del BASIC de Spectrum: bucles, INKEY$, BEEP, y sobre todo, arrays con DIM.
¿Por qué DIM?
DIM reserva memoria para una variable con múltiples elementos, en vez de tener que declarar una variable suelta por cada dato. En este juego lo uso de tres formas distintas:
- DIM t(20,30) — el mapa del tesoro. Cada casilla vale 1 si hay tesoro o 0 si no.
- DIM e(3,2) — la posición (fila, columna) de cada uno de los 3 enemigos.
- DIM h(5) y DIM n$(5,10) — la tabla de récords: 5 puntuaciones numéricas y sus 5 nombres asociados (cadenas de hasta 10 caracteres).
Es un buen ejemplo de que DIM no es solo "para mapas": sirve para cualquier colección de datos relacionados, numéricos o de texto.
El código completo
10 REM CAZA TESOROS CON ENEMIGOS
20 DIM t(20,30)
30 DIM e(3,2)
40 DIM h(5)
50 DIM n$(5,10)
60 FOR i=1 TO 5: LET h(i)=0: LET n$(i)="----------": NEXT i
70 BORDER 1: PAPER 0: INK 7: CLS
80 FOR i=1 TO 10
90 LET x=INT (RND*20)+1: LET y=INT (RND*30)+1
100 IF t(x,y)=1 THEN GO TO 90
110 LET t(x,y)=1: PRINT AT x,y;INK 6;"*"
120 NEXT i
130 FOR i=1 TO 3
140 LET e(i,1)=INT (RND*20)+1: LET e(i,2)=INT (RND*30)+1
150 PRINT AT e(i,1),e(i,2);INK 2;"X"
160 NEXT i
170 LET px=10: LET py=15: LET p=0: LET m=0
180 PRINT AT px,py;"O"
190 LET k$=INKEY$
200 IF k$="" THEN GO TO 190
210 PRINT AT px,py;" "
220 IF k$="q" AND px>1 THEN LET px=px-1
230 IF k$="a" AND px<20 THEN LET px=px+1
240 IF k$="o" AND py>1 THEN LET py=py-1
250 IF k$="p" AND py<30 THEN LET py=py+1
260 LET m=m+1
270 IF t(px,py)=1 THEN LET t(px,py)=0: LET p=p+1: BEEP .05,20
280 FOR i=1 TO 3
290 PRINT AT e(i,1),e(i,2);" "
300 LET d=INT (RND*4)+1
310 IF d=1 AND e(i,1)>1 THEN LET e(i,1)=e(i,1)-1
320 IF d=2 AND e(i,1)<20 THEN LET e(i,1)=e(i,1)+1
330 IF d=3 AND e(i,2)>1 THEN LET e(i,2)=e(i,2)-1
340 IF d=4 AND e(i,2)<30 THEN LET e(i,2)=e(i,2)+1
350 PRINT AT e(i,1),e(i,2);INK 2;"X"
360 IF e(i,1)=px AND e(i,2)=py THEN GO TO 500
370 NEXT i
380 PRINT AT 21,0;"Tesoros: ";p;" Pasos: ";m;" "
390 IF p<10 THEN GO TO 180
400 PRINT AT 10,8;FLASH 1;"GANASTE!"
410 LET sc=1000-m*5
420 GO TO 550
500 CLS
510 PRINT AT 10,8;FLASH 1;"TE PILLARON!"
520 LET sc=p*50
530 PAUSE 100
550 REM TABLA RECORDS
560 FOR i=1 TO 5
570 IF sc>h(i) THEN GO TO 600
580 NEXT i
590 GO TO 700
600 FOR j=5 TO i+1 STEP -1
610 LET h(j)=h(j-1): LET n$(j)=n$(j-1)
620 NEXT j
630 LET h(i)=sc
640 CLS
650 PRINT AT 5,5;"NUEVO RECORD! Nombre:"
660 INPUT nm$
665 LET nm$=nm$+" "
667 LET nm$=nm$( TO 10)
680 LET n$(i)=nm$
700 CLS
710 PRINT AT 1,10;"TABLA DE RECORDS"
720 FOR i=1 TO 5
730 PRINT AT 3+i,5;i;") ";n$(i);" ";h(i)
740 NEXT i
750 PRINT AT 15,5;"Pulsa una tecla para repetir"
760 PAUSE 0
770 RUNCómo se juega
Mueve la O con Q (arriba), A (abajo), O (izquierda) y P (derecha), en minúsculas. Recoge los 10 tesoros evitando que los enemigos te toquen. Cuantos menos pasos uses para ganar, mayor será tu puntuación.
Comentarios
Publicar un comentario