# 51单片机俄罗斯方块
## 一、设计主题
- 俄罗斯方块
## 二、实现功能
- 红外遥控操作发送信息(开始游戏与方块移动)。
- LED矩阵接受信息操作俄罗斯方块。
- 串口通信向电脑发送相关信息(开始信息、分数与结束信息)。
## 三、具体流程
首先在打开单片机0.5秒之后电脑串口会显示
> welcome to play Tetris!
> Press Power_Key to start.
如果按POWER键则开始游戏,4与6分别是左移与右移,2为旋转,5为加速下降。游戏期间消除方块电脑会不断显示分数,如
> Your score is 010.
> Your score is 020.
如果游戏结束电脑则电脑显示
> Game over!!!
> Press Power_key to repaly.
按POWER键则会重新开始游戏。
## 四、具体思路
![](https://raw.githubusercontent.com/KaguraChen/51MCU_Tetris/main/Relation.png)
如上图继承关系对Tetris进行封装,对外只留一个Tetris_Run()接口,其他功能则由内部函数实现。
以下是相应函数代码的实现思路,请结合具体代码查看:
### 1. 全局变量
为了保存LED矩阵的状态需要开辟一个8*8的数组LED_buf,还要开辟一个7*2*4的数组Shape用来保存七种俄罗斯方块的形状,同时还要有变量保存下落方块的位置、方向、类型、形状等。其他的还有Score, Random, Start等。
### 2. Tetris_Run()
主循环。
首先进行相关初始化,然后利用串口[ 定时器1]向电脑发送相关信息,最后进入主循环不断接收与处理红外信号[ 定时器0]。
### 3. Timer2_Routine()
随机数生成与LED矩阵刷新[ 定时器2]。
++Random以生成伪随机数,不断调用MatrixLED_Loop()刷新LED矩阵,同时处理方块下落与清除逻辑。
### 4. Set_Block()
在指定位置设置一个俄罗斯方块。
运用for循环直接点亮。
### 5. Block_Move()
向指定方向移动方块。
首先运用for循环将当前位置方块清除,然后再从下一位置进行点亮。
### 6. End_Check()
判断是否游戏结束。
运用for循环判断新生成的方块是否碰到了原来的方块,如果碰到则游戏结束,同时通过串口向电脑发出相关信息。
### 7. Generate_New_Block()
生成一个随机的新方块。
运用Random生成随机方块并调用End_Check()判断是否游戏结束,然后再调用Set_Block()设置方块。
### 8. Move_Check()
判断是否在指定方向可以移动。
首先将下落方块清除,然后再判断向指定方向移动后是否会越界或是碰到其他方块,然后再点亮下落方块。
### 9. Row_Check()
判断行是否已满。
通过for循环判断。
### 10. Check_Clear()
检查并且清除俄罗斯方块。
运用for循环从下到上判断并且清除已满的行,如果有清除的话Score增加10分并且通过串口向电脑发送。
### 11. Block_Rotate()
方块旋转。
通过一个临时数组保存旋转后的位置信息,然后再进行越界和碰撞判断,与Move_Check()类似。
### 12. Block_Land()
方块加速下落。
通过一个while循环进行加速。