鱼C论坛

 找回密码
 立即注册
查看: 1152|回复: 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码,高八位存按键扫描码。
  1. #include <stdio.h>
  2. #include <conio.h>
  3. int main()
  4. {
  5.         char ch1;
  6.         char ch2;

  7.                 ch1=getch();
  8.                 printf("%d\n",ch1);  
  9.                 ch2=getch();
  10.                 printf("%d\n",ch2);  

  11.           
  12.         getchar();
  13. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2022-3-15 23:30:56 | 显示全部楼层
ba21 发表于 2022-3-15 22:37
你确定这是它的源代码?
  1. int direct(char ch) {                // 方向键设置
  2.         if(ch == -32) {                       
  3.                 ch = getch();
  4.                 if(ch == 72) return 1;       
  5.                 if(ch == 80) return 3;
  6.                 if(ch == 75) return 2;
  7.                 if(ch == 77) return 4;
  8.         }
  9.         return 0;                                // ?? 这个返回的 0 会被怎么处理呢
  10. }
复制代码

  1. // --------------------------------------------------
  2. void key(snake *head, snake *p) {                // 改变蛇的方向与暂停功能的实现
  3.         char ch = 0;
  4.         int i, j, a;
  5.         i = j = a = 0;
  6.         if(_kbhit()) {                                                // 如果发生了键盘输入,就执行函数体
  7.                 ch = getch();
  8.                 if(ch == -32) {                                        // (problem) -32 是什么                         
  9.                         i = direct(ch);                               
  10.                         j = p->direction;                       
  11.                         if((i == 1 && j == 3) || (i == 2 && j == 4) || (i == 3 && j == 1) || (i == 4 && j == 2));        // 判断是否与原有方向冲突
  12.                         else p->direction = i;
  13.                 }
  14.                 else if(ch == 32) {                                // 32 是空格的编码                       
  15.                         cls();                                                // 这个是清屏                         
  16.                         gotoxy(36, 10);
  17.                         printf("暂停中");
  18.                         while (1) {
  19.                                 if(kbhit() && getch() == 32) {
  20.                                         gotoxy(36, 10);
  21.                                         printf("      ");                // 擦除“暂停中”
  22.                                         draw(head);                                // 恢复蛇
  23.                                         gotoxy(F.x, F.y);                // 恢复食物
  24.                                         c(12);
  25.                                         printf("o");                       
  26.                                         for(a = 0; a < ai; ++a) {
  27.                                                 gotoxy(F1[a].x, F1[a].y);
  28.                                                 c(10);
  29.                                                 printf("#");
  30.                                         }
  31.                                         break;
  32.                                 }
  33.                         }
  34.                 }
  35.         }
  36. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> 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码,高八位存按键扫描码。
  1. #include <stdio.h>
  2. #include <conio.h>
  3. int main()
  4. {
  5.         char ch1;
  6.         char ch2;

  7.                 ch1=getch();
  8.                 printf("%d\n",ch1);  
  9.                 ch2=getch();
  10.                 printf("%d\n",ch2);  

  11.           
  12.         getchar();
  13. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> 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-5-19 20:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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