25 septiembre 2014

Un mini-juego en BASIC de Amstrad CPC (2: variables, bucles, condiciones)

6. Variables

En un programa habrá datos que cambian, como la posición de nuestro personaje. Para eso usaremos "variables", a las que podemos asignar un valor y modificarlo más adelante. Por ejemplo, así:
5 x=20: y=15
10 LOCATE x,y
20 PRINT CHR$(248)
Como se ve, para dar un valor a una variable basta con indicar su nombre, el símbolo "igual" (=) y el valor que queremos que tenga.

7. Edición de programas

El programa anterior se parece mucho al que le precede. Hemos añadido una línea 5, algo que se puede hacer directamente, pero también hemos modificado la línea 10. Para eso hay dos alternativas: volver a escribirla por completo, o, más rápido, teclear EDIT 10 [Intro] para modificar sólo lo que haya cambiado. Dentro de poco veremos cómo teclear el programa desde un ordenador moderno y llevarlo a un emulador.

8. Bucles y contadores

Podemos hacer que una variable tome varios valores sucesivos, utilizando la orden FOR, así:
100 FOR x = 1 TO 5
110 PRINT x
120 NEXT x
Este programa da valores a "x", desde 1 hasta (TO) 5. Para cada valor, lo escribe (PRINT x) y pasa al siguiente valor repetitivo (NEXT x), de modo que en pantalla aparecerán los números del 1 al 5, cada uno en una línea. Este tipo de estructuras repetitivas se suelen llamar "bucles".
Esto nos puede servir para mover algo de un lado a otro de la pantalla:
5 x=10: y=5
7 FOR x = 10 TO 30
10 LOCATE x,y
20 PRINT CHR$(248)
30 NEXT x
(Ya puedes borrar las líneas 100, 110 y 120 si las habías llegado a teclear).
Este fuente tiene dos problemas: la figura móvil "deja rastro" (aparecen muchas personas en pantalla, en vez de una sola), y se mueve demasiado deprisa.
Es fácil no dejar rastro: basta escribir un espacio en blanco en la casilla anterior:
5 x=10: y=5
7 FOR x = 10 TO 30
8 LOCATE x-1,y
9 PRINT " "
10 LOCATE x,y
20 PRINT CHR$(248)
30 NEXT x
Para que no vaya tan deprisa, podemos hacer una pausa tras cada dibujado. Pronto veremos alternativas mejores, pero como primer acercamiento, no puede basta un FOR vacío para hacer esa pausa:
5 x=10: y=5
7 FOR x = 10 TO 30
8 LOCATE x-1,y
9 PRINT " "
10 LOCATE x,y
20 PRINT CHR$(248)
25 FOR pausa = 1 TO 200: NEXT pausa
30 NEXT x
Esas "200 vueltas sin hacer nada" hacen que el programa se detenga un instante al final de cada pasada. Ese valor 200 se podría cambiar por cualquier otro, según la velocidad de animación que quisiéramos conseguir.
Por cierto, esa misma orden FOR nos puede ayudar a ver todo el juego de caracteres de un Amstrad CPC, así:
FOR i = 32 TO 255: PRINT CHR$(i);: NEXT i
(Un punto y coma después de una orden PRINT hace que no se avance a la siguiente línea de la pantalla tras escribir)
O bien podemos mostrar el número de cada carácter delante de él, para poder relacionarlos con más facilidad:
FOR i = 32 TO 255: PRINT i;"=";CHR$(i);" ";: NEXT i

9. Condiciones

Podemos comprobar si se cumple una condición y dar algún paso en ese caso, usando la construcción IF...THEN (si...entonces). Por ejemplo, para no permitir que la coordenada X de nuestro personaje sea menor que uno y así evitar que nos salgamos de la zona utilizable de la pantalla y que el juego se interrumpa con un mensaje de error:
22 IF x < 1 THEN x = 1
Con el símbolo "<" comprobamos si x "es menor" que 1. También podemos comprobar si es mayor, o mayor o igual, o exactamente igual, o distinto, usando los siguientes símbolos:
> Mayor que
>= Mayor o igual que
< Menor que
>= Menor o igual que
= Igual a
<> Distinto de
Podemos enlazar varias condiciones con AND (y), OR (o) y NOT (no). Por ejemplo, podemos hacer que la velocidad sea cero cuando se llegue al margen izquierdo de la pantalla (x=1) o al margen derecho (x=40) así:
22 IF x=1 OR x=40 THEN velocidad = 0
Con esa estructura, podemos ampliar el ejemplo anterior, para que nuestro personaje se mueva de lado a lado 100 veces, y "rebote" cada vez que llegue a un extremo de la pantalla:
5 x=10: y=5: velocidad=1
7 FOR i = 1 TO 100
8 LOCATE x,y
9 PRINT " "
10 x = x+velocidad
15 LOCATE x,y
20 PRINT CHR$(248)
22 IF x=1 OR x=40 THEN velocidad = -velocidad
25 FOR pausa = 1 TO 200: NEXT pausa
30 NEXT i

10. Renumerar el programa

Nuestro programa tiene ya tantas líneas intermedias (7,8,9,10) que empieza a ser "demasiado compacto" y en ciertas zonas ya no podríamos añadir más órdenes entre las existentes. Si queremos que las líneas vuelvan a estar separadas de 10 en 10, podemos usar la orden RENUM [Intro] y se convertirá en
10 x=10: y=5: velocidad=1
20 FOR i = 1 TO 100
30 LOCATE x,y
40 PRINT " "
50 x = x+velocidad
60 LOCATE x,y
70 PRINT CHR$(248)
80 IF x=1 OR x=40 THEN velocidad = -velocidad
90 FOR pausa = 1 TO 200: NEXT pausa
100 NEXT i

Podemos renumerar de forma que el programa comience desde cierto número de línea, no necesariamente la 10, haciendo cosas como "RENUM 100", o podemos hacer que se renumere sólo a partir de cierta línea y se conserven las anteriores con su numeración original, con "RENUM 100, 8", o incluso qué incremento se deberá usar a partir de ese momento: "RENUM 100, 8, 5".