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

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者&#xff1a;吴岐诗&#xff0c;杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言&#xff1a;融合数据湖与数仓的创新之路 在数字金融时代&#xff0c;数据已成为金融机构的核心竞争力。杭银消费金…...