14. Más control del teclado
BASIC
14. Más control del teclado
Hemos visto que podemos esperar a que el usuario teclee algo, utilizando la orden INPUT. Pero esta orden tiene una característica que hace que no resulte útil en muchas ocasiones: el programa queda totalmente parado hasta que no se teclee la respuesta y se pulse la tecla Intro.
Eso es algo que en muchas ocasiones no nos interesará. Por ejemplo, si queremos crear un juego, no podemos hacer que todos los enemigos queden parados hasta que nosotros pulsemos una tecla. El programa debería seguir avanzando, comprobar cada cierto tiempo si hemos pulsado un tecla, y proseguir después, tanto si la hemos pulsado o no.
Casi todos los BASIC incorporan una forma de comprobar si se ha pulsado una tecla, que suele ser empleando la orden INKEY$. Ésta nos devolverá la tecla que se ha pulsado, o un texto vacío ("", dos comillas dobles seguidas, sin ningún espacio entre ellas) si no se ha pulsado ninguna tecla. Un primer ejemplo de su uso podría ser este:
10 tecla$ = INKEY$
20 IF tecla$ = "" THEN GOTO 10
30 PRINT "Ha pulsado la tecla "; tecla$
(Fuente "1401.bas". Probado en GwBasic 2.02, Locomotive Basic de Amstrad CPC)
Los valores que devuelve cada tecla pulsada los podemos prever en la mayoría de los casos: Será "a" si se pulsa la tecla de la A y no están las mayúsculas activadas, y será "A" si se pulsa la tecla de la A y mientras están las mayúsculas activadas (con la tecla Bloq Mays o manteniendo pulsada la tecla de mayúsculas mientras se pulsa A); de igual modo obtendremos un "1" si se pulsa la tecla del 1, tanto en el teclado alfanumérico como en el teclado numérico auxiliar. Pero hay ciertas teclas que no son símbolos alfanuméricos y no resulta tan evidente el valor que devolverán. Vamos a ver alguna de ellas:
- Intro devuelve el carácter número 13.
- ESC devuelve el carácter número 27.
- Retroceso devuelve el carácter número 8.
- El "Tabulador" devuelve el carácter número 9.
- Las teclas de función F1 a F12 de un PC, así como otras teclas especiales de estos mismos ordenadores, devuelven dos bytes seguidos: primero un 0 y luego otro código que es el número de tecla que se ha pulsado (desde F1=59 hasta F10 =68, y también 133 para F11 y 134 para F12).
Podemos crear nosotros mismos un programa que nos muestre el símbolo que corresponde a cada tecla y el número que ese símbolo tiene dentro del código ASCII (que ya comentamos en el apartado 10:
10 PRINT "Pulse una tecla (Z para salir)"
20 tecla$ = INKEY$
30 IF tecla$ = "" THEN GOTO 20
40 PRINT "Ha pulsado "; tecla$; " (numero"; ASC(tecla$); ")"
50 IF (tecla$ = "z") OR (tecla$ = "Z") THEN END
60 GOTO 10
(Fuente "1402.bas". Probado en GwBasic 2.02, Locomotive Basic de Amstrad CPC)
Que daría este resultado con QBasic
Y este en un Amstrad CPC
En el caso de Basic256, no existe INKEY$, sino KEY, que nos da el número asociado a cada carácter:
tecla = KEY
IF tecla = 65 THEN PRINT tecla
(Fuente "1403.bas". Probado en Basic256)
Para saber el número que corresponde a cada carácter deberemos conocer el código ASCII o bien crear un programa que nos muestre todos ellos:
1 REM Tabla ASCII
10 CLS
20 FOR caracter = 32 TO 127
30 PRINT USING "###"; caracter;
40 PRINT "="; CHR$(caracter); " ";
50 NEXT caracter
(Fuente "1404.bas". Probado en GwBasic 2.02, Locomotive Basic de Amstrad CPC)
Ejercicio propuesto 14.1: Crea un programa que se quede parado hasta que se pulse la "A".
Ejercicio propuesto 14.2: Crea un programa que se quede parado hasta que se pulse la tecla ESC.
Ejercicio propuesto 14.3: Crea un programa que te pida tu nombre pero no lo muestre en pantalla hasta que pulse Enter (o Intro) para terminar.
Ejercicio propuesto 14.4: Crea un programa que te pida tu nombre pero muestre asteriscos en lugar de cada carácter real.
Ejercicio propuesto 14.5: Crea un programa que te pida tu nombre pero muestre asteriscos en lugar de cada carácter real, y que permita "retroceder" para borrar.
Ejercicio propuesto 14.6: Crea un programa que muestre una letra "A" en la primera columna de la fila 10 de la pantalla. Cada vez que el usuario pulse una tecla, la letra se moverá una posición hacia la derecha, hasta que el usuario pulse ESC o se llegue a la última columna de la pantalla, momento en que terminará.
Ejercicio propuesto 14.7: Crea un programa que muestre una letra "A" rebotando de un lado a otro de la pantalla, en horizontal (deberá moverse cada vez que el usuario pulse una tecla.
Ejercicio propuesto 14.8: Crea un programa que muestre un asterisco rebotando por la pantalla. Comenzará en una posición al azar, y se moverá hacia la derecha y hacia abajo cada vez que el usuario pulse una tecla. Cuando llegue al extremo derecho de la pantalla, rebotará hacia la izquierda, y cuando llegue al extremo inferior pasará a moverse hacia arriba. Debe continuar rebotando hasta que se pulse ESC.