Es un programa “rompeladrillos” como el Arkanoid o el para mí más entrañable “El muro” (el juego de la cinta de demostración del Spectrum 48K).
He cambiado las líneas 230 y 390-395 para eliminar el parpadeo del avión (cuando lo programé originalmente, hace más de 20 años, no me fijé en que los sonidos, que producen una pausa, se emitían entre el borrado del sprite antiguo y el dibujado del nuevo sprite).
El programa tiene un problema de incompatibilidad con los sistemas de archivos de windows: espera un espacio al principio de la extensión del archivo, y windows no admite que los programas basados en MS-DOS empleen espacios en los nombres de archivos (MS-DOS no admitía espacios en los nombres de archivos, pero Gwbasic no eliminaba los espacios –producidos, por ejemplo, por STR$()– al grabar).
10 CLS 20 REM El muro 30 DIM B(80,20) 40 RECORD=0 50 PUNTOS=0:NIVEL=1 :LAD=0:VIDAS=3 60 GOSUB 590 70 REM creaci¢n de niveles 80 PLAY STOP:PLAY OFF 90 OPEN N$+"."+STR$(NIVEL) FOR INPUT AS #1 100 FOR Y=1 TO 20 110 INPUT #1, A$ 120 FOR X=1 TO 80 130 B(X,Y)=ASC(MID$(A$,X,1))-ASC("A") 140 NEXT :NEXT :CLOSE #1 150 CLS:FOR Y=1 TO 10:FOR X=1 TO 80 160 LOCATE Y,X:IF B(X,Y)>0 THEN LAD=LAD+1 170 IF B(X,Y)<32 THEN COLOR B(X,Y):PRINT CHR$(219) 180 IF B(X,Y)>=32 AND B(X,Y)<38 THEN COLOR B(X,Y)-31:PRINT CHR$(176) 190 IF B(X,Y)=38 THEN COLOR 23:PRINT CHR$(3) 200 NEXT :COLOR 7:NEXT:LAD=LAD-INT(LAD*.2) 210 X=30:Y=10:DX=+1:DY=+1:PX=40:COLOR 7 220 IN$=INKEY$ 230 rem LOCATE Y,X:PRINT " " 235 IF IN$<>"" THEN LOCATE 20,PX-2:PRINT " " 240 IF IN$="P" OR IN$="p" THEN PX=PX+4 250 IF IN$="O" OR IN$="o" THEN PX=PX-4 260 IF Y+DY<1 THEN DY=-DY:CTR=1 270 IF Y+DY>=20 AND X+DX>=(PX-2) AND X+DX<=(PX+2) THEN DY=-DY 280 IF Y+DY>20 THEN VIDAS=VIDAS-1:GOSUB 520 290 IF B(X,Y)>0 THEN AX=DX:AY=DY:DX=0:DY=0:GOSUB 440:DY=-AY:DX=AX:CTR=1 295 IF Y+DY<1 THEN DY=-DY:CTR=1 300 IF X+DX>80 OR X+DX<1 THEN DX=-DX:CTR=1:PLAY "C#50" 310 IF CTR=1 THEN GOTO 370 320 REM IF B(X+DX,Y)>0 AND B(X+DX,Y+DY)>0 THEN GOSUB 1000:DX=-DX 330 REM IF B(X,Y+DY)>0 AND B(X+DX,Y+DY)>0 THEN GOSUB 1000:DY=-DY 340 IF B(X+DX,Y+DY)>0 THEN GOSUB 440:DY=-DY 350 IF B(X,Y)>0 THEN AX=DX:AY=DY:DX=0:DY=0:GOSUB 440:DY=-AY:DX=AX 360 IF Y+DY>=20 AND X>=(PX-1) AND X<=(PX+1) THEN DY=-DY 370 IF PX<3 THEN PX=3 380 IF PX>78 THEN PX=78 390 rem X=X+DX:Y=Y+DY:SOUND 100+Y*100,.5:PLAY STOP:SOUND .3,.1 395 SOUND 100+Y*100,.5:PLAY STOP:SOUND .3,.1:LOCATE Y,X:PRINT " ":X=X+DX:Y=Y+DY 400 LOCATE Y,X:PRINT "o":LOCATE 20,PX-2:PRINT CHR$(201);STRING$(3,CHR$(205));CHR$(187) 410 LOCATE 21,1:PRINT "Puntos:";:PRINT USING "######";PUNTOS;:PRINT " Vidas:";VIDAS;" Record:";:PRINT USING "#######";RECORD;:PRINT " Ladrillos por destruir:";LAD 420 IF LAD=0 THEN NIVEL=NIVEL+1:GOTO 70 430 GOTO 220 440 PUNTOS=PUNTOS+(B(X+DX,Y+DY)*5):SOUND 100+(10*B(X,Y)),1 450 LAD=LAD-1:IF B(X+DX,Y+DY)=38 THEN VIDAS=VIDAS+1 460 B(X+DX,Y+DY)=0:LOCATE Y+DY,X+DX:PRINT " " 470 RETURN 480 CLS:PRINT "fin":PRINT "puntos",PUNTOS,"record",RECORD 490 IF PUNTOS>RECORD THEN PRINT "nuevo record":RECORD=PUNTOS 500 IN$=INKEY$:IF IN$="" THEN 500 510 GOTO 50 520 REM VIDAS=VIDAS-1 530 IF VIDAS<0 THEN GOTO 480 540 LOCATE Y,X:PRINT " " 550 REM LOCATE 20,PX-2:PRINT " " 560 PLAY "F8e8d8c8" 570 Y=Y-1:DY=-1 580 RETURN 590 INPUT "¨Nombre del archivo que contiene el mapa de niveles? (espacio=mapa por defecto)";N$ 600 IF N$=" " OR N$="" THEN N$="DEFECTO" 610 RETURN
Editor de niveles:
10 REM editor de niveles para el juego de pelota 20 DIM B(80,20) 25 NIVEL=1:MAPA$="defecto2" 30 REM men£ 40 PRINT "1- Editar nivel" 50 PRINT "2- Operaciones con archivos" 60 INPUT N:IF N>2 THEN GOTO 60 70 ON N GOTO 1000,2000 80 CLS:GOTO 40 1000 REM editar nivel 1010 FOR X=1 TO 80:FOR Y=1 TO 20 1020 GOSUB 1500 1030 NEXT :NEXT 1040 X=1:Y=1 1045 IN$=INKEY$ 1050 IF IN$="4" AND X>1 THEN X=X-1 1060 IF IN$="6" AND X<80 THEN X=X+1 1070 IF IN$="2" AND Y<20 THEN Y=Y+1 1080 IF IN$="8" AND Y>1 THEN Y=Y-1 1090 IF IN$>="A" AND IN$<="z" THEN B(X,Y)=ASC(IN$)-ASC("A"):DF=B(X,Y) 1100 IF IN$=CHR$(27) THEN GOTO 80 1105 IF IN$=CHR$(13) THEN MODO=1-MODO 1106 IF MODO=1 THEN B(X,Y)=DF 1110 COLOR 7:LOCATE Y,X:PRINT "*":GOSUB 1500 1115 LOCATE 21,1:PRINT "Puntos otorgados:";B(X,Y)*5:PRINT "Tecla=";CHR$(B(X,Y)+ASC("A")) 1120 GOTO 1045 1500 LOCATE Y,X:IF B(X,Y)<32 THEN COLOR B(X,Y):PRINT CHR$(219) 1510 IF B(X,Y)>31 AND B(X,Y)<38 THEN COLOR B(X,Y)-31:PRINT CHR$(176) 1520 IF B(X,Y)=38 THEN COLOR 31:PRINT CHR$(3) 1530 COLOR 7:RETURN 2000 REM archivos 2010 PRINT "1- Nuevo mapa" 2020 PRINT "2- Nuevo nivel" 2030 PRINT "3- Archivar nivel" 2040 PRINT "4- Cargar nivel" 2045 PRINT "5- Volver" 2050 INPUT N 2060 ON N GOTO 2500,3000,3500,4000,80 2070 GOTO 2010 2500 INPUT "¨Seguro?";S$ 2510 IF MID$(S$,1,1)<>"S" AND MID$(S$,1,1)<>"s" THEN GOTO 2010 2520 INPUT "¨Nuevo nombre?";MAPA$ 2530 GOTO 2010 3000 INPUT "¨N£mero?";NIVEL:GOTO 2010