一、完成项目
本项目是硬禾学堂发布的“2022寒假一起在家练”活动中用树莓派RP2040的嵌入式系统学习平台完成俄罗斯方块游戏移植。
二、环境配置
1、Thonny
Thonny为官方推荐的开发环境,可使用C、C++、Micropython等语言,适合初学者快速上手,RP2040板卡自带Micropython解释器
2、硬禾学堂树莓派RP2040嵌入式系统学习平台
RP2040是硬禾学堂发布的嵌入式系统学习平台,其原理图如下
功能图如下
在此次项目中,我使用了树莓派RP2040的嵌入式系统学习平台的240*240分辨率的彩色IPS LCD,SPI接口,控制器为ST7789,使用开源代码中的st7789.py驱动LCD,四向摇杆和2个轻触按键,蜂鸣器,使用ADC和Pin读取摇杆方向键和A、B键的数据
三、流程图
四、主要代码解释
def game():
global reachtop,song
mySong = music(song, pins=[Pin(23)])
while True:
timeaxis(mySong, 400)
xValue = xAxis.read_u16()#获取摇杆纵轴位置
yValue = yAxis.read_u16()#获取摇杆横轴位置
f=4
if buttonB.value()==0:#检测是否按下B键
turn() #按B键旋转
elif xValue in range(50000, 70000):#摇杆向下
down() #加速下落
elif yValue in range(0, 10000):#摇杆y轴向左
left() #向左平移方块
elif yValue in range(50000, 70000):#摇杆y轴向右
right() #向右平移方块
else:
print("stop" )
根据mySong每次游戏刷新时读取摇杆和B键的输入,并依据输入进入函数,依据函数对方块进行变换,分别有旋转、左移、右移、加速下落四种情况,旋转是最优先的判断。
def timeaxis (mySong, time):
l = 0
time0 = time/40
while l<time0:
l+=1
mySong.tick()
sleep(0.04)
控制时间轴刷新的程序段,在刷新的时候才会读取按键,连续点击操作无效。因为板子上的输入是摇杆,方块的下落方向是由摇杆控制,而不是方向按键,摇杆相比起按键来缺少单次判定的灵敏度,如果摇杆范围正好在判定临界范围容易造成误触,多次输入方向指令,所以使用了按时间读取命令的方式。
def clear():
global score,reachtop
i = 0
c = 0
while i<16:#检测一整行是否都填满
if 0 in g[i]:
i+=1
else:
c+=1
del g[i]
g.insert(0,[0]*12)
if c>0:#凑齐一整行,可以进行消除
score+=10*(2**(c-1))#分数计算
if score >1000:#防分数溢出,设置了最大值
score=999
if 1 in g[0]:#判定方格是否进入了最上层
reachtop = True#触顶标志立起
每次方格落下时都会进行一次判定,凑齐填满的一整行是会进行消除,计算分数累加起来显示在屏幕上。如果发现方格达到了最顶端就会判断为触顶失败,进入游戏结束的界面。
def Tetris():
display.fill(0x0000)#背景
display.text(font2,"Press A", 30, 40, color=0x7e0)#主界面文字
display.text(font2,"To Start", 30, 80, color=0x7e0)
buttonValueB = buttonB.value()
while True:
buttonValueA = buttonA.value()#A键
if buttonValueA==0:
print("OK" )
g=[]
for i in range(16):#生成方格背景
g.append([0]*12)
enter()
game()#游戏函数
主界面以及按A键进入游戏。
五、后记
这次树莓派RP2040教程中讲解的游戏就是俄罗斯方块,讲师在网上讲解了一些思路,网上也有不少开源代码,经过多方学习才实现了这个成品。Micropython确实是很适合新手上手入门的语言,可以看出它不仅有Python更清晰易懂的结构与语法,而且有更加精简实用的库。在大学期间我在课堂上只学过C语言,Python也是专业实习时临时抱佛脚学习过部分,了解一些特定的功能如何实现,没能完全掌握,这次硬禾学堂的学习机会给了很大帮助,再一次锻炼了自己对于程序语言的运用,将来我还会对Python进行更加深入的学习。
这一次的活动非常有趣,寓教于乐,将来有兴趣的话我还会继续深入研究树莓派RP2040这块板子,争取实现更多功能,等到摸透全部功能之后相信我也能在自己的编程路上迈出一大步。