chenlifeng 发表于 2022-3-15 21:07:39

关于贪吃蛇键盘上下左右控制的使用一个问题

本帖最后由 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:48

你确定这是它的源代码?

chenlifeng 发表于 2022-3-15 23:30:56

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;
                                }
                        }
                }
        }
}

chenlifeng 发表于 2022-3-15 23:32:05

ba21 发表于 2022-3-15 22:37
你确定这是它的源代码?

源代码里面相关的两个函数是这个样子的

ba21 发表于 2022-3-15 23:51:22

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();
}

chenlifeng 发表于 2022-3-16 20:49:20

ba21 发表于 2022-3-15 23:51
方向键 不是 ascii码,是键盘扫描码
按键的扫描码,键盘上的按键按下后会有2个字节的数据,低八位存ASCI ...

我好像明白了,我之前没有用char类型读,直接用printf("%d", getch()); 读到的第一个字节二进制位串为11100000,由于采用的是二进制补码计数法,这个位串的高位在char类型中就会被解释为符号位,而在int类型中就不一样了,虽然读到的都是位串11100000,经过解释,输出的数值却会不一样。
是不是这样?
{:5_105:}
谢谢你哦!
页: [1]
查看完整版本: 关于贪吃蛇键盘上下左右控制的使用一个问题