基于树莓派rp2040实现俄罗斯方块游戏
基于树莓派rp2040实现俄罗斯方块游戏的移植,运用Thonny进行编程,采用树莓派Pico核心芯片RP2040。
标签
树莓派
嵌入式系统
寒假在家练
hhhYY
更新2022-03-03
中央民族大学
1778

寒假在家一起练

——基于树莓派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 游戏设计思考流程FiWn7gsGFhHaf0WL-ZSIhzGviFsk

4 项目实现图片

  • 游戏开始界面

FjBhnNox_Vzvb7SRHo0defYgsk4P

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

FgDmUUBRO7850hoYpD7qJ0z0aspg

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

FoLaM3GfVJBy1EHXhhY5Y86aJKFz

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

FiJCavAVEwFGwYrSUgJC3wEtHzuZ

  • 游戏得分画面

Ftdgm8lTlpAfcfomOgWr9gIIc9l-

  • 游戏结束画面

Fn9MbAwjQpM53vL7QGXx0sQ_lQh3

 

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有了初步的认识,通过游戏的移植锻炼了我的动手能力和编程能力,对嵌入式开发有了新的体会,受益匪浅。

 

附件下载
2022hanjiahyy.rar
团队介绍
本人黄彦宇和阎倩同学组成小组交流完成此项目,均来自中央民族大学
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号