嵌入式学习第十六天

news2024/11/28 22:43:42

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

分析:

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	30

extern 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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1425300.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

服务器未启动而端口进程仍在运行如何查看并杀死

首先登录服务器然后查看当前监听的端口&#xff1a; sudo netstat -tuln比如这里的8080&#xff0c;我们此时并未启动服务器&#xff0c;但是它却正在运行&#xff0c;这会导致服务器刚启动就秒挂。如果没有日志的话会让人有点疑惑&#xff0c;这种情况可能是之前运行了该进程…

系统架构设计师-21年-下午答案

系统架构设计师-21年-下午答案 更多软考知识请访问 https://ruankao.blog.csdn.net/ 试题一必答&#xff0c;二、三、四、五题中任选两题作答 试题一 (25分) 说明 某公司拟开发一套机器学习应用开发平台&#xff0c;支持用户使用浏览器在线进行基于机器学习的智能应用开发…

rancher证书过期问题处理

问题 起初&#xff0c;打开rancher ui页面打不开&#xff0c;telnet rancher的服务端口也不通。查看rancher 控制节点&#xff0c;日志显示&#xff0c;X509&#xff1a;certificate has expired or is not ye valid。证书已过期 解决 现在网上大部分的解决方案都是针对的2…

迁移windows操作系统

最近有个朋友跟我说他电脑台卡了&#xff0c;我帮他大概看了下&#xff0c;归集原因磁盘还是机械硬盘&#xff0c;需要将他的电脑的磁盘的机械硬盘换一下&#xff0c;内存也比较小&#xff0c;4GB的&#xff0c;换一下&#xff0c;换成8GB的&#xff0c;本文只涉及到更换系统盘…

【MATLAB】PSO_BiLSTM神经网络回归预测算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 PSO_BiLSTM神经网络回归预测算法是一种结合了粒子群优化&#xff08;Particle Swarm Optimization&#xff0c;PSO&#xff09;和双向长短期记忆网络&#xff08;Bidirectional Long Shor…

CodeGeeX AI编程助手提升.NET开发工作效率

前言 2022年6月&#xff0c;随着GitHub Copliot正式面向大众发布。让许多开发者都感受到了AI辅助编程工具的魅力所在&#xff0c;Copilot实现了帮助开发者大大提高了编程开发效率&#xff0c;让程序员朝九晚五成为可能。Copilot近乎是完美的&#xff0c;但还是由于种种原因&am…

LeetCode:49. 字母异位词分组

49. 字母异位词分组 1&#xff09;题目2&#xff09;代码3&#xff09;结果 1&#xff09;题目 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs…

color - 让你的输出带点颜色

color color 是一个可以让你输出带颜色文本的库。 安装 go get github.com/fatih/color示例 输出到控制台 // 这会直接输出到控制台 color.Cyan("Prints text in cyan.")// 每个调用末尾会自动加上换行 color.Blue("Prints %s in blue.", "text&…

任务导向的扩散模型压缩;万物皆可成像;根据舞蹈生成音乐;LLM长上下文对齐;LLM KV缓存量化;通过运动场辅助扩散模型图像编辑

本文首发于公众号&#xff1a;机器感知 任务导向的扩散模型压缩&#xff1b;万物皆可成像&#xff1b;根据舞蹈生成音乐&#xff1b;LLM长上下文对齐&#xff1b;LLM KV缓存量化&#xff1b;通过运动场辅助扩散模型图像编辑 Task-Oriented Diffusion Model Compression As re…

Vmware 无法开启虚拟化解决方法

最近遇到了Vmware无法开启虚拟化的问题,已经解决,记录一下解决经过。 我遇到的情况是BIOS已经开启虚拟化,HV服务也停用了,但是Vmware仍然提示模块“VPMC”启动失败。网上的解决方案千篇一律,基本都是排查BIOS、停用Windows的虚拟化功能、停用HV主机服务、Vmware配置中关闭…

python pandas模块详解

python pandas模块详解 一&#xff1a;pandas简介二&#xff1a;pandas安装以及库的导入2.1 Pandas安装2.2 pandas模块的导入 三&#xff1a;pandas数据结构3.1 pandas Series结构3.1.1创建Series对象1&#xff09;ndarray&#xff08;数组&#xff09;创建Series对象2&#xf…

静态时序分析:时序弧以及其时序敏感(单调性)

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 在静态时序分析中&#xff0c;不管是组合逻辑单元&#xff08;如与门、或门、与非门等&#xff09;还是时序逻辑&#xff08;D触发器等&#xff09;在时序建模时…

Elasticsearch性能调优

背景 项目上是用 ES 做数据库&#xff0c;存储的告警数据&#xff0c;量级在千万级别左右。测试在压测之后&#xff0c;系统频繁出现告警记录查询报错&#xff0c;系统不可用。基于此排查分析项目上 Elasticsearch 的使用是否合理。 版本及硬件 环境&#xff1a;10.xx.xxx.x…

sectigo ip ssl证书有哪些

Sectigo是移交成立时间较久的CA认证机构&#xff0c;几十年来在全球颁发了各种各样的数字证书&#xff0c;例如&#xff0c;单域名SSL证书、多域名SSL证书、通配符SSL证书等域名SSL证书。Sectigo旗下也有一些不常见的数字证书&#xff0c;例如&#xff0c;代码签名证书、IP证书…

浅谈WPF之UniformGrid和ItemsControl

在日常开发中&#xff0c;有些布局非常具有规律性&#xff0c;比如相同的列宽&#xff0c;行高&#xff0c;均匀的排列等&#xff0c;为了简化开发&#xff0c;WPF提供了UniformGrid布局和ItemsControl容器&#xff0c;本文以一个简单的小例子&#xff0c;简述&#xff0c;如何…

ApacheNginx配置ssl证书

一、Apache配置ssl Linux版本&#xff1a;CentOS Linux release 7.9.2009 (Core) Apache版本&#xff1a;Apache/2.4.6 (CentOS) 1、安装Apache&#xff08;使用默认yum源&#xff09; [root10-35-1-25 ~]# yum -y install httpd2、查Apache版本&启动Apache [root10-35-…

vue使用富文本

1、安装 cnpm install vue-quill-editor2、在main.js中引入 // 富文本 import VueQuillEditor from vue-quill-editor // require styles 引入样式 import quill/dist/quill.core.css import quill/dist/quill.snow.css import quill/dist/quill.bubble.css Vue.use(VueQuill…

使用orangepi玩linux

最近看了这个大佬的文章&#xff0c;写了使用远程来挂载linux的方案&#xff0c;觉得还是很有意思的&#xff0c;瞬间感觉linux这块都还是相通的&#xff0c;就跑了一下&#xff0c;果然&#xff0c;牛逼&#xff01; 香橙派全志H3烧录Uboot&#xff0c;远程加载zImage&#xf…

Autonomous_Exploration_Development_Environment的local_planner学习笔记

1.程序下载网址&#xff1a;https://github.com/HongbiaoZ/autonomous_exploration_development_environment 2.相关参考资料&#xff1a; https://blog.csdn.net/lizjiwei/article/details/124437157 Matlab用采样的离散点做前向模拟三次样条生成路径点-CSDN博客 CMU团队开…

门的方向为何如此重要?探秘产品经理面试题的设计哲学

大家好,我是小米!最近我在面试产品经理的时候遇到了一个有趣而又颇具深意的问题:厕所的门应该朝内还是朝外开?这个问题看似简单,却蕴含了很多关于产品设计的考量。今天,我们一起来深入剖析这个问题,看看我们在设计产品时应该如何权衡各种因素。 背景介绍 在日常生活中…