当前位置: 首页 > news >正文

嵌入式学习第十六天

制作俄罗斯方块小游戏(一)

分析:

printf函数高级用法

'\033[':表示转义序列的开始

'm':表示转义序列的结束

'0':重置所有属性

'1':设置粗体或高亮

'30-37':设置字体色 30: 黑 31: 红 32: 绿 33: 黄 34: 蓝 35: 紫 36: 深绿 37: 白色

'40-47':设置背景色 40: 黑 41: 红 42: 绿 43: 黄 44: 蓝 45: 紫 46: 深绿 47: 白色

/033[0m 关闭所有属性

/033[1m 设置高亮度

/033[4m 下划线

/033[5m 闪烁

/033[7m 反显

/033[8m 消隐

/033[30m -- /033[37m 设置前景色

/033[40m -- /033[47m 设置背景色

/033[nA 光标上移n行

/033[nB 光标下移n行

/033[nC 光标右移n行

/033[nD 光标左移n行

/033[y;xH设置光标位置

/033[2J 清屏

/033[K 清除从光标到行尾的内容

/033[s 保存光标位置

/033[u 恢复光标位置

/033[?25l 隐藏光标

/033[?25h 显示光标

#include <stdio.h>
#include <unistd.h>
#include <signal.h>extern int InitBoarder(void);
extern int SetBoarder(void);
extern int ShowMenu(void);
extern int InitBox(void);
extern int CreateBox(int BoxNo);
extern int MoveBox(int y, int x);
extern int ClearBox(int y, int x);
extern int CanMoveBox(int y, int x);int cury = 1;
int curx = 16;void handler(int signo)
{ClearBox(cury, curx);if (CanMoveBox(cury+1, curx)){MoveBox(cury+1, curx);cury = cury+1;ShowMenu();}else {MoveBox(cury, curx);ShowMenu();}alarm(1);return;
}int main(void)
{int i = 0;signal(SIGALRM, handler);InitBoarder();SetBoarder();CreateBox(13);MoveBox(cury, curx);ShowMenu();alarm(1);while (1){}return 0;
}
/************************************************************ * 文件名:boarder.c * 功能: 游戏界面相关功能* ************************************************************/#include <stdio.h>/* 游戏界面的宽度 */
#define BOARDER_WIDTH	60/* 游戏界面的高度 */
#define BOARDER_HEIGHT	30/* 游戏界面的数据内容 */
unsigned char gBoarder[BOARDER_HEIGHT][BOARDER_WIDTH];/* 初始化游戏界面数组内容 */
int InitBoarder(void)
{int i = 0;int j = 0;//1.对所有的元素都赋值为' 'for (j = 0; j < BOARDER_HEIGHT; j++){for (i = 0; i < BOARDER_WIDTH; i++){gBoarder[j][i] = ' ';}}return 0;
}/* 游戏界面加入边框 */
int SetBoarder(void)
{int i = 0;int j = 0;//1.第一行赋值为'#'for (i = 0; i < BOARDER_WIDTH; i++){gBoarder[0][i] = '#';}//2.最后一行赋值为'#'for (i = 0; i < BOARDER_WIDTH; i++){gBoarder[BOARDER_HEIGHT-1][i] = '#';}//3.第一列赋值为'#'for (j = 0; j < BOARDER_HEIGHT; j++){gBoarder[j][0] = '#';gBoarder[j][1] = '#';}//4.最后一列赋值为'#'for (j = 0; j < BOARDER_HEIGHT; j++){gBoarder[j][BOARDER_WIDTH-1] = '#';gBoarder[j][BOARDER_WIDTH-2] = '#';}//5.界面中间选择一列赋值为'#',作为游戏区域和其他功能区域的划分for (j = 0; j < BOARDER_HEIGHT; j++){gBoarder[j][BOARDER_WIDTH/3*2-1] = '#';gBoarder[j][BOARDER_WIDTH/3*2] = '#';}//6.游戏界面有方一行的一部分赋值为'#'for (i = BOARDER_WIDTH/3*2; i < BOARDER_WIDTH; i++){gBoarder[BOARDER_HEIGHT/2][i] = '#';}return 0;
}/* 游戏界面的显示 */
int ShowMenu(void)
{int i = 0;int j = 0;printf("\033[2J");for (j = 0; j < BOARDER_HEIGHT; j++){for (i = 0; i < BOARDER_WIDTH; i++){if ('#' == gBoarder[j][i]){printf("\033[41;31m%c\033[0m", gBoarder[j][i]);}else if ('[' == gBoarder[j][i] || ']' == gBoarder[j][i]){printf("\033[40;30m%c\033[0m", gBoarder[j][i]);}else{printf("%c", gBoarder[j][i]);}}printf("\n");}return 0;
}
/************************************************************ * 文件名:block.c * 功能: 俄罗斯方块功能* ************************************************************/#include <stdio.h>#define BOARDER_WIDTH	60#define BOARDER_HEIGHT	30extern unsigned char gBoarder[BOARDER_HEIGHT][BOARDER_WIDTH];/* 俄罗斯方块数据 */
unsigned char gBox[4][8];/* 初始化俄罗斯方块内容 */
int InitBox(void)
{int i = 0;int j = 0;for (j = 0; j < 4; j++){for (i = 0; i < 8; i++){gBox[j][i] = ' ';}}return 0;
}/* 创建俄罗斯方块图形 */
int CreateBox(int BoxNo)
{int i = 0;int j = 0;InitBox();if (0 == BoxNo){//[][][][]//////for (i = 0; i < 8; i++){gBox[0][i] = (0 == i % 2 ? '[' : ']');}}else if (1 == BoxNo){//[]//[]//[]//[]for (j = 0; j < 4; j++){gBox[j][0] = '[';gBox[j][1] = ']';}}else if (2 == BoxNo){//[][]//[][]////for (j = 0; j < 2; j++){for (i = 0; i < 4; i++){gBox[j][i] = (i % 2 == 0 ? '[' : ']');}}}else if (3 == BoxNo){//[][]//[]//[]//for (j = 0; j < 3; j++){gBox[j][0] = '[';gBox[j][1] = ']';}gBox[0][2] = '[';gBox[0][3] = ']';}else if (4 == BoxNo){//[][][]  //    []////for (i = 0; i < 6; i++){gBox[0][i] = (0 == i % 2 ? '[' : ']');}gBox[1][4] = '[';gBox[1][5] = ']';}else if (5 == BoxNo){//  []//  []//[][]//for (j = 0; j < 3; j++){gBox[j][2] = '[';gBox[j][3] = ']';}gBox[2][0] = '[';gBox[2][1] = ']';}else if (6 == BoxNo){//[]//[][][]////for (i = 0; i < 6; i++){gBox[1][i] = (0 == i % 2 ? '[' : ']');}gBox[0][0] = '[';gBox[0][1] = ']';}else if (7 == BoxNo){//[][]//  []//  []//for (j = 0; j < 3; j++){gBox[j][2] = '[';gBox[j][3] = ']';}gBox[0][0] = '[';gBox[0][1] = ']';}else if (8 == BoxNo){//    []//[][][] ////for (i = 0; i < 6; i++){gBox[1][i] = (0 == i % 2 ? '[' : ']');}gBox[0][4] = '[';gBox[0][5] = ']';}else if (9 == BoxNo){//[]//[]//[][]//for (j = 0; j < 3; j++){gBox[j][0] = '[';gBox[j][1] = ']';}gBox[2][2] = '[';gBox[2][3] = ']';}else if (10 == BoxNo){//[][][]//[]////for (i = 0; i < 6; i++){gBox[0][i] = (0 == i % 2 ? '[' : ']');}gBox[1][0] = '[';gBox[1][1] = ']';}else if (11 == BoxNo){//  []//[][][]////for (i = 0; i < 6; i++){gBox[1][i] = (0 == i % 2 ? '[' : ']');}gBox[0][2] = '[';gBox[0][3] = ']';}else if (12 == BoxNo){//[]//[][]//[]//for (j = 0; j < 3; j++){gBox[j][0] = '[';gBox[j][1] = ']';}gBox[1][2] = '[';gBox[1][3] = ']';}else if (13 == BoxNo){//[][][]//  []////for (i = 0; i < 6; i++){gBox[0][i] = (0 == i % 2 ? '[' : ']');}gBox[1][2] = '[';gBox[1][3] = ']';}else if (14 == BoxNo){//  []//[][]//  []//for (j = 0; j < 3; j++){gBox[j][2] = '[';gBox[j][3] = ']';}gBox[1][0] = '[';gBox[1][1] = ']';}else if (15 == BoxNo){//[]//[][]//  []//for (j = 0; j < 2; j++){gBox[j][0] = '[';gBox[j][1] = ']';}for (j = 1; j < 3; j++){gBox[j][2] = '[';gBox[j][3] = ']';}}else if (16 == BoxNo){//  [][]//[][]////for (i = 2; i < 6; i++){gBox[0][i] = (0 == i % 2 ? '[' : ']');}for (i = 0; i < 4; i++){gBox[1][i] = (0 == i % 2 ? '[' : ']');}}else if (17 == BoxNo){//  []//[][]//[]//for (j = 1; j < 3; j++){gBox[j][0] = '[';gBox[j][1] = ']';}for (j = 0; j < 2; j++){gBox[j][2] = '[';gBox[j][3] = ']';}}else if (18 == BoxNo){//[][]//  [][]////for (i = 0; i < 4; i++){gBox[0][i] = (0 == i % 2 ? '[' : ']');}for (i = 2; i < 6; i++){gBox[1][i] = (0 == i % 2 ? '[' : ']');}}return 0;
}/* 判断俄罗斯方块是否能够移动到指定游戏界面位置 */
int CanMoveBox(int y, int x)
{int i = 0;int j = 0;for (j = 0; j < 4; j++){for (i = 0; i < 8; i++){if ((gBox[j][i] == '[' || gBox[j][i] == ']') && (gBoarder[j+y][i+x] != ' ')){return 0;}}}return 1;
}/* 将俄罗斯方块移动到游戏界面中 */
int MoveBox(int y, int x)
{int i = 0;int j = 0;for (j = 0; j < 4; j++){for (i = 0; i < 8; i++){if (gBox[j][i] == '[' || gBox[j][i] == ']'){gBoarder[j+y][i+x] = gBox[j][i];}}}return 0;
}/* 将俄罗斯方块从游戏界面中清除 */
int ClearBox(int y, int x)
{int i = 0;int j = 0;for (j = 0; j < 4; j++){for (i = 0; i < 8; i++){if (gBox[j][i] == '[' || gBox[j][i] == ']'){gBoarder[j+y][i+x] = ' ';}}}return 0;
}

相关文章:

嵌入式学习第十六天

制作俄罗斯方块小游戏&#xff08;一&#xff09; 分析&#xff1a; printf函数高级用法 \033[&#xff1a;表示转义序列的开始 m&#xff1a;表示转义序列的结束 0&#xff1a;重置所有属性 1&#xff1a;设置粗体或高亮 30-37&#xff1a;设置字体色 30: 黑 31: 红 32:…...

Java过滤器拦截器的区别和实现

一、什么是过滤器与拦截器&#xff1f; 1.2 拦截器&#xff08;Interceptor&#xff09; java过滤器指的是在java中起到过滤的作用的一个方法。可以在一个请求到达servlet之前&#xff0c;将其截取进行逻辑判断&#xff0c;然后决定是否放行到请求的servlet&#xff1b;也可以在…...

Android 12 系统开机动画

修改Android开机动画有两种方式 方式一、通过adb 命令来修改&#xff1a; 进入/system/media目录&#xff0c;将里面的 bootanimation.zip 文件pull出来&#xff0c;然后解压&#xff0c;替换part0和part1中的图片&#xff0c;并且根据图片大小修改文件 desc.txt 中的内容&…...

C++:异常体系

异常体系 异常1.C语言传统的处理错误的方式2.C异常概念3.异常的使用3.1异常的抛出和捕获3.2 异常的重新抛出3.3异常安全3.4 异常规范 4.C标准库的异常体系5.异常的优缺点 异常 1.C语言传统的处理错误的方式 终止程序&#xff0c;如assert&#xff0c;缺陷&#xff1a;用户难以…...

民事二审案件庭审应如何准备?

一、你要明确审理范围&#xff0c;固定上诉请求 首先&#xff0c;第二审人民法院围绕当事人的上诉请求进行审理。 其次&#xff0c;在第二审程序中&#xff0c;原审原告增加独立的诉讼请求或者原审被告提出反诉的&#xff0c;第二审人民法院可以根据当事人自愿的原则就新增加的…...

WebRTC系列-H264视频帧组包(视频花屏问题)

文章目录 工具函数是否满足组帧条件函数PotentialNewFrame更新丢失包记录 UpdateMissingPackets重要属性1. InsertPacket2. FindFramesWebRTC在弱网环境下传输较大的视频数据,比如:屏幕共享数据;会偶发的出现黑屏的问题;也就是说当视频的码率比较大且视频的分辨率比较高的时…...

Common Mistakes in German

Comman Mistakes in German 1, Haus oder Hause2, ja nein oder doch(1) Positive Fragen(2) Negative Fragen 1, Haus oder Hause 2, ja nein oder doch (1) Positive Fragen (2) Negative Fragen kein / nicht P3...

Java基础数据结构之反射

一.定义 Java的反射机制是在运行状态中的&#xff0c;对于任意一个类都能知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意方法及属性。既然能拿到&#xff0c;我们就可以修改部分类型信息。这种动态获取信息以及动态调用对象方法的功能…...

【实战系列----消息队列 数据缓存】rabbitmq 消息队列 搭建和应用

线上运行图&#xff0c;更新不算最新版&#xff0c;但可以使用修改线程等补丁功能&#xff0c;建议使用新版本。 远程服务器配置图: 这个可以更具体情况&#xff0c;因为是缓存队列理所当然 内存越大越好&#xff0c;至于核心4核以上足够使用。4核心一样跑 这里主要是需要配置服…...

【云原生kubernetes系列】---亲和与反亲和

1、亲和和反亲和 node的亲和性和反亲和性pod的亲和性和反亲和性 1.1node的亲和和反亲和 1.1.1ndoeSelector&#xff08;node标签亲和&#xff09; #查看node的标签 rootk8s-master1:~# kubectl get nodes --show-labels #给node节点添加标签 rootk8s-master1:~# kubectl la…...

【极简】Pytorch中的register_buffer()

register buffer 定义模型能用torch.save保存的、但是不更新参数。 使用&#xff1a;只要是nn.Module的子类就能直接self.调用使用&#xff1a; class A(nn.Module): #... self.register_buffer(betas, torch.linspace(beta_1, beta_T, T).double()) #...手动定义参数 上述…...

J-Link:STM32使用J-LINK烧录程序,其他MCU也通用

说明&#xff1a;本文记录使用J-LINK烧录STM32程序的过程。 1. J-LINK驱动、软件下载 1、首先拥有硬件J-Link烧录器。 2、安装J-Link驱动程序SEGGER 下载地址如下 https://www.segger.com 直接下载就可以了。 2.如何使用J-LINK向STM32烧写程序 1、安装好以后打开J-LINK Fl…...

从0到1入门C++编程——06 类和对象之多态、文件操作

文章目录 多态1.多态基本概念2.多态案例——计算器3.纯虚函数和抽象类4.多态案例——制作饮品5.虚析构和纯虚析构6.多态案例——电脑组装 文件操作1.文本文件--写文件2.文本文件--读文件3.二进制文件--写文件4.二进制文件--读文件 多态 1.多态基本概念 多态是C面向对象的三大…...

elementUI实现selecttree自定义下拉框树形组件支持多选和搜索

elementUI实现selecttree自定义下拉框树形组件支持多选和搜索 效果图定义子组件父组件应用 效果图 定义子组件 主要结合el-select和el-tree两个组件改造的。 <template><div class"selectTree"><el-select filterable :filter-method"filterMe…...

使用 Spring Boot 构建 Docker 镜像的简易指南

Spring Boot 是一个用于创建独立的、生产级别的 Spring 应用程序的框架。结合 Docker&#xff0c;你可以方便地将你的 Spring Boot 应用程序打包成一个容器镜像&#xff0c;实现更加灵活和可移植的部署。本文将指导你如何使用 Docker 构建一个包含 Spring Boot 应用程序的镜像。…...

「数据结构」3.ArrayList

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;Java数据结构 &#x1f387;**欢迎点赞收藏加关注哦&#xff01;* ArrayList &#x1f349;ArrayList的构造&#x1f349;add方法&#x1f34c;扩容机制&#x1f34c;重要结论 &#x1f349;其…...

H.264与H.265的主要差异

H.265仍然采用混合编解码&#xff0c;编解码结构域H.264基本一致&#xff0c; H.265与H.264的主要不同 编码块划分结构&#xff1a;采用CU (CodingUnit)、PU(PredictionUnit)和TU(TransformUnit)的递归结构。 并行工具&#xff1a;增加了Tile以及WPP等并行工具集以提高编码速…...

【数据结构】 归并排序超详解

1.基本思想 归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide andConquer&#xff09;的一个非常典型的应用。 将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff0c;即先使每个子序列有序…...

Debezium系列之:深入理解GTID全局事务标识,并记录一次数据库重启造成数据丢失的原因和解决方案

Debezium系列之:深入理解GTID,并记录一次数据库重启造成数据丢失的原因和解决方案 一、背景二、深入理解什么是GTID三、深入理解gtid的uuid部分四、判断GTID之间的顺序大小五、解决方案一、背景 hive数据库的表与源头业务数据库的数据不一致,经过检查发现源头数据库发生了重…...

格式化内存卡后,如何找回丢失的监控视频?

随着摄像头的应用越来越广泛&#xff0c;很多监控摄像头采用了内存卡作为存储介质&#xff0c;方便用户存储和查看摄像头拍摄的视频文件。然而&#xff0c;由于各种原因&#xff0c;监控摄像头的内存卡有时会被意外格式化导致重要数据的丢失&#xff0c;给用户带来诸多困扰。 那…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能

1. 开发环境准备 ​​安装DevEco Studio 3.1​​&#xff1a; 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK ​​项目配置​​&#xff1a; // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...