【STM32单片机】俄罗斯方块游戏设计

news2024/11/19 1:39:56

文章目录

  • 一、功能简介
  • 二、软件设计
  • 三、实验现象
  • 联系作者


一、功能简介

本项目使用STM32F103C8T6单片机控制器,使用按键、IIC OLED模块等。
主要功能:
系统运行后,OLED显示俄罗斯方块游戏界面并开始游戏,KEY1键用于方块方向旋转,KEY3、KEY4键控制左右方向移动,KEY2键控制方块下落速度。每消除1层分数递增10分,最大显示5位数分数。当游戏结束后,按下KEY4键重新开始游戏。


二、软件设计

/*
作者:嗨小易(QQ:3443792007)

*/



//合法性判断
int IsLegal(int shape, int form, int x, int y)
{
	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			//如果方块落下的位置本来就已经有方块了,则不合法
			if ((block[shape][form].space[i][j] == 1) && (face.data[y + i][x + j] == 1))
				return 0; //不合法
		}
	}
	return 1; //合法
}


//游戏主体逻辑函数
void StartGame(void)
{
	int shape = rand() % 7, form = rand() % 4; //随机获取方块的形状和形态
	while(1)
	{
		int t = 0;
		int nextShape = rand() % 7, nextForm = rand() % 4; //随机获取下一个方块的形状和形态
		int x = COL / 2 - 2, y = 0; //方块初始下落位置的横纵坐标
		DrawBlock(nextShape, nextForm,0,ROW+1); //将下一个方块显示在右上角
		while(1)
		{
			DrawBlock(shape, form, x, y); //将该方块显示在初始下落位置
			if(t == 0)
			{
				t = 50; //这里t越小,方块下落越快(可以根据此设置游戏难度)
			}
			while(--t)
			{
				if (gkey_value!= 0) //若键盘被敲击,则退出循环
					break;
				delay_ms(10);
			}
			if (t == 0) //键盘未被敲击
			{
				if(IsLegal(shape, form, x, y + 1) == 0) //方块再下落就不合法了(已经到达底部)
				{
					//将当前方块的信息录入face当中
					//face:记录界面的每个位置是否有方块,若有方块还需记录该位置方块的颜色。
					for (int i = 0; i < 4; i++)
					{
						for (int j = 0; j < 4; j++)
						{
							if (block[shape][form].space[i][j] == 1)
							{
								face.data[y + i][x + j] = 1; //将该位置标记为有方块
							}
						}
					}
					while(JudeFunc()); //判断此次方块下落是否得分以及游戏是否结束
					break; //跳出当前死循环,准备进行下一个方块的下落
				}
				else //未到底部
				{
					DrawSpace(shape, form, x, y); //用空格覆盖当前方块所在位置
					y++; //纵坐标自增(下一次显示方块时就相当于下落了一格了)
				}
			}
			else	//键盘被敲击
			{
				char ch = gkey_value; //读取keycode
				gkey_value=0;
				switch (ch)
				{
					case KEY2_PRESS: //方向键:下
						if (IsLegal(shape, form, x, y + 3) == 1) //判断方块向下移动一位后是否合法
						{
							//方块下落后合法才进行以下操作
							DrawSpace(shape, form, x, y); //用空格覆盖当前方块所在位置
							y+=3; //纵坐标自增(下一次显示方块时就相当于下落了一格了)
						}
						break;
					case KEY3_PRESS: //方向键:左
						if (IsLegal(shape, form, x - 1, y) == 1) //判断方块向左移动一位后是否合法
						{
							//方块左移后合法才进行以下操作
							DrawSpace(shape, form, x, y); //用空格覆盖当前方块所在位置
							x--; //横坐标自减(下一次显示方块时就相当于左移了一格了)
						}
						break;
					case KEY4_PRESS: //方向键:右
						if (IsLegal(shape, form, x + 1, y) == 1) //判断方块向右移动一位后是否合法
						{
							//方块右移后合法才进行以下操作
							DrawSpace(shape, form, x, y); //用空格覆盖当前方块所在位置
							x++; //横坐标自增(下一次显示方块时就相当于右移了一格了)
						}
						break;
					case KEY1_PRESS: //空格键
						if (IsLegal(shape, (form + 1) % 4, x, y + 1) == 1) //判断方块旋转后是否合法
						{
							//方块旋转后合法才进行以下操作
							DrawSpace(shape, form, x, y); //用空格覆盖当前方块所在位置
							y++; //纵坐标自增(总不能原地旋转吧)
							form = (form + 1) % 4; //方块的形态自增(下一次显示方块时就相当于旋转了)
						}
						break;
				}
			}
		}
		shape = nextShape, form = nextForm; //获取下一个方块的信息
		DrawSpace(nextShape, nextForm,0,ROW+1); //将下一个的方块信息用空格覆盖
	}
}

//俄罗斯方块游戏
void app_demo(void)
{
	max=grade=0;
	KEY_Init();
	My_EXTI_Init();
	OLED_Init();
	InitInterface(); //初始化界面
	InitBlockInfo(); //初始化方块信息
	StartGame(); //开始游戏
	
	while(1)
	{
		
	}
}




三、实验现象

B站演示视频:https://space.bilibili.com/444388619

在这里插入图片描述
在这里插入图片描述


联系作者

专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

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

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

相关文章

【交互式阈值二进制图像】采用彩色或单色图像通过交互/手动方式阈值单色图像或彩色图像的单个色带研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

MFC ExtTextOut函数学习

ExtTextOut - 扩展的文本输出&#xff1b; win32 api的声明如下&#xff1b; ExtTextOut( DC: HDC; {设备环境句柄} X, Y: Integer; {起点坐标} Options: Longint; {选项} Rect: PRect; {指定显示范围; 0 表示限制范围} Str: PChar; {字符串…

论文分享 | 利用单模态自监督学习实现多模态AVSR

本次分享上海交通大学发表在 ACL 2022 会议 的论文《Leveraging Unimodal Self-Supervised Learning for Multimodal AVSR》。该论文利用大规模单模态自监督学习构建多模态语音识别模型。 论文地址&#xff1a; https://aclanthology.org/2022.acl-long.308.pdf 代码仓库&am…

ACM模板修改

修改为匿名版本 将 \documentclass[sigconf,authordraft]{acmart} 改为 \documentclass[sigconf,review,anonymous]{acmart} 去掉模板中的无用段落 添加如下语句删除上述段落 \renewcommand\footnotetextcopyrightpermission[1]{} 添加如下语句删除上述段落 \settopmatter…

2019款保时捷卡宴车发动机故障灯异常点亮

故障现象 一辆2019款保时捷卡宴车&#xff0c;搭载DCB发动机&#xff0c;累计行驶里程约为9万km。车主反映&#xff0c;该车行驶中发动机故障灯偶尔异常点亮&#xff08;图1&#xff09;&#xff0c;其他无异常&#xff0c;为此在其他维修厂更换过燃油箱通风电磁阀、活性炭罐及…

品牌举办活动如何提高知名度?媒介盒子告诉你

2023年&#xff0c;线下消费端口迎来了迅猛爆发&#xff0c;多数行业进入“复苏反攻”状态之中&#xff0c;但在生活节奏加快&#xff0c;信息碎片化趋势之下&#xff0c;大众的注意力成为稀缺资源&#xff0c;逐渐趋同的套路式营销很难打动人心&#xff0c;对于品牌来说&#…

python3多线程处理文件

问题 现在需要对某个文本中的每一条进行处理&#xff0c;例如&#xff1a;对每一行进行同样的操作&#xff0c;现在采用多线程进行&#xff0c;而不是一条一条读取、执行 解决 #! /usr/bin/env python # encoding:utf-8 # Software:PyCharm # Time:2023/10/07 14:30 # Auth…

k8s 集群安装(vagrant + virtualbox + CentOS8)

主机环境&#xff1a;windows 11 k8s版本&#xff1a;v1.25 dashboard版本&#xff1a;v2.7.0 calico版本&#xff1a; v3.26.1 CentOS8版本&#xff1a;4.18.0-348.7.1.el8_5.x86_64 用到的脚本&#xff1a; https://gitcode.net/sundongsdu/k8s_cluster 1. Vagrant创建…

乌班图22.04 kubeadm简单搭建k8s集群

1. 我遇到的问题 任何部署类问题实际上对于萌新来说都不算简单&#xff0c;因为没有经验&#xff0c;这里我简单将部署的步骤和想法给大家讲述一下 2. 简单安装步骤 准备 3台标准安装的乌班图server22.04&#xff08;采用vm虚拟机安装&#xff0c;ip为192.168.50.3&#xff0…

DP1363F与CLRC663的兼容性对比区别

DP1363F收发器DP1363F支持下列操作模式 • 替代兼容CLRC663/RC663 • 读写模式支持 ISO/IEC 14443A/MIFARE • 读写模式支持 SO/IEC 14443IB • JIS X 6319-4 读写模式支持&#xff08;等效于FeliCa1方案&#xff09; • 相应于 ISO/IEC 18092 的被动发起方模式 • 读写模式支持…

告别繁琐,轻松管理SQLite数据库!极简SQLite数据库管理器上线了

如果你是一名Mac用户&#xff0c;并且经常处理SQLite数据库&#xff0c;那么你一定会遇到繁琐的数据库操作&#xff0c;比如安装各种复杂的软件、编写复杂的SQL语句等等。这些操作不仅费时费力&#xff0c;而且还容易出错。那么是否有一种轻松快捷的方法可以管理SQLite数据库呢…

Springboot 音乐网站管理系统idea开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot 音乐网站管理系统是一套完善的信息系统&#xff0c;结合springboot框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统 具有完整的源代码和数据库&…

口袋参谋:如何提升宝贝流量?这三种方法超实用!

​你的店铺能不能出爆款&#xff1f;提升单品流量是关键。 对于新手卖家来说&#xff0c;是缺乏运营技巧和运营经验的&#xff0c;运营技巧主要体现在标题写作、各种图片和视频制作等。 由于新手买家没有经验&#xff0c;习惯于直接使用数据包上传&#xff0c;导致宝贝没有展…

使用scipy库将离散点连续化

离散点连续化用于求满足所有离散点的对应法则F(x)且非离散集合中的值。 如有x[0,1,2,3], y[1,3,2,1],求当x1.5时对应的y是多少&#xff1f; 拟合 可以直接求出对应的函数式&#xff0c;但要求知晓经验函数 from numpy import * from scipy.signal import *# 如线性拟合经验函…

【Linux】 rm命令使用

作为一个程序员 我们经常用到rm -rf * 或者rm -rf XXX 。但是rm -rf 是什么意思不是很清楚&#xff0c;咱们一起来学习一下吧。 rm&#xff08;英文全拼&#xff1a;remove&#xff09;命令用于删除一个文件或者目录。 rm 命令 -Linux手册页 著者 由保罗鲁宾、大卫麦肯齐、理…

jira+confluence安装

准备如下所有包&#xff1a; atlassian-agent.jar jdk-8u241-linux-x64.tar.gz atlassian-confluence-8.0.0-x64.bin atlassian-jira-software-9.4.0-x64.bin mysql-8.0.31-1.el8.x86_64.rpm-bundle.tar mysql-connector-java-8.0.28.jar confluence-8.2.1破解 1.安装j…

对于java线程池ThreadPoolExecutor监控以及参数动态调整的思考

https://mp.weixin.qq.com/s/baYuX8aCwQ9PP6k7TDl2Ww Java线程池实现原理及其在美团业务中的实践 - 美团技术团队 上面两个链接都是一篇文章发布在不同地方&#xff0c;看其中一篇即可。 看到了美团技术团队的这篇文章以及加上自己对线程池的了解和看过的源码&#xff0c;有如…

app对接广告变现平台:影响app广告单价的4大因素

在移动应用开发者和媒体公司竞相寻求提高广告变现效率的今天&#xff0c;理解影响APP广告单价的关键因素至关重要。广告单价是广告收入的核心组成部分&#xff0c;它受多种因素的影响&#xff0c;直接关系到媒体的盈利能力。主要因素大概有以下几点&#xff1a;#APP广告变现# …

vue3+vite+uniapp 封装一个省市区组件

一、预览图 二、使用前的一些注意事项 只支持在 uniapp vue3 项目中使用支持微信小程序和h5 (app端没有测试过)ui库用的 uview-plus省市区数据用的是 vant-ui 提供的一个赖库 vant/area-data 三、组件代码 <template><u-popup :show"show" type"botto…

深圳市重点实验室如何办理-华夏泰科

深圳市重点实验室是为了提升科技创新的能力和水平&#xff0c;推动科技成果的转化和应用而设立的一项重要机构。同时深圳市重点实验室是开展高水平基础研究和应用基础研究、聚焦和培养优秀科技人才、开展学术交流的重要基地。认定该资质对于提升品牌影响力和科技创新能力有着重…