嵌入式学习第十七天
C语言小项目:
制作俄罗斯方块小游戏(全部)
主函数部分
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
#include <stdlib.h>
#include <time.h>
#include "boarder.h"
#include "block.h"int cury = 1;
int curx = 16;
int curboxno = 0;
int nextboxno = 0;
int score = 0;int SetScore(void)
{char tmpbuff[1024] = {0};sprintf(tmpbuff, "%06d", score);strncpy(&gBoarder[BOARDER_HEIGHT/4*3][BOARDER_WIDTH/6*5-3], tmpbuff, 6);return 0;
}void handler(int signo)
{int i = 0;ClearBox(gBox, cury, curx);if (CanMoveBox(gBox, cury+1, curx)){MoveBox(gBox, cury+1, curx);cury = cury+1;ShowMenu();}else {MoveBox(gBox, cury, curx);ShowMenu();//判断当前这4行是否都能被消除 for (i = 0; i < 4 && cury + i < BOARDER_HEIGHT-1; i++){if (CanClearLine(cury+i)){ClearLine(cury+i);score++;SetScore();ShowMenu();}}curboxno = nextboxno;CreateBox(gBox, nextboxno);ClearBox(gNextBox, BOARDER_HEIGHT/4-2, BOARDER_WIDTH/6*5-4);nextboxno = rand() % 19;CreateBox(gNextBox, nextboxno);MoveBox(gNextBox, BOARDER_HEIGHT/4-2, BOARDER_WIDTH/6*5-4);cury = 1;curx = 16;if (CanMoveBox(gBox, cury, curx)){MoveBox(gBox, cury, curx);ShowMenu();}else {exit(0);}}alarm(1);return;
}int main(void)
{char ch = 0;signal(SIGALRM, handler);system("stty -echo");system("stty -icanon min 1");srand(time(NULL));InitBoarder();SetBoarder();SetScore();curboxno = rand() % 19;CreateBox(gBox, curboxno);MoveBox(gBox, cury, curx);nextboxno = rand() % 19;CreateBox(gNextBox, nextboxno);MoveBox(gNextBox, BOARDER_HEIGHT/4-2, BOARDER_WIDTH/6*5-4);ShowMenu();alarm(1);while (1){ch = getchar();if ('a' == ch || 'A' == ch){ClearBox(gBox, cury, curx);if (CanMoveBox(gBox, cury, curx-2)){MoveBox(gBox, cury, curx-2);ShowMenu();curx -= 2;}else {MoveBox(gBox, cury, curx);ShowMenu();}}else if ('w' == ch || 'W' == ch){ClearBox(gBox, cury, curx);CreateBox(gChangeBox, GetChangeBoxNo(curboxno));if (CanMoveBox(gChangeBox, cury, curx)){MoveBox(gChangeBox, cury, curx);memcpy(gBox, gChangeBox, sizeof(gChangeBox));curboxno = GetChangeBoxNo(curboxno);ShowMenu();}else {MoveBox(gBox, cury, curx);ShowMenu();}}else if ('d' == ch || 'D' == ch){ClearBox(gBox, cury, curx);if (CanMoveBox(gBox, cury, curx+2)){MoveBox(gBox, cury, curx+2);ShowMenu();curx += 2;}else {MoveBox(gBox, cury, curx);ShowMenu();}}else if ('s' == ch || 'S' == ch){ClearBox(gBox, cury, curx);if (CanMoveBox(gBox, cury+1, curx)){MoveBox(gBox, cury+1, curx);ShowMenu();cury += 1;}else {MoveBox(gBox, cury, curx);ShowMenu();}}else if ('p' == ch || 'P' == ch){alarm(0);}else if ('c' == ch || 'C' == ch){alarm(1);}else if ('q' == ch){exit(0);}}return 0;
}
游戏界面部分
/* 游戏界面的宽度 */
#define BOARDER_WIDTH 60/* 游戏界面的高度 */
#define BOARDER_HEIGHT 30extern unsigned char gBoarder[BOARDER_HEIGHT][BOARDER_WIDTH];
extern int InitBoarder(void);
extern int SetBoarder(void);
extern int ShowMenu(void);
extern int CanClearLine(int LineNo);
extern int ClearLine(int LineNo);
/************************************************************ * 文件名:boarder.c * 功能: 游戏界面相关功能* ************************************************************/#include <stdio.h>
#include "boarder.h"/* 游戏界面的数据内容 */
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-2] = '#';gBoarder[j][BOARDER_WIDTH/3*2-1] = '#';}//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;
}int CanClearLine(int LineNo)
{int i = 0;for (i = 2; i < BOARDER_WIDTH/3*2-2; i++){if (' ' == gBoarder[LineNo][i]){return 0;}}return 1;
}int ClearLine(int LineNo)
{int i = 0;int j = 0;for (j = LineNo; j > 1; j--){for (i = 2; i < BOARDER_WIDTH/3*2-2; i++){gBoarder[j][i] = gBoarder[j-1][i];}}return 0;
}
功能部分
extern unsigned char gBox[4][8];
extern unsigned char gChangeBox[4][8];
extern unsigned char gNextBox[4][8];extern int InitBox(unsigned char (*pBox)[8]);
extern int CreateBox(unsigned char (*pBox)[8], int BoxNo);
extern int CanMoveBox(unsigned char (*pBox)[8], int y, int x);
extern int MoveBox(unsigned char (*pBox)[8], int y, int x);
extern int ClearBox(unsigned char (*pBox)[8], int y, int x);
extern int GetChangeBoxNo(int No);
/************************************************************ * 文件名:block.c * 功能: 俄罗斯方块功能* ************************************************************/#include <stdio.h>
#include "block.h"
#include "boarder.h"/* 俄罗斯方块数据 */
unsigned char gBox[4][8];/* 俄罗斯方块变形后数据 */
unsigned char gChangeBox[4][8];/* 俄罗斯方块下一个方块数据 */
unsigned char gNextBox[4][8];/* 初始化俄罗斯方块内容 */
int InitBox(unsigned char (*pBox)[8])
{int i = 0;int j = 0;for (j = 0; j < 4; j++){for (i = 0; i < 8; i++){pBox[j][i] = ' ';}}return 0;
}/* 俄罗斯方块变形规则 */
int GetChangeBoxNo(int No)
{int DstNo = -1;switch (No){case 0:DstNo = 1;break;case 1:DstNo = 0;break;case 2:DstNo = 2;break;case 3:DstNo = 4;break;case 4:DstNo = 5;break;case 5:DstNo = 6;break;case 6:DstNo = 3;break;case 7:DstNo = 8;break;case 8:DstNo = 9;break;case 9:DstNo = 10;break;case 10:DstNo = 7;break;case 11:DstNo = 12;break;case 12:DstNo = 13;break;case 13:DstNo = 14;break;case 14:DstNo = 11;break;case 15:DstNo = 16;break;case 16:DstNo = 15;break;case 17:DstNo = 18;break;case 18:DstNo = 17;break;}return DstNo;
}/* 创建俄罗斯方块图形 */
int CreateBox(unsigned char (*pBox)[8], int BoxNo)
{int i = 0;int j = 0;InitBox(pBox);if (0 == BoxNo){//[][][][]//////for (i = 0; i < 8; i++){pBox[0][i] = (0 == i % 2 ? '[' : ']');}}else if (1 == BoxNo){//[]//[]//[]//[]for (j = 0; j < 4; j++){pBox[j][0] = '[';pBox[j][1] = ']';}}else if (2 == BoxNo){//[][]//[][]////for (j = 0; j < 2; j++){for (i = 0; i < 4; i++){pBox[j][i] = (i % 2 == 0 ? '[' : ']');}}}else if (3 == BoxNo){//[][]//[]//[]//for (j = 0; j < 3; j++){pBox[j][0] = '[';pBox[j][1] = ']';}pBox[0][2] = '[';pBox[0][3] = ']';}else if (4 == BoxNo){//[][][] // []////for (i = 0; i < 6; i++){pBox[0][i] = (0 == i % 2 ? '[' : ']');}pBox[1][4] = '[';pBox[1][5] = ']';}else if (5 == BoxNo){// []// []//[][]//for (j = 0; j < 3; j++){pBox[j][2] = '[';pBox[j][3] = ']';}pBox[2][0] = '[';pBox[2][1] = ']';}else if (6 == BoxNo){//[]//[][][]////for (i = 0; i < 6; i++){pBox[1][i] = (0 == i % 2 ? '[' : ']');}pBox[0][0] = '[';pBox[0][1] = ']';}else if (7 == BoxNo){//[][]// []// []//for (j = 0; j < 3; j++){pBox[j][2] = '[';pBox[j][3] = ']';}pBox[0][0] = '[';pBox[0][1] = ']';}else if (8 == BoxNo){// []//[][][] ////for (i = 0; i < 6; i++){pBox[1][i] = (0 == i % 2 ? '[' : ']');}pBox[0][4] = '[';pBox[0][5] = ']';}else if (9 == BoxNo){//[]//[]//[][]//for (j = 0; j < 3; j++){pBox[j][0] = '[';pBox[j][1] = ']';}pBox[2][2] = '[';pBox[2][3] = ']';}else if (10 == BoxNo){//[][][]//[]////for (i = 0; i < 6; i++){pBox[0][i] = (0 == i % 2 ? '[' : ']');}pBox[1][0] = '[';pBox[1][1] = ']';}else if (11 == BoxNo){// []//[][][]////for (i = 0; i < 6; i++){pBox[1][i] = (0 == i % 2 ? '[' : ']');}pBox[0][2] = '[';pBox[0][3] = ']';}else if (12 == BoxNo){//[]//[][]//[]//for (j = 0; j < 3; j++){pBox[j][0] = '[';pBox[j][1] = ']';}pBox[1][2] = '[';pBox[1][3] = ']';}else if (13 == BoxNo){//[][][]// []////for (i = 0; i < 6; i++){pBox[0][i] = (0 == i % 2 ? '[' : ']');}pBox[1][2] = '[';pBox[1][3] = ']';}else if (14 == BoxNo){// []//[][]// []//for (j = 0; j < 3; j++){pBox[j][2] = '[';pBox[j][3] = ']';}pBox[1][0] = '[';pBox[1][1] = ']';}else if (15 == BoxNo){//[]//[][]// []//for (j = 0; j < 2; j++){pBox[j][0] = '[';pBox[j][1] = ']';}for (j = 1; j < 3; j++){pBox[j][2] = '[';pBox[j][3] = ']';}}else if (16 == BoxNo){// [][]//[][]////for (i = 2; i < 6; i++){pBox[0][i] = (0 == i % 2 ? '[' : ']');}for (i = 0; i < 4; i++){pBox[1][i] = (0 == i % 2 ? '[' : ']');}}else if (17 == BoxNo){// []//[][]//[]//for (j = 1; j < 3; j++){pBox[j][0] = '[';pBox[j][1] = ']';}for (j = 0; j < 2; j++){pBox[j][2] = '[';pBox[j][3] = ']';}}else if (18 == BoxNo){//[][]// [][]////for (i = 0; i < 4; i++){pBox[0][i] = (0 == i % 2 ? '[' : ']');}for (i = 2; i < 6; i++){pBox[1][i] = (0 == i % 2 ? '[' : ']');}}return 0;
}/* 判断俄罗斯方块是否能够移动到指定游戏界面位置 */
int CanMoveBox(unsigned char (*pBox)[8], int y, int x)
{int i = 0;int j = 0;for (j = 0; j < 4; j++){for (i = 0; i < 8; i++){if ((pBox[j][i] == '[' || pBox[j][i] == ']') && (gBoarder[j+y][i+x] != ' ')){return 0;}}}return 1;
}/* 将俄罗斯方块移动到游戏界面中 */
int MoveBox(unsigned char (*pBox)[8], int y, int x)
{int i = 0;int j = 0;for (j = 0; j < 4; j++){for (i = 0; i < 8; i++){if (pBox[j][i] == '[' || pBox[j][i] == ']'){gBoarder[j+y][i+x] = pBox[j][i];}}}return 0;
}/* 将俄罗斯方块从游戏界面中清除 */
int ClearBox(unsigned char (*pBox)[8], int y, int x)
{int i = 0;int j = 0;for (j = 0; j < 4; j++){for (i = 0; i < 8; i++){if (pBox[j][i] == '[' || pBox[j][i] == ']'){gBoarder[j+y][i+x] = ' ';}}}return 0;
}
完成后成果图:
相关文章:

嵌入式学习第十七天
C语言小项目: 制作俄罗斯方块小游戏(全部) 主函数部分 #include <stdio.h> #include <unistd.h> #include <string.h> #include <signal.h> #include <stdlib.h> #include <time.h> #include "b…...

使用Python的Turtle模块简单绘制烟花效果
import turtle import random# 初始化屏幕 screen turtle.Screen() screen.bgcolor("black") screen.title("烟花模拟")# 创建一个Turtle来绘制烟花 firework turtle.Turtle() firework.hideturtle() firework.speed(0) # 设置绘图速度为最快# 绘制烟花…...

数学建模-退火算法和遗传算法
退火算法和遗传算法 一.退火算法 退火算法Matlab程序如下: [W]xlsread(D:100个目标经度纬度);>> x[W(:,1)];>> y[W(:,2)];>> w[x y];;d1[70, 40];>> w[d1;w;d1]ww*pi/180;%角度化成弧度dzeros(102);%距离矩阵初始化for i1:101…...

Qt开源版 vs 商业版 详细比较!!!!
简单整理Qt开源版与商业版有哪些差别,仅供参考。 简单对比 开源版商业版许可证大部分采用对商业使用不友好的LGPLv3具备商业许可证保护代码专有许可证相关大部分模块使用LGPLv3和部分模块使用GPL组成仅第三方开源组件使用Qt的其他许可证Qt模块功能支持支持技术支持…...

华为云CodeArts Snap荣获信通院优秀大模型案例及两项荣誉证书
2024年1月25日,中国人工智能产业发展联盟智能化软件工程工作组(AI for Software Engineering,下文简称AI4SE)在京召开首届“AI4SE创新巡航”活动。在活动上,华为云大模型辅助系统测试代码生成荣获“2023AI4SE银弹优秀案…...
小程序的应用、页面、组件生命周期(超全版)
小程序生命周期 应用的生命周期 onLaunch: 初始化小程序完成时触发,且全局只触发一次; onShow: 小程序初始化完成(启动)或从后台切换到前台显示时触发; onHide: 小程序从前台切换到后台隐藏时触发(如切换…...

TCP四次握手
TCP 协议在关闭连接时,需要进行四次挥手的过程,主要是为了确保客户端和服务器都能正确地关闭连接。 # 执行流程 四次挥手的具体流程如下: 客户端发送 FIN 包:客户端发送一个 FIN 包,其中 FIN 标识位为 1,…...

EBC金融英国CEO:高波动性周期下,如何寻找市场的稳定性?
利率主导的市场,将在2024年延续。目前,固收市场对于降息的定价,正通过利率传导至不同资产中。尽管市场迫切利用通胀去佐证降息,但各国央行仍囿于通胀目标的政策桎梏。政策和市场预期的博弈将继续牵动市场脉搏,引发价格…...

C++ Web 编程
什么是 CGI? 公共网关接口(CGI),是一套标准,定义了信息是如何在 Web 服务器和客户端脚本之间进行交换的。CGI 规范目前是由 NCSA 维护的,NCSA 定义 CGI 如下:公共网关接口(CGI&…...

docker笔记整理
Docker 安装 添加yum源 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 安装docker yum -y install docker-ce docker-ce-cli containerd.io docker-compose-plugin 启动docker systemctl start docker 查看docker状态 s…...

什么是git,怎样下载安装?
简介: 应用场景: 应用场景:团队企业开发 作用: 安装: 1.网址:Git - Downloads 很卡很慢 2.可以选择镜像网站下载(推荐) CNPM Binaries Mirror...
Camille-学习笔记-测试流程和测试设计
## 测试用例学习路线 startmindmap * 测试用例 ** 黑盒测试方法论 *** 等价类 *** 边界值 *** 因果图 *** 判定表 *** 场景法 *** 基于模型的测试 ** 白盒测试方法论 ** 测试用例基础概念 ** 测试用例设计 ** 面试测试用例设计 ** 常用测试策略与测试手段 endmindmap **测试用…...

【Python笔记-设计模式】建造者模式
一、说明 又称生成器,是一种创建型设计模式,使其能够分步骤创建复杂对象。允许使用相同的创建代码生成不同类型和形式的对象。 (一) 解决问题 对象的创建问题:当一个对象的构建过程复杂,且部分构建过程相互独立时,可…...

【LVGL源码移植】
LVGL源码移植 ■ LVGL源码移植一:下载LVGL源码二:修改LVGL文件夹1: 将这5个文件,复制到一个新的文件夹2: 简化文件,减少内存消耗(去除不必要的文件)3: 为了规范化,我们将下列文件进行重命名 三&…...

双非本科准备秋招(14.2)—— 进程与线程
进程 进程是运行着的程序,是程序在操作系统的一次执行过程,进程是操作系统分配资源的基本单位。 启动一个java程序,操作系统就会创建一个java进程 进程也可以看作一个程序的实例,大部分程序可以运行多个实例进程,比如记…...

数据结构和算法笔记5:堆和优先队列
今天来讲一下堆,在网上看到一个很好的文章,不过它实现堆是用Golang写的,我这里打算用C实现一下: Golang: Heap data structure 1. 基本概念 满二叉树(二叉树每层节点都是满的): 完全二叉树&a…...
第8章 SpringBoot任务管理
学习目标 熟悉SpringBoot整合异步任务的实现 熟悉SpringBoot整合定时任务的实现 熟悉SpringBoot整合邮件任务的实现 开发web应用时,多数应用都具备任务调度功能。常见的任务包括异步任务,定时任务和发邮件任务。我们以数据库报表为例看看任务调度如何帮助改善系统设计。报表可…...

Qt5 基于OpenGL实现六轴机械臂三维仿真
需求 在Qt中通过OPenGL方式加载三维模型STL文件,然后将多个结构的STL文件类型的模型进行组装,形成6轴机械臂三维模型的显示,并且可以对每个关节进行关节角度的控制。 新建一个C类STLFileLoader,用于加载STL文件,并进…...

路由进阶
文章目录 1.路由的封装抽离2.声明式导航 - 导航链接3.声明式导航-两个类名自定义匹配的类名 4.声明式导航 - 跳转传参查询参数传参动态路传参两种传参方式的区别动态路由参数可选符 5.Vue路由 - 重定向6.Vue路由 - 4047.Vue路由 - 模式设置8.编程式导航 - 两种路由跳转9.编程式…...

分类预测 | Matlab实现SCN-Adaboost随机配置网络模型SCN的Adaboost数据分类预测/故障识别
分类预测 | Matlab实现SCN-Adaboost随机配置网络模型SCN的Adaboost数据分类预测/故障识别 目录 分类预测 | Matlab实现SCN-Adaboost随机配置网络模型SCN的Adaboost数据分类预测/故障识别分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现SCN-Adaboost随机配置网…...

LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
在树莓派上添加音频输入设备的几种方法
在树莓派上添加音频输入设备可以通过以下步骤完成,具体方法取决于设备类型(如USB麦克风、3.5mm接口麦克风或HDMI音频输入)。以下是详细指南: 1. 连接音频输入设备 USB麦克风/声卡:直接插入树莓派的USB接口。3.5mm麦克…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...

实战设计模式之模板方法模式
概述 模板方法模式定义了一个操作中的算法骨架,并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下,重新定义算法中的某些步骤。简单来说,就是在一个方法中定义了要执行的步骤顺序或算法框架,但允许子类…...