关于贪吃蛇键盘上下左右控制的使用一个问题
本帖最后由 chenlifeng 于 2022-3-15 23:44 编辑我从网上下载了一个贪吃蛇的代码,它判断键盘的上下左右方法,我没有完全看明白
char ch;
ch = getch();
if(ch == -32) {
ch = getch();
if(ch == 72) return 1;
if(ch == 80) return 3;
if(ch == 75) return 2;
if(ch == 77) return 4;
}
我知道键盘上的上下左右都是相当于两个字符,我用下面这段代码进行了测试
int main(void) {
while(1) {
printf("%d ", getch());
}
return 0;
}
得到上:224 72
下:224 80
左:224 75
右:224 77
那么,那个 -32 是代表着什么噻
大佬救命
{:9_241:}
你确定这是它的源代码? ba21 发表于 2022-3-15 22:37
你确定这是它的源代码?
int direct(char ch) { // 方向键设置
if(ch == -32) {
ch = getch();
if(ch == 72) return 1;
if(ch == 80) return 3;
if(ch == 75) return 2;
if(ch == 77) return 4;
}
return 0; // ?? 这个返回的 0 会被怎么处理呢
}
// --------------------------------------------------
void key(snake *head, snake *p) { // 改变蛇的方向与暂停功能的实现
char ch = 0;
int i, j, a;
i = j = a = 0;
if(_kbhit()) { // 如果发生了键盘输入,就执行函数体
ch = getch();
if(ch == -32) { // (problem) -32 是什么
i = direct(ch);
j = p->direction;
if((i == 1 && j == 3) || (i == 2 && j == 4) || (i == 3 && j == 1) || (i == 4 && j == 2)); // 判断是否与原有方向冲突
else p->direction = i;
}
else if(ch == 32) { // 32 是空格的编码
cls(); // 这个是清屏
gotoxy(36, 10);
printf("暂停中");
while (1) {
if(kbhit() && getch() == 32) {
gotoxy(36, 10);
printf(" "); // 擦除“暂停中”
draw(head); // 恢复蛇
gotoxy(F.x, F.y); // 恢复食物
c(12);
printf("o");
for(a = 0; a < ai; ++a) {
gotoxy(F1.x, F1.y);
c(10);
printf("#");
}
break;
}
}
}
}
} ba21 发表于 2022-3-15 22:37
你确定这是它的源代码?
源代码里面相关的两个函数是这个样子的 chenlifeng 发表于 2022-3-15 23:32
源代码里面相关的两个函数是这个样子的
方向键 不是 ascii码,是键盘扫描码
按键的扫描码,键盘上的按键按下后会有2个字节的数据,低八位存ASCII码,高八位存按键扫描码。
#include <stdio.h>
#include <conio.h>
int main()
{
char ch1;
char ch2;
ch1=getch();
printf("%d\n",ch1);
ch2=getch();
printf("%d\n",ch2);
getchar();
} ba21 发表于 2022-3-15 23:51
方向键 不是 ascii码,是键盘扫描码
按键的扫描码,键盘上的按键按下后会有2个字节的数据,低八位存ASCI ...
我好像明白了,我之前没有用char类型读,直接用printf("%d", getch()); 读到的第一个字节二进制位串为11100000,由于采用的是二进制补码计数法,这个位串的高位在char类型中就会被解释为符号位,而在int类型中就不一样了,虽然读到的都是位串11100000,经过解释,输出的数值却会不一样。
是不是这样?
{:5_105:}
谢谢你哦!
页:
[1]