===El_muro.bas===
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