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

文章目录

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


一、功能简介

本项目使用STM32F103C8T6单片机控制器,IIC OLED液晶、按键等。

主要功能:
系统运行后,OLED显示开机界面,按下K1键进入游戏。K1键控制翻转,K2控制下,K3控制左移,K4控制右移。


二、软件设计

/*
作者:嗨小易(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; //读取keycodegkey_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.mzph.cn/news/578108.shtml

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

相关文章

中继器,路由器,交换机,网关,网桥的作用及功能

中继器&#xff08;RP repeater&#xff09;是连接网络线路的一种装置&#xff0c;常用于两个网络节点之间物理信号的双向转发工作 中继器是最简单的网络互联设备&#xff0c;主要完成物理层的功能&#xff0c;负责在两个节点的物理层上按位传递信息&#xff0c;完成信号的复制…

【运维不走弯路】最简单的k8s集群搭建(基于ubuntu22.04 cloud-img)

配置详情 节点k8sdockercontainerdmasterv1.26.024.0.61.6.22node1v1.26.024.0.61.6.22node2v1.26.024.0.61.6.22node3v1.26.024.0.61.6.22 所有节点操作 替换系统源 cat <<EOF > /etc/apt/sources.list # 默认注释了源码镜像以提高 apt update 速度&#xff0c;如…

【Windows编程】期末复习题2

系列文章目录 期末复习题1 文章目录 系列文章目录解释下列名词的含义&#xff1f;设备环境&#xff08;描述表&#xff09;保存了哪些信息&#xff1f;有什么作用&#xff1f;模态对话框与非模态对话框有什么区别&#xff1f;在程序设计中&#xff0c;经常要用到线程&#xff…

关于OpenCV中 CV_Assert() 的使用引起程序中止/崩溃问题

CV_Assert() 的作用是&#xff1a;若括号中的表达式值为 false &#xff0c;则返回一个错误信息&#xff0c;并终止程序执行。 但是 CV_Assert() 与 assert 不同&#xff0c;CV_Assert() 会通过异常抛出&#xff0c;所以如果使用 CV_Assert()&#xff0c;可以通过捕获异常而不是…

神经网络介绍

目录 知识点介绍 知识点介绍 前馈神经网络&#xff1a;&#xff08;前馈网络的数据只向一个方向传播&#xff09; RNN循环神经网络&#xff0c;下图中多个 RNN 层都是“同一个层”&#xff0c;这一点与之前的神经网络是不一样的。

算法训练day49|动态规划part10

121. 买卖股票的最佳时机 参考文章&#xff1a;代码随想录 贪心 因为股票就买卖一次&#xff0c;那么贪心的想法很自然就是取最左最小值&#xff0c;取最右最大值&#xff0c;那么得到的差值就是最大利润。 本次重点学习动态规划方法 1. dp数组&#xff08;dp table&#x…

JavaScript基础知识点总结:从零开始学习JavaScript(二)

如果大家感感兴趣也可以去看&#xff1a; &#x1f389;博客主页&#xff1a;阿猫的故乡 &#x1f389;系列专栏&#xff1a;JavaScript专题栏 &#x1f389;ajax专栏&#xff1a;ajax知识点 &#x1f389;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 学习…

智能优化算法应用:基于驾驶训练算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于驾驶训练算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于驾驶训练算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.驾驶训练算法4.实验参数设定5.算法结果6.…

Springboot整合MVC进阶篇

一、概述 1.1SpringBoot整合SpringMVC配置 SpringBoot对SpringMVC的配置主要包括以下几个方面&#xff1a; 自动配置&#xff1a;SpringBoot会自动配置一个嵌入式的Servlet容器&#xff08;如Tomcat&#xff09;&#xff0c;并为我们提供默认的SpringMVC配置。这样我们无需手动…

深圳锐科达SIP矿用电话模块SV-2801VP

深圳锐科达SIP矿用电话模块SV-2801VP 一、简介 SV-2800VP系列模块是我司设计研发的一款用于井下的矿用IP音频传输模块&#xff0c;可用此模块打造一套低延迟、高效率、高灵活和多扩展的IP矿用广播对讲系统&#xff0c;亦可对传统煤矿电话系统加装此模块&#xff0c;进行智能化…

【.NET Core】反射(Reflection)详解(三)

【.NET Core】反射&#xff08;Reflection&#xff09;详解&#xff08;三&#xff09; 文章目录 【.NET Core】反射&#xff08;Reflection&#xff09;详解&#xff08;三&#xff09;一、概述二、ConstructorInfo类2.1 ConstructorInfo.MemberType 属性2.2 ConstructorInfo.…

基于5G智能网关的智慧塔吊监测方案

塔吊是建筑施工中必不可少的设施&#xff0c;由于塔吊工作重心高、起重载荷大、人工视距/视角受限等因素&#xff0c;也使得塔吊在工作过程中着较多的危险因素。对此&#xff0c;可以部署基于工业5G智能网关搭建智慧塔吊安全监测系统&#xff0c;实现对塔吊运行的全局精细监测感…

TP-Link路由器桥接设置

本文介绍了TP-Link路由器无线桥接设置方法&#xff1b;无线桥接指的就是通过无线的方式&#xff0c;把两台(多台)无线路由器连接起来&#xff0c;进行桥接的几台路由器中&#xff0c;只要有一台可以上网&#xff0c;剩下的也就可以上网了&#xff1b;主要作用是用来扩大无线WiF…

【STM32单片机】电子木鱼设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用STM32F103/F407单片机控制器&#xff0c;TFTLCD触摸屏、蜂鸣器等。 主要功能&#xff1a; 系统运行后&#xff0c;TFTLCD显示画面&#xff0c;可触摸木鱼区域&#xff0c;功德计数加1&#xf…

漏刻有时数据可视化Echarts组件开发(46)散点图颜色判断

series组件 series: [{name: Top 5,type: scatter,coordinateSystem: bmap,data: convertData(data.sort(function (a, b) {return b.value - a.value;}).slice(0, 6)),symbolSize: 20,encode: {value: 2},showEffectOn: render,rippleEffect: {brushType: stroke},label: {fo…

分布式系统架构设计之分布式通信机制

二、分布式通信机制&#xff1a;保障系统正常运行基石 在分布式系统中&#xff0c;各个组件之间的通信是保障系统正常运行的基石&#xff0c;直接影响到系统的性能、可扩展性以及整体的可维护性。接下来我们就一起看看通信在分布式系统中的重要性&#xff0c;以及一些常用的技…

Java---IO流讲解(2)

文章目录 1. 字符流1.1 为什么出现字符流1.2 字符流写数据的5种方式1.3 字符流读数据的两种方式1.4 字符缓冲流1.5 字符缓冲流特有功能 2. IO流小结2.1 字节流2.2 字符流 1. 字符流 1.1 为什么出现字符流 由于字节流操作中文时不是特别方便&#xff0c;因此Java提供了字符流。…

SpringBoot - Maven 打包合并一个胖 JAR 以及主项目 JAR 依赖 JAR 分离打包解决方案

问题描述 <plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.1.18.RELEASE</version><configuration><!--<classifier>exec</classifier>--…

JS常用HOOK调试技术

hook技术 Hook 是一种钩子技术&#xff0c;在系统没有调用函数之前&#xff0c;钩子程序就先得到控制权&#xff0c;这时钩子函数既可以加工处理&#xff08;改变&#xff09;该函数的执行行为&#xff0c;也可以强制结束消息的传递。简单来说&#xff0c;修改原有的 JS 代码就…

网络安全保障流程

需求定义 满足法规合规、业务需求、风险评估 信息系统保护轮廓ISPP-----标准化安全保障需求文档----从用户角度规范化、机构化 需要包括&#xff1a;系统描述、安全环境、保障目的、安全保障要求、应用注解、符合性声明7部分 规划设计 考虑业务功能和价值&#xff0c;哪些风险…