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