Beginners love to develop small games, such as snakes and Tetris. To develop such games, they must be controlled by keys. Generally, we use the getch () function to receive keys directly, then convert it to the corresponding ASCII code, and compare it with the ASCII code to determine what key the user is pressing, and then perform the corresponding operations based on the key, such as moving and rotating.
However, I recently discovered that this is not that simple. For example, when a user presses the "upward direction key" for a snake, the user must control the snake to go up. To illustrate the problem, to simplify it, if you press the up arrow key, the output is "up". Other arrow keys are similar. Generally, we will check the ASCII code table (below ),
, The direction key is 38, and then we will write such a small program:
# Include <stdio. h>
# Include <conio. h>
Int main ()
{
Char ch;
While (true)
{
Ch = getch ();
If (CH = 38) // The up key
Printf ("up ");
If (CH = 27) // ESC key
Printf ("ESC ");
}
}
If you are interested, you can try to compile and run it, and you will find the problem: If you press the "ESC" key, "ESC" will be output, but no matter how you press the upward direction key, never output "up "! What is this? I don't know. Of course, by checking the ASCII code table, we will find that ascii38 corresponds to '&'. If '&' is input, it will output 'up '! Dizzy ...... which of the following gods knows why? I am very grateful to you for replying.
But the problem still needs to be solved. How do I receive the up arrow keys on the keyboard? Later I checked a lot of information and read a lot of examples. I found that if I changed 38 to 72, I could output 'up '! It's amazing. When we look at the characters corresponding to the ASCII code 72, we will find that it is actually 'H'. That is to say, if we input 'h', we can also output 'up ', this is true! That's strange! The 'H' on the keyboard is different from the up arrow key. Isn't it troublesome to press the up arrow key during normal typing, joke. This is a small problem. If there is nothing in a small game like a snake, users generally don't want to press 'h', but what if they are in a large software or game? Maybe this small bug will crash the entire system! Maybe hackers intrude into the system through this bug!
After a problem is solved, another problem arises. How can we avoid the problem above? Meditation for a long time, restless, confused, not thinking about tea, poor spirit, dizzy and swollen ...... finally, today, a burst of inspiration, think of a solution! Haha, Let me go slowly:
I think so. Since it is so troublesome to query the ASCII code table that it cannot be used, why not develop a small program? Press a key and then output the corresponding ASCII code, the code is very simple. If you have learned C, you will write it. I will post the Code:
# Include <stdio. h>
# Include <conio. h>
Int main ()
{
Char C;
While (1)
{
C = getch ();
Printf ("% d % x % C \ n", C );
}
}
The Code means receiving a keyboard key, outputting the corresponding decimal ASCII code, and then outputting the corresponding hexadecimal ASCII code, finally, output the character corresponding to the button (if displayed, it will be displayed on the screen ). After you run it, you will find the problem, a shocking problem, and an incredible problem. When you press the up arrow key, you will see this)
What's going on? Are you clear? Let's take a closer look. That's right. That's it. The line below is just 72. We have already done the experiment. But what happened to the line above? If we press a key, how can we display two rows? Let's look at the source code again. We should only output one line. What we expect is to output only the one line later. What is the above line? What does output-32 correspond? Why is there a line above? I am so dizzy, I still want to ask you, orz .........
I think so, and I don't know if it's right. Maybe, when you press the up arrow key, you actually press two keys, ah !? I don't understand either. I just guess that the first key is the-32 shown above, and the second key is the real ASCII code. I don't know, right? Anyway, if I press my idea, the problem with the same button can be solved. Check the Code:
# Include <stdio. h>
# Include <conio. h>
Int main ()
{
Char ch;
While (true)
{
Ch = getch ();
If (CH =-32)
{
Ch = getch ();
If (CH = 72) // The up key
Printf ("up ");
}
If (CH = 27) // ESC key
Printf ("ESC ");
}
}
In this case, the 'up' input will not be 'up' output only after the upward direction key is pressed. Of course, we can do this in development, at the very least, there will be no problems, but I still don't understand why. Please give me some advice.
In addition, I think it is quite useful to convert keys into ASCII codes. At least I can quickly get the ASCII values of keys or characters you want. I don't need to check the ASCII code list all day, I have made a small software, in my network disk, if necessary can go to my Network Disk download: http://ma6174.ys168.com/
In addition, the ASCII code table is attached. It won't be used even though it is checked. Check it and maybe it can be used.
ASCII Value |
Control characters |
ASCII Value |
Control characters |
ASCII Value |
Control characters |
ASCII Value |
Control characters |
0 |
Nut |
32 |
(Space) |
64 |
@ |
96 |
, |
1 |
Soh |
33 |
! |
65 |
A |
97 |
A |
2 |
STX |
34 |
" |
66 |
B |
98 |
B |
3 |
Etx |
35 |
# |
67 |
C |
99 |
C |
4 |
EOT |
36 |
$ |
68 |
D |
100 |
D |
5 |
Enq |
37 |
% |
69 |
E |
101 |
E |
6 |
ACK |
38 |
& |
70 |
F |
102 |
F |
7 |
Bel |
39 |
, |
71 |
G |
103 |
G |
8 |
BS |
40 |
( |
72 |
H |
104 |
H |
9 |
HT |
41 |
) |
73 |
I |
105 |
I |
10 |
Lf |
42 |
* |
74 |
J |
106 |
J |
11 |
Vt |
43 |
+ |
75 |
K |
107 |
K |
12 |
FF |
44 |
, |
76 |
L |
108 |
L |
13 |
Cr |
45 |
- |
77 |
M |
109 |
M |
14 |
So |
46 |
. |
78 |
N |
110 |
N |
15 |
Si |
47 |
/ |
79 |
O |
111 |
O |
16 |
DLE |
48 |
0 |
80 |
P |
112 |
P |
17 |
DCI |
49 |
1 |
81 |
Q |
113 |
Q |
18 |
DC2 |
50 |
2 |
82 |
R |
114 |
R |
19 |
DC3 |
51 |
3 |
83 |
X |
115 |
S |
20 |
Dc4 |
52 |
4 |
84 |
T |
116 |
T |
21 |
Nak |
53 |
5 |
85 |
U |
117 |
U |
22 |
SYN |
54 |
6 |
86 |
V |
118 |
V |
23 |
TB |
55 |
7 |
87 |
W |
119 |
W |
24 |
Can |
56 |
8 |
88 |
X |
120 |
X |
25 |
Em |
57 |
9 |
89 |
Y |
121 |
Y |
26 |
Sub |
58 |
: |
90 |
Z |
122 |
Z |
27 |
ESC |
59 |
; |
91 |
[ |
123 |
{ |
28 |
FS |
60 |
< |
92 |
\ |
124 |
| |
29 |
GS |
61 |
= |
93 |
] |
125 |
} |
30 |
RS |
62 |
> |
94 |
^ |
126 |
~ |
31 |
Us |
63 |
? |
95 |
- |
127 |
Del |
Nul |
VT vertical tabulation |
SYN idling Synchronization |
Soh title starts |
FF Paper Control |
Etb Information Group Transfer ended |
Start of STX text |
Cr press ENTER |
Can void |
Etx text ended |
So shift output |
Em paper |
Eoy transmission ends |
Si shift Input |
Sub placement |
Enq query characters |
Dle Space |
ESC code change |
Ack acknowledge |
DC1 Device Control 1 |
FS text Separator |
Bel alarm |
DC2 Device Control 2 |
GS group Separator |
BS returns to one grid |
DC3 Device Control 3 |
RS record delimiter |
HT horizontal list |
Dc4 Device Control 4 |
US unit Separator |
Lf line feed |
Nak no |
Del Delete |
Common ASCII codes for keyboards |
ESC key vk_escape (27) Enter the key: vk_return (13) Tab key: vk_tab (9) Caps Lock key: vk_capital (20) Shift key: vk_shift ($10) CTRL: vk_control (17) Alt key: vk_menu (18) Space key: vk_space ($20/32) Backspace key: vk_back (8) Left logo key: vk_lwin (91) Right logo key: vk_lwin (92) Right-click the shortcut key: vk_apps (93)Insert key: vk_insert (45) Home Key: vk_home (36) Page up: vk_prior (33) Pagedown: vk_next (34) End key: vk_end (35) Delete key: vk_delete (46) Direction key (Direction): vk_left (37) Direction key (Direction): vk_up (38) Direction key (→): vk_right (39) Direction key (Direction): vk_down (40) F1 key: vk_f1 (112) F2 key: vk_f2 (113) F3 key: vk_f3 (114) F4 key: vk_f4 (115) F5 key: vk_f5 (116) F6 key: vk_f6 (117) F7 key: vk_f7 (118) F8: vk_f8 (119) F9 key: vk_f9 (120) F10 key: vk_f10 (121) F11 key: vk_f11 (122) F12 key: vk_f12 (123) Num Lock key: vk_numlock (144) Keypad 0: vk_numpad0 (96) Keypad 1: vk_numpad0 (97) Keypad 2: vk_numpad0 (98) Keypad 3: vk_numpad0 (99) Keypad 4: vk_numpad0 (100) Keypad 5: vk_numpad0 (101) Keypad 6: vk_numpad0 (102) Keypad 7: vk_numpad0 (103) Keypad 8: vk_numpad0 (104) Keypad 9: vk_numpad0 (105) Keypad.: vk_decimal (110) Keypad *: vk_multiply (106) Keypad +: vk_multiply (107) Keypad-: vk_subtract (109) Keypad/: vk_divide (111) Pause Break Key: vk_pause (19) Scroll Lock key: vk_scroll (145) |
Keyboard, game, ASCII code issues