C语言编写Linux终端环境下无缓冲键盘输入 ,并识别上下左右光标键键盘中上、下、左、右四个光标键所对应的ASCII码值为多少

网友投稿 273 2022-09-19

C语言编写Linux终端环境下无缓冲键盘输入 ,并识别上下左右光标键键盘中上、下、左、右四个光标键所对应的ASCII码值为多少

自己重构了游戏《2048》并且重构了它的最好启发式AI解法,并上传到了Gitee中的 ​​鬼&泣​​​ / ​​2048-heuristic​​的devilmaycry分支,在这个过程中编写了一个C语言版的“无缓冲键盘输入 ,并识别上下左右光标键”的代码,这里记录一下以备以后使用时查看。

代码地址:

​​cpp_source/environment/keyboard_run_app.cpp​​

第一部分代码:

struct termios cooked, raw;// 恢复之前的键盘输入和终端缓存的设置void keyboard_close(int sig=0){ int kfd = 0; (void)sig; PRINT_ATTR_REC // 终端字体颜色恢复 // system("clear"); // 情况屏幕 tcsetattr(kfd, TCSANOW, &cooked);//在程序结束时在恢复原来的配置 exit(0);}// 设置键盘输入,设置终端无缓存输入void keyboard_open(){ signal(SIGINT, keyboard_close); // 捕获Ctrl+C, 中断退出 int kfd = 0; // get the console in raw mode tcgetattr(kfd, &cooked); // 得到 termios 结构体保存,然后重新配置终端 memcpy(&raw, &cooked, sizeof(struct termios)); raw.c_lflag &=~ (ICANON | ECHO); // Setting a new line, then end of file raw.c_cc[VEOL] = 1; raw.c_cc[VEOF] = 2; tcsetattr(kfd, TCSANOW, &raw);}

keyboard_open函数设置无缓冲的键盘输入模式并保存原始的终端设置。在signal函数中设置对ctrl+c的捕获并进行终端设置的恢复操作及程序退出操作。

第二部分,对光标键的处理

#define KEYCODE_R 185

#define KEYCODE_L 186

#define KEYCODE_U 183

#define KEYCODE_D 184

相关代码:

fflush(stdin); // get the next event from the keyboard if(read(kfd, &c, 3) < 0) { perror("read(): Error!!! "); exit(-1); } all_sum = c[0]+c[1]+c[2]; // printf("sum: %d \n", s); switch(all_sum) { case KEYCODE_L: _info = "Left Button Pressed, Numbers of attempt: "+std::to_string(i); // printf("[******] Wrong input, Left Button Pressed, Numbers of attempt: %d\n", i); move = 2; break; case KEYCODE_R: _info = "Right Button Pressed, Numbers of attempt: "+std::to_string(i); // printf("[******] Wrong input, Right Button Pressed, Numbers of attempt: %d\n", i); move = 3; break; case KEYCODE_U: _info = "Up Button Pressed, Numbers of attempt: "+std::to_string(i); // printf("[******] Wrong input, Up Button Pressed, Numbers of attempt: %d\n", i); move = 0; break; case KEYCODE_D: _info = "Down Button Pressed, Numbers of attempt: "+std::to_string(i); // printf("[******] Wrong input, Down Button Pressed, Numbers of attempt: %d\n", i); move = 1; break; default: printf("[******] Wrong input, value: %c = 0x%02X = %d, Numbers of attempt: %d\n", c[0], c[0], c[0], i); }

由于光标键是组合键,因此需要读入三个字符才能判断,这里采用的函数为:read(kfd, &c, 3) ,毕竟神奇的地方是这个函数可以在较短时间(如:0.0001秒)内最多读入三个字符,因此该函数可以识别所有的键盘按键的输入,不仅可以识别组合ASCII码的按键,而且还能识别单ASCII码的按键。这种一次性最多读入N个字符的操作比较少见,这里也不是很懂,也就当记录一下不深入研究了,本想用python语言实现类似的功能最后还是没有成功,或许这种功能还是系统原生的C语言比较好实现一些。

==============================================

提醒一下,这个代码只有片段不能直接运行编译,在Gitee上的该部分代码是作为子模块存在的,并没有编写main函数,如果想编译执行还需要自己手动加上main函数,由于只需要简单的添加入口main函数即可编译执行这里也就不过多给出代码了。

----------------------------------

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:FiBiNet 网络介绍与源码浅析
下一篇:AFM 网络介绍与源码浅析
相关文章

 发表评论

暂时没有评论,来抢沙发吧~