实战项目:俄罗斯方块(三)


你的点赞评论就是对博主最大的鼓励
当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~


🍊自我介绍

  Hello,大家好,我是小珑也要变强(也是小珑),我是易编程·终身成长社群的一名“创始团队·嘉宾”“内容共创官” ,现在我来为大家介绍一下有关物联网-嵌入式方面有关实战项目:俄罗斯方块有关按键获取的相关内容。


🍊俄罗斯方块之按键获取

Linux上面输入按键的情况

测试输入:
在这里插入图片描述
  cat命令,正常cat命令后面应该跟一个文件,显示文件里面对应的一个内容;如果没有跟文件的话,我们输入按键↑,↓,←,→,的时候就会显示^[[A, ^[[B, ^[[D, ^[[C相关内容,并且有光标信息。
在cat命令下,按下esc后显示 ^[
  我们做俄罗斯方块的时候你当然不想让页面中显示这些内容,我们要想办法给它消除掉。

实验思路:
    1.关闭光标的回显
    2.去除调用不必要的^[[
    3.通过判断最终数据值为A,B,C,D,获取用户的输入信息

回显的解释:你在终端上面输入的各种数据是会显示的,这就叫回显

相关函数的学习

  如果大家想要在Linux上面查找终端输入输出类函数的介绍的话,大家可以在终端上面输入:

man termios

  给大家介绍一些termios 库里面的函数

获取终端信息函数

#include <termios.h>
#include <unistd.h>  //头文件

int tcgetattr(int fd,struct termios *termios_p);
功能:用于获取与终端相关的参数
参数:
	fd:终端的文件描述符,0表示获取输入的信息。//后面IO会讲到
	termios_p:termios结构体描述参数信息
	struct termios
	{
		tcflag_t_c_iflag;//输入模式标志,控制终端的输入方式
		tcflag_t_c_oflag;//输出模式标志,控制终端输出方式
		tcflag_t_c_cflag;//控制模式标志,指定终端硬件控制信息
		tcflag_t_c_lflag;//本地模式标志,控制终端编辑功能
		cc_t c_cc[NCCS];//控制字符,用于保存终端驱动程序中的特殊字符,如输入结束符等
	};

返回值:
成功返回0,失败返回-1

设置原始属性

#include <termios.h>
#include <unistd.h>  //头文件

void cfmakeraw(struct termios *termios_p);

用法:我们先定义一个结构体,会把当前输入模式的信息填充到对应的结构体中
功能:获得用户输入的一些原始模式的属性,会关闭我们这个回显

设置终端参数信息

#include <termios.h>
#include <unistd.h>  //头文件

int tcsetattr (int fd,int optional_actions,const struct termios *termios_p);

	tcsetattr函数用于设置终端参数。函数在成功的时候返回0,失败的时候返回-1,并设置
errno的值。参数fd为打开的终端文件描述符,参数optional_actions用于控制修改起作用的时
间,而结构体termios_p中保存了要修改的参数。


返回值:
调用成功返回0;失败返回-1

getchar()用法

#include <stdio.h>

int main()
{
	int ch;
	printf("please input a character : \n");
	ch = getchar();//char ch; scanf("%c",ch);

	printf("ch = %c\n",ch);
	
	return 0;
}

输出结果:

please input a character :
A
ch = A

控制块的代码

#include <stdio.h>
#include <termios.h>
#include <unistd.h>

int getch()//获得一个字符,不回显;切记是1个字符
{
	struct termios tm,tm_old;
	//1.获得用户输入的属性到 tm_old
	tcgetattr(0,&tm_old);
	//2.获取原始输入的属性
	cfmakeraw(&tm);
	//3.把输入的属性设置到终端上
	tcsetattr(0,0,&tm_old);
	//4.读取用户输入的一个字符
	int ch = getchar();
	//5.恢复正常输入
	tesetattr(0,0,&tm_old);

	return ch;
}

void key_control()
{
	int ch; 
	
	while(1)
	{
		ch = getch(); //'^['---->ese
		if(ch == 'q' || ch == 'Q')
		{
			break;
		}
		else if(ch == '\r')//判断是否是回车键
		{
			printf("down\n");
		}
		else if(ch == '\033')
		{
			ch = getch();// '['

			if(ch == '[')
			{
				ch = getchar();//A,B,D,C
				switch(ch)
				{
					case 'A'://上
						printf("up\n");
						breeak;
					case 'B'://下
						printf("down\n");
						breeak;
					case 'D'://左
						printf("left\n");
						breeak;
					case 'C'://右
						printf("right\n");
						breeak;
				}
			}
		}
	}
}

int main()
{
	key_control();
	return 0;

}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值