继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

【九月打卡】第3天 物联网/嵌入式工程师 第四周

昆汀
关注TA
已关注
手记 19
粉丝 8
获赞 12

课程名称: 物联网/嵌入式工程师

课程章节: 第四周 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

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP