当前位置: 首页 > 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;给用户带来诸多困扰。 那…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台

淘宝扭蛋机小程序系统的开发&#xff0c;旨在打造一个互动性强的购物平台&#xff0c;让用户在购物的同时&#xff0c;能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机&#xff0c;实现旋转、抽拉等动作&#xff0c;增…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...

安卓基础(Java 和 Gradle 版本)

1. 设置项目的 JDK 版本 方法1&#xff1a;通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分&#xff0c;设置 Gradle JDK 方法2&#xff1a;通过 Settings File → Settings... (或 CtrlAltS)…...