鱼C论坛

 找回密码
 立即注册
查看: 1296|回复: 5

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

[复制链接]
发表于 2022-3-15 21:07:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 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 是代表着什么噻
大佬救命




       
最佳答案
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();
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-15 22:37:48 | 显示全部楼层
你确定这是它的源代码?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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[a].x, F1[a].y);
                                                c(10);
                                                printf("#");
                                        }
                                        break;
                                }
                        }
                }
        } 
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-15 23:32:05 | 显示全部楼层
ba21 发表于 2022-3-15 22:37
你确定这是它的源代码?

源代码里面相关的两个函数是这个样子的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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();
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-3-16 20:49:20 | 显示全部楼层
ba21 发表于 2022-3-15 23:51
方向键 不是 ascii码,是键盘扫描码
按键的扫描码,键盘上的按键按下后会有2个字节的数据,低八位存ASCI ...

我好像明白了,我之前没有用char类型读,直接用printf("%d", getch()); 读到的第一个字节二进制位串为11100000,由于采用的是二进制补码计数法,这个位串的高位在char类型中就会被解释为符号位,而在int类型中就不一样了,虽然读到的都是位串11100000,经过解释,输出的数值却会不一样。
是不是这样?

谢谢你哦!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-5 12:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表