C语言编写Linux终端环境下无缓冲键盘输入 ,并识别上下左右光标键
自己重构了游戏《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的捕获并进行终端设置的恢复操作及程序退出操作。
第二部分,对光标键的处理
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);
}
C语言编写Linux终端环境下无缓冲键盘输入 ,并识别上下左右光标键的更多相关文章
- 使用Tmux提高linux终端环境下的效率
最近转移到linux下开发,同事告诉我一个工具tmux.关于tmux的工具的使用参考以下文章 如何使用Tmux提高终端环境下的效率 tmux的使用和快捷键 tmux简明教程 tmux使用大全
- 在 Windows 和 Linux(Gnome) 环境下 从命令界面打开网页的方式
1.在 Windows 中 通过命令 可以打开网页是很简单的: start http://www.baidu.com 或 start iexplorer http://www.baidu.com 第二 ...
- linux网络环境下socket套接字编程(UDP文件传输)
今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中, ...
- 如何在Linux桌面环境下自动启动程序?
大多数Linux桌面环境有各自的图形用户界面(GUI),让用户可以配置针对特定用户的自动启动程序或服务.本文将介绍如何在各种Linux桌面环境下,自动启动某个程序的方法. AD:WOT2014:用户标 ...
- Linux centos7环境下安装JDK的步骤详解
Linux centos7环境下安装JDK的步骤详解 测试root用户下JAVA版本 输入命令: java –version 1.先到Oracle官网里下载好jdk,网址如下: http://ww ...
- Linux单机环境下HDFS伪分布式集群安装操作步骤v1.0
公司平台的分布式文件系统基于Hadoop HDFS技术构建,为开发人员学习及后续项目中Hadoop HDFS相关操作提供技术参考特编写此文档.本文档描述了Linux单机环境下Hadoop HDFS伪分 ...
- Linux/CentOS环境下如何安装和配置PhantomJS工作环境
PhantomJS 是一个基于WebKit的服务器端 JavaScript API.它全面支持web而不需浏览器支持,其快速,原生支持各种Web标准: DOM 处理, CSS 选择器, JSON, C ...
- Linux centos7环境下安装MySQL的步骤详解
Linux centos7环境下安装MySQL的步骤详解 安装MySQL mysql 有两个跟windows不同的地方 1).my.ini 保存到/etc/my.ini 2).用户权限,单独用户执行 ...
- Linux centos7环境下安装Nginx
Linux centos7环境下安装Nginx的步骤详解 1. 首先到Nginx官网下载Nginx安装包 http://nginx.org/download/nginx-1.5.9.tar.gz ...
- Centos 7(Linux)环境下安装PHP(编译添加)相应动态扩展模块so(以openssl.so为例)
https://blog.csdn.net/shinesun001/article/details/54312402 在centos 7环境下搭建好Lnmp环境之后,发现安装的php有好多扩展都没有安 ...
随机推荐
- 查看es结构,es _search查询基础语法
查看es结构,es _search查询基础语法 http://xx.xx.xx.xx:9200/ ES地址 car_info/_search POST {} POST { "query&qu ...
- Linux开机启动三种方式
有的时候,我们开机启动一些命令或者是一段脚本,又或者是开机启动自定义的服务. 下面归纳了2种实现的方式. 方式1-开机启动命令 vim /etc/rc.local #添加你想执行的命令 chmod + ...
- ThreadLocal 源码浅析
前言 多线程在访问同一个共享变量时很可能会出现并发问题,特别是在多线程对共享变量进入写入时,那么除了加锁还有其他方法避免并发问题吗?本文将详细讲解 ThreadLocal 的使用及其源码. 一.什么是 ...
- VSCode因网络问题导致下载更新/扩展出错
VSCode因网络问题导致下载更新/扩展出错 可尝试方法: 问题0: VSCode出现网络问题排查方法? 法1: 启动时加上选项 --log-net-log=netlog.json ...
- 《HelloGitHub》第 99 期
兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. github.com/521xueweihan/HelloG ...
- 实测952Mbps!四路千兆网PCIe拓展方案,国产工业级!
测试环境说明 运行系统:Debian-11.8 评估板:TL3588-EVM(RK3588J) 模块:PCIe扩展2/4路千兆网口模块 方案:无锡沐创N500L-AM2C-DD.N500L-AM4C- ...
- 浏览器中JS的执行
JS是在浏览器中运行的,浏览器为了运行JS, 必须要编译或解释JS,因为JS是高级语言,计算机不认识,必须把它编译或解释成机器语言,其次,在运行JS的过程,浏览器还要创建堆栈,因为程序是在栈中执行,执 ...
- Springboot+Shiro+Mybatis+mysql实现权限安全认证
Shiro是Apache 的一个强大且易用的Java安全框架,执行身份验证.授权.密码学和会话管理.Shiro 主要分为两个部分就是认证和授权两部分 一.介绍 Subject代表了当前用户的安全操作 ...
- 两张图带你全面了解React状态管理库:zustand和jotai
zustand 和 jotai 是当下比较流行的react状态管理库.其都有着轻量.方便使用,和react hooks能够很好的搭配,并且性能方面,对比React自身提供的context要好得多,因此 ...
- Java -jar 启动程序参数说明
Springboot环境下的启动参数说明 # Java启动命令语法: java [options] -jar file.jar [arguments] java -jar [options] file ...