10 CLEAR : RANDOMIZE USR &HBCA0 : REM Inicializa memoria y semilla aleatoria
20 DIM Xb(10),Yb(10),Vxb(10),Vyb(10),Sb(10) : REM x,y,veloc.,tamaño de cada globo (máx 10)
30 P=0 : REM número de globos activos
40 PLAYER=150 : REM posición X del jugador (centro)
50 GOSUB 2000 : REM Dibuja marco y jugador
60 GOSUB 3000 : REM Crea los globos iniciales
70 GOSUB 4000 : REM Bucle principal
100 REM ==================== DIBUJO DE MARCO Y JUGADOR ====================
2000 CLS
2010 PRINT AT 0,0;"PANG BASIC (ZX Spectrum)"
2020 FOR I=0 TO 31: PRINT AT 23,I;"-";: NEXT I : REM suelo
2030 PRINT AT 22,PLAYER;"^" : REM jugador
2040 RETURN
2100 REM ==================== CREA GLBO INICIALES ====================
3000 REM crea 3 globos grandes al azar
3010 FOR I=1 TO 3
3020 Xb(I)=INT(RND*256) : REM posición X (0‑255)
3030 Yb(I)=INT(RND*180) : REM posición Y (0‑179)
3040 Vxb(I)=INT(RND*4-2) : REM velocidad X (-2..+1)
3050 Vyb(I)=INT(RND*4-2) : REM velocidad Y (-2..+1)
3060 IF Vxb(I)=0 THEN Vxb(I)=1
3070 IF Vyb(I)=0 THEN Vyb(I)=1
3080 Sb(I)=3 : REM tamaño (3 = grande)
3090 P=P+1
3100 NEXT I
3110 RETURN
3999 REM ==================== BUCLE PRINCIPAL ====================
4000 REM 50 ciclos por segundo aprox.
4010 T=TIME : REM marca de tiempo para control de velocidad
4020 GOSUB 5000 : REM leer teclado y mover jugador
4030 GOSUB 6000 : REM mover globos y dibujar
4040 GOSUB 7000 : REM comprobar disparo y colisiones
4050 IF (TIME-T)<20 THEN PAUSE 20-(TIME-T) : REM retardo (~50 fps)
4060 GOTO 4010
4999 REM ==================== LEE TECLADO ====================
5000 K$=INKEY$
5010 IF K$="A" THEN PLAYER=PLAYER-2 : IF PLAYER<0 THEN PLAYER=0
5020 IF K$="D" THEN PLAYER=PLAYER+2 : IF PLAYER>255 THEN PLAYER=255
5030 IF K$="S" THEN GOSUB 8000 : REM disparo
5040 PRINT AT 22,PLAYER;"^" : REM redraw jugador (sobrescribe posible globo)
5050 RETURN
5999 REM ==================== MUEVE Y DIBUJA GLOBOS ====================
6000 FOR I=1 TO P
6010 REM borra globo anterior
6020 IF Sb(I)>0 THEN PLOT Xb(I),Yb(I),0
6030 REM actualiza posición
6040 Xb(I)=Xb(I)+Vxb(I) : Yb(I)=Yb(I)+Vyb(I)
6050 REM rebotes en bordes
6060 IF Xb(I)<0 OR Xb(I)>255 THEN Vxb(I)=-Vxb(I)
6070 IF Yb(I)<0 OR Yb(I)>179 THEN Vyb(I)=-Vyb(I)
6080 REM dibuja globo nuevo (tamaño como color)
6090 IF Sb(I)>0 THEN PLOT Xb(I),Yb(I),Sb(I)
6100 NEXT I
6110 RETURN
7999 REM ==================== DISPARO ====================
8000 REM dispara una línea vertical desde el jugador
8010 FOR Y=21 TO 0 STEP -1
8020 PLOT PLAYER,Y,2 : REM color 2 (rojo) = disparo
8030 FOR I=1 TO P
8040 IF Sb(I)>0 AND Xb(I)=PLAYER AND Y=Yb(I) THEN GOSUB 9000
8050 NEXT I
8060 PAUSE 2
8070 PLOT PLAYER,Y,0 : REM borra disparo
8080 NEXT Y
8090 RETURN
8999 REM ==================== COLISIÓN DISPARO → DIVIDE GLobo ====================
9000 REM globo golpeado en I
9010 IF Sb(I)=1 THEN REM globo pequeño desaparece
9020 PLOT Xb(I),Yb(I),0
9030 Sb(I)=0
9040 GOTO 9100
9050 END IF
9060 REM globo grande o medio → se divide
9070 Snew=Sb(I)-1 : REM nuevo tamaño (2→1 o 3→2)
9080 REM crea dos nuevos globos
9090 Xb(I)=Xb(I) : Yb(I)=Yb(I) : Sb(I)=Snew : Vxb(I)=-Vxb(I) : REM primero invierte X
9100 FOR J=P+1 TO P+1 : REM segundo globo
9110 Xb(J)=Xb(I) : Yb(J)=Yb(I) : Sb(J)=Snew
9120 Vxb(J)=INT(RND*4-2) : IF Vxb(J)=0 THEN Vxb(J)=1
9130 Vyb(J)=INT(RND*4-2) : IF Vyb(J)=0 THEN Vyb(J)=1
9140 NEXT J
9150 P=P+1
9160 RETURN