Código: Seleccionar todo
100 MODE 8
110 PAPER 0: INK 7: CLS
120 BORDER 4,6
130 LET bx=10: LET by=10: LET rx=1:LET ry=1:LET x=16: LET re=0
140 AT 18,x:PRINT "<-->"
150 IF KEYROW(5)=128 AND x>0 THEN LET x=x-1: AT 18,x:PRINT "<--> "
160 IF KEYROW(4)=32 AND x<32 THEN AT 18,x:PRINT " <-->":LET x=x+1
170 LET re=re+1:IF re<2 THEN GO TO 150
180 LET re=0
190 IF bx=0 THEN LET rx=1
200 IF bx=35 THEN LET rx=-1
210 IF by=0 THEN LET ry=1
220 IF by=18 THEN GO TO 260
230 IF by=17 AND x-2<bx AND bx<x+5 THEN LET ry=-1
240 AT by,bx: PRINT " ": LET bx=bx+rx: LET by=by+ry: AT by,bx:PRINT "o"
250 GO TO 150
260 FOR b=0 TO 7:BORDER 4,b:NEXT b: CLS: GO TO 120
Bien veamos línea por línea cómo funciona:
Código: Seleccionar todo
100 MODE 8
110 PAPER 0: INK 7: CLS
120 BORDER 4,6
La línea 100 indica el modo en que vamos a trabajar, en este caso el 8 (256x256x8 colores).
La línea 110 indica el valor de fondo (paper) y tinta (ink) que queremos, y después borramos la ventana. Como no hemos definido ninguna ventana borrará toda la pantalla. Los colores van del 0 (negro) al 7 (blanco) de forma muy similar a la del ZX Spectrum.
Con la línea 120 trazamos un borde en la ventana, en este caso toda la pantalla. Ojo, no es la misma sentencia que en el ZX Spectrum, aquí realizamos un cuadro en el borde de la ventana activa, y en este caso 4 es el grosor en pixels del borde y 6 el color de ese borde (amarillo).
Código: Seleccionar todo
130 LET bx=10: LET by=10: LET rx=1:LET ry=1:LET x=16: LET re=0
140 AT 18,x:PRINT "<-->"
Con estas dos líneas iniciamos el juego:
- bx y by son la posición x e y de la bola
- rx y ry son el incremento horizontal y vertical de la bola
- x es la posición de la raqueta
- re es una variable para repetir dos veces la lectura del teclado, es para que la raqueta se mueva más rápida que la bola
Con la línea 140 ponemos en posición inicial la raqueta en pantalla.
Código: Seleccionar todo
150 IF KEYROW(5)=128 AND x>0 THEN LET x=x-1: AT 18,x:PRINT "<--> "
160 IF KEYROW(4)=32 AND x<32 THEN AT 18,x:PRINT " <-->":LET x=x+1
La línea 150 lee si hemos pulsado la tecla "o" y si es así, y además la posición de la raqueta no supera el borde izquierdo, disminuye el valor x de la raqueta y dibuja la misma en la nueva posición dejando un espacio para borrar el rastro. La línea 160 es lo mismo pero aplicado a la tecla "p", y en este caso incrementamos el valor x de la raqueta.
Es importante notar lo siguiente, de cara al número de columnas para el PRINT en MODO 8 tenemos disponibles 36, el borde de 4 pixels no cuenta. De igual forma en SuperBASIC el número de filas es de 19, por lo que los valores tope son de 0 a 18 para el valor vertical y de 0 a 35 para el horizntal.
Código: Seleccionar todo
170 LET re=re+1:IF re<2 THEN GO TO 150
180 LET re=0
Con la línea 170 realizamos un bucle de dos ciclos en el control de la raqueta, para que vaya más deprisa su movimiento que el de la bola.
Con la línea 180 ponemos el contador de ciclo a 0 nuevamente.
Y pasamos a la parte del rebote de la bola y cómo detectamos que se ha salido del campo de juego:
Código: Seleccionar todo
190 IF bx=0 THEN LET rx=1
200 IF bx=35 THEN LET rx=-1
210 IF by=0 THEN LET ry=1
220 IF by=18 THEN GO TO 260
230 IF by=17 AND x-2<bx AND bx<x+5 THEN LET ry=-1
En la línea 190 y 200 vemos el valor horizontal de la bola, si llega al borde (0 o 35) invertimos el valor de incremento de la posición horizontal (rebote).
En la línea 210 vemos si la bola toca arriba (0 en vertical) y rebotamos consecuentemente.
En la línea 220 detectamos que la bola se ha salido del campo de juego, ya que no le hemos dado con la raqueta y saltamos a una línea para indicar al jugador tal situación.
La línea 230 comprueba que la raqueta está correctamente situada bajo la pelota y proporciona un rebote vertical si eso pasa. La raqueta ocupa 4 posiciones (desde x a x+3), por lo que la bola debería estar comprendida en dicho rango. Metemos un espacio más de margen debido a que la pelota viene siempre en diagonal, y por lo tanto puede darse el caso que justo debajo de ella no haya raqueta, pero en la siguiente posición si.
Código: Seleccionar todo
240 AT by,bx: PRINT " ": LET bx=bx+rx: LET by=by+ry: AT by,bx:PRINT "o"
250 GO TO 150
260 FOR b=0 TO 7:BORDER 4,b:NEXT b: CLS: GO TO 120
La línea 240 borra la pelota, incrementa los valores vertical y horizontal de la misma, y vuelve a dibujarla en la nueva posición.
La línea 250 cierra el bucle.
La línea 260 realiza un bonito efecto en el borde cambiándolo de color (del 0 al 7), borra la pantalla, y vuelve a empezar.
Y esto es todo, así sería un juego sencillote escrito como si fuera para ZX Spectrum, supongo que ahora vendrán Badaman y AFX a dar la versión correcta para QL empleando como es debido los nuevos comandos del Super BASIC.