课程名称: 物联网/嵌入式工程师
课程章节: 第四周 C语言项目实战与阶段笔试
主讲老师: 大白老师
课程内容:
今天主要学习了俄罗斯方块按键的获取。
课程收获:
首先我们要实现通过上下左右来控制俄罗斯方块的变化的话,需要关闭回显。
回显的关闭在这个项目中比较重要。
我们需要学习关于终端的函数。
我们要关闭回显,首先需要引入相关头文件
#include<termios.h>
#include <unistd.h>
然后定义termios结构体
struct terimios tm,tm_old;
首先需要用到tm结构体保存当前用户输入的终端属性。
用tcgetattr()来实现;
以下是需要用到的函数
tcgetattr(0,&tm_old);
//获取原始输入属性
cfmakeraw(&tm);
//设置原始输入属性
tcsetattr(0,0,&tm);
//不回显的获取一个字符
int ch = getchar();
//恢复正常输入属性
tcsetattr(0,0,&tm_old);
这里是根据用户输入的上下左右判断
#include <stdio.h>
#include <sys/time.h>
#include <stdlib.h>
#include <signal.h>
#include <termios.h>
//获取一个字符,不回显
int getch()
{
struct termios tm,tm_old;
//保存正常 输入属性 到 tm_old
tcgetattr(0,&tm_old);
//获取原始输入属性
cfmakeraw(&tm);
//设置原始输入属性
tcsetattr(0,0,&tm);
//不回显的获取一个字符
int ch = getchar();
//恢复正常输入属性
tcsetattr(0,0,&tm_old);
return ch;
}
void key_control()
{
int ch;
while(1){
ch = getch(); //^[
if(ch == 'q' || ch == 'Q'){
break;
}else if(ch == '\r'){//回车键
printf("down\n");
}else if(ch == '\33'){// ^[[A ^[[B ^[[C ^[[D
ch = getch(); //[
if(ch == '['){
ch = getch(); //A,B,C,D
switch(ch){
case 'A': //上
printf("up\n");
break;
case 'B': //下
printf("down\n");
break;
case 'C': //右
printf("right\n");
break;
case 'D': //左
printf("left\n");
break;
default:
break;
}
}
}
}
}
int main()
{
key_control();
return 0;
}
尤其注意的是,我们输入一个字符串时,getchar重复调用会接着上次调用结束的位置进行读取
设置终端参数的话
#include <termios.h>
#include <unistd.h>
int tcsetattr(int fd, int optional_actions,const struct termios *termios_p);
功能:将配置参数写到终端中。
参数:
@fd 终端的文件描述符,0 表示获取输入的信息。
@optional_actions TCSANOW 配置立即生效
TCSADRAIN 配置在所有写入 fd 的输出都传输完毕之后生效
TCSAFLUSH 所有已接收但未读取的输入都将在配置生效之前被丢弃
@termios_p 配置参数
返回值:
调用成功时返回 0;失败将返回-1
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦