树莓派RP2040 GAME Kit教程

——基于树莓派RP2040实现俄罗斯方块游戏

1 项目需求
按下按键A后开始游戏
随机出现不同形状的俄罗斯方块,以一定初始速度下落
按下按键B后实现俄罗斯方块的旋转
通过遥杆控制俄罗斯方块的左右移动
俄罗斯方块落地后,方块每填满x行则所填满的x行方块消除(x>=1);消除后,消除行上所有方块整体下降x格,得50*x分
若俄罗斯方块堆积至屏幕最上端,则游戏结束,自动回到原游戏开始页面
设置游戏bgm

2 简单软硬件介绍
采用树莓派Pico核心芯片RP2040:双核Arm Cortex M0+内核,可以运行到133MHz;拥有264KB内存;性能强大、高度灵活的可编程IO可用于高速数字接口。
板上功能:240*240分辨率的彩色IPS LCD,SPI接口,控制器为ST7789;四向摇杆 + 2个轻触按键 + 一个三轴姿态传感器MMA7660用做输入控制;一个蜂鸣器;双排16Pin连接器,有SPI、I2C以及2路模拟信号输入;可以使用MicroPython、C、C++编程;USB Type C连接器用于供电、程序下载。
运用Thonny进行编程。

3 游戏设计思考流程

4 项目实现图片
游戏开始界面

操作摇杆使俄罗斯方块向左移动

操作摇杆使俄罗斯方块向右移动

按下按键B使俄罗斯方块旋转

游戏得分画面

游戏结束画面

5 代码解释
绘制不同类型的俄罗斯方块
boxo=[[1,1],[1,1]]
boxz_1=[[1,1,0],[0,1,1],[0,0,0]]
boxz_2=[[0,1,1],[1,1,0],[0,0,0]]
box7_1=[[1,1,0],[0,1,0],[0,1,0]]
box7_2=[[0,1,1],[0,1,0],[0,1,0]]
boxt=[[0,1,0],[1,1,1],[0,0,0]]
boxi=[[0,0,0,0,0],[0,0,0,0,0],[1,1,1,1,0],[0,0,0,0,0],[0,0,0,0,0]]
boxes=[boxo,boxz_1,boxz_2,box7_1,box7_2,boxt,boxi]
color=[0xFFE0,0x867f,0x7ef,0xfb08]
实现方块的掉落,若方块下面没有其余方块,则方块下落;若方块与其余方块相叠,则方块停止下落
def autodown():
    global box_row,box_column,box,box_id
    leave()
    box_row+=1
    if checkvalid()==False:
        box_row-=1
        enter()
        clear()
        
        box=newbox()
        box_column=4
        box_row=0
        
    enter()
操作摇杆往不同方向以实现方块的左右移动、旋转和下落
 if buttonB.value()==0:
            up()
            print("up")
        elif yValue >40000:
            right()
            print("right")
        elif yValue <1000:
            left()
            print("left")
        elif xValue >40000:
            down()
            print("down")
        else:
            print("stop")
        drawbox()
方块旋转、向左移动、向右移动、下落
def up():
    leave()
    clockwise()
    if checkvalid()==False:
        counter_clockwise()
        
    enter()
    
def down():
    global box_row
    leave()
    box_row+=1
    if checkvalid()==False:
        box_row-=1
    enter()

def left():
    global box_column
    leave()
    box_column-=1
    if checkvalid()==False:
        box_column-=1
    enter()

def right():
    global box_column
    leave()
    box_column+=1
    if checkvalid()==False:
        box_column-=1
    enter()
游戏重新开始的循环
def restart():
    display.fill(0x0000)
    display.fill_rect(4,0,4,240,0x07FFF)
    display.fill_rect(227,0,4,240,0x077FF)
    display.text(font2,"muc hyy",30,10,color=0x4416)
    display.text(font2,"A to start",30,130,color=0x7e0)
    display.text(font2,"Tetris",70,60,color=0x471a)
    buttonValueB=buttonB.value()
    while True:
        buttonValueA=buttonA.value()
        if buttonValueA==0:
            print("OK")
            g=[]
            for i in range(16):
                g.append([0]*12)
            enter()
            game()
restart()
6 项目总结
通过本次项目,我对python有了初步的认识,通过游戏的移植锻炼了我的动手能力和编程能力,对嵌入式开发有了新的体会,受益匪浅。

电路图