QBasic/高级输入
从用户获取实时信息有点困难。为此,我们将使用 INKEY$ 命令,该命令检查用户是否输入了键并向程序提供按键。
看看这段代码,然后我们将深入了解它
DO
LET k$ = INKEY$
LOOP UNTIL k$ <> ""
SELECT CASE k$
CASE "q"
QuitProgram
CASE "c"
MakeCircle
CASE "s"
MakeSquare
END SELECT
第一部分是 DO-LOOP,它不断轮询 INKEY$ 以获取返回值。在基本使用中,INKEY$ 如果没有按下任何键,则返回一个空字符串并继续执行程序。一旦按下键,INKEY$ 将立即返回该键。
INKEY$ 在做什么,它是如何工作的?
虽然 INKEY$ 命令看起来像是在返回当前按下的键,但事实并非如此。它由程序用来回答“键盘缓冲区里有什么?”这个问题。要理解这一点,你需要了解基本缓冲区是什么以及为什么要使用它。
在旧系统(不一定是指 IBM PC)中,一个单一的芯片处理键盘输入,并控制 Caps Lock 和 Number Lock 的 LED 指示灯。由于计算机同时执行许多操作(例如,从鼠标获取输入、计算数据、调用子例程、在屏幕上显示新信息),因此它需要能够记住在忙碌时键盘上按了什么键。该芯片包含一些内存(称为缓冲区),可以用来跟踪有限数量的按键。
在 IBM PC 上的 Dos 平台下,硬件略有变化。不再是硬件缓冲区,而是按下或释放一个键会中断正在运行的程序,将一个击键添加到位于 BIOS 中的软件缓冲区。此过程通常用户不会注意到,对系统性能的影响也很小。但是,该缓冲区允许 15 个字符:尝试在计算机繁忙时溢出它会导致短暂的蜂鸣声并丢弃任何其他字符。
INKEY$ 命令将此缓冲区用作 FIFO(先进先出)缓冲区。例如,假设你有一个游戏,屏幕上有一个弹跳球,底部有一个球拍。计算机程序必须不断更新屏幕以显示球的运动。在执行此操作时,程序会经过 INKEY$ 命令以查看返回什么值。如果用户自上次调用命令以来按下了键,它将返回该键。假设球向右移动,用户需要按“R”键告诉程序向右移动球拍。由于程序忙于移动球并更新屏幕,因此它不会立即注意到用户按下了键。相反,按键会被存储在键盘缓冲区中,并在几毫秒(或微秒)后在使用 INKEY$ 命令时被检索。
在许多程序中(如上所述),INKEY$ 会出现在循环中。它被反复请求。这允许程序一次获取一个字符的用户输入。使用上面的例子,用户可能需要反复按下 R 键,直到球拍在球的下方。另一方面,用户可能按下了太多次 R,需要按下 L 键将其向左移动。由于 INKEY$ 命令使用的是 FIFO 缓冲区,因此它将始终按输入键的顺序检索它们。
总之,INKEY$ 命令将始终返回并删除键盘缓冲区中的第一个字符。通常,它被反复使用以检索所有已按下的键,并允许用户以接近“实时”的方式与程序交互。如果键盘缓冲区中没有键,INKEY$ 将返回一个空字符串(无字符)。
某些按键与 ASCII 字符无关。当按下这些键之一时,INKEY$ 会返回一个包含两个字符的字符串:第一个字符是空字符(ASCII 码 0),第二个字符是键盘的原始扫描码。QBASIC 帮助文件中包含了扫描码的完整列表。你也可以通过在按下这些键时检查 INKEY$ 的结果来确定扫描码。
Ctrl+ Extended; prefixed with CHR$(0) 1 A 3 Ctrl+2 2 B 15 Shift+Tab 3 C 4 D Alt+ Alt+ Alt+ Alt+ 5 E 16 Q 30 A 44 Z 120 1 6 F 17 W 31 S 45 X 121 2 7 G 18 E 32 D 46 C 122 3 8 H Backspace 19 R 33 F 47 V 123 4 9 I Tab 20 T 34 G 48 B 124 5 10 J Ctrl+Enter 21 Y 35 H 49 N 125 6 11 K 22 U 36 J 50 M 126 7 12 L 23 I 37 K 127 8 13 M Enter 24 O 38 L 128 9 14 N 25 P 129 0 15 O 130 - 16 P Shift Ctrl Alt 131 = 17 Q 59 84 94 104 F1 18 R 60 85 95 105 F2 19 S 61 86 96 106 F3 20 T 62 87 97 107 F4 21 U 63 88 98 108 F5 22 V 64 89 99 109 F6 23 W 65 90 100 110 F7 24 X 66 91 101 111 F8 25 Y 67 92 102 112 F9 26 Z 68 93 103 113 F10 27 [ Escape 133 135 137 139 F11 28 \ 134 136 138 140 F12 29 ] 30 6 71 Home 72 Up 73 PgUp 31 - 75 Left 77 Right 79 End 80 Down 81 PgDn Ctrl+ 82 Insert 83 Del 127 Backspace 119 Ctrl+Home 132 Ctrl+PgUp 115 Ctrl+Left 116 Ctrl+Right 117 Ctrl+End 118 Ctrl+PgDn