2021暑假一起练-使用pico扩展板编写小游戏
使用raspberry pi pico扩展板+micropython编写贪吃蛇小游戏
标签
raspberry pi pico
pico-ext
yasnake
james
更新2021-09-07
1183

大家好, 我是james, 一名hacker. 平时喜欢研究一些可编程的小东西.

1 实现功能

这回我为硬禾学堂的扩展版编写了一个贪吃蛇游戏,名字叫yasnake, yet another snake. 这个是根据很多年前我还是学生的时候用turbo c写的一个贪吃 蛇游戏改过来的, 基本算法逻辑完全一样, 我也努力用micopython提供的api来 实现borland bgi api,除了必须的语法改变(从c到micropython)其他基本上没有 变化. 这里的难点是理解micopython和python的区别, 找到更快速驱动st7789的 方法, 在屏幕上显示字符矩阵.

Fhndl3brXlURgpkA3uRa5QP2BiwR

2 设计思路
 
2.1 snake

这里的贪吃蛇游戏采用了基于方块的棋盘设计, 一个屏幕可以最多显示30x29个 方块(字符为CP437中的DARK SHADE方块, 也可以自己设计图案, 但是这里为了方 便, 直接使用了vga2 8x8), 这些方块构成了游戏的基础. 这里直接使用text相 关函数在场景的画布上直接绘制, 没有使用sprite以节省资源, 提高速度. 这些 基础设计思路完全可以用来实现其他的经典游戏, 比如俄罗斯方块, 象棋, 连连 看, 爱消除, 等棋盘游戏.

游戏使用了电磁蜂鸣器来播放游戏音乐, 可以按K1打开关闭背景音乐. 使用了旋 转编码器控制方向, 如果以前进方向为正向, 那么贪吃蛇游戏其实只需要向左或 者向右, 正好使用了旋转编码器的顺时针和逆时针方向.

2.2 thonny

thonny作为micropython的ide来说, 功能刚好够用, 还能根据uart输出简单对数 据进行绘图, 比较适合初学者, 但是对于我来说过于简单了, 另外我也不太习惯 使用thonny内置的编辑器, 所以我选择了用emacs来进行变更, 搭配ampy, rshell等命令行工具执行或者上传代码.

2.3 makefile

为了让代码编写过程更自动化, 我为这个项目编写了makefile. 直接编辑根目录 下面的main.py, 然后执行以下命令会把代码上传到板卡, 然后开始运行.

make build

还有以下命令

make reset #重启板卡
make m=app/xxx.py #试运行app/xxx.py文件
make clean #清空板卡
2.4 micropython和static typescript

对于刚刚接触micropython的初学者, 肯定想直接从网上找到一些python片段复 制粘贴进去就能运行, 但是很遗憾, 由于语言的限制, 没有办法100%直接运行, 这也是初学者的误区, 他们只是像而已, 也可以说都是对应语言的子集, 还是有 很多语言特性没有实现, 有些是硬件限制, 有些是没有意义, 有些为了效率考虑, 总之不能直接当作对应的语言.

不过micropython已经很接近cpython了, 对比typescript, 它会被转译成 typescript, 然后再编译成机器码. 值得一提的是, 据pxt的测试, static typescript执行效率要比micropython高很多, 最低支持16KB sram, 256KB flash(microbit v1), micropython并不是编译成机器码之后再下载到板卡, 所 以可能会有一些额外开销, 但是他们都能在最低能支持到 16KB/256KB. micropython更简单一些, 但是效率也稍低一些, 但是micropython 实现起来应该比pxt要简单一些.

FpnkOeNcOD3uidZTp3o3XdL1pd6M

3 环境搭建

使用micopython无需搭建环境, 直接访问使用thonny等工具即可开始编码.

4 软件实现
 
4.1 主函数

    async def process(self):
        bgm = asyncio.create_task(self.bgm_process())

        await self.opening()

        self.init_run()
        
        # main loop
        while True:
            self.dir_select()
            self.run()
            self.draw()
            self.judge()
            await self.blink()

    

这里使用了协程, 以实现两个任务同时处理的目的.

4.2 输出字符(tile)

pen_color = color_cfg.background

def outtextxy(x, y, c):
    global pen_color
    hardware.tft.text(font, c, x*8, y*8, pen_color, color_cfg.background)

def setcolor(c):
    global pen_color
    pen_color = c

    
5 硬件实现

本期没有硬件变动.

6 心得体会
  • micropython使用起来很方便, 可以很好的实现创意
  • 这个micropython扩展板整体设计很好, 可以做很多实验
  • 又是一次愉快的编程体验
7 常见问题
  • st7789 micropython c扩展

我是用的是这个st7789驱动, 这个打了patch可以在reset使用GPIO0: https://github.com/picospuch/st7789_mpy 直接下载firmware里面的uf2刷到板子上即可 https://github.com/picospuch/st7789_mpy/blob/master/firmware/RP2/upy+st7789-rp2.uf2

  • 播放背景音乐

背景音乐的开始和暂停使用了一个继承类, 原类没有暂停功能.

8 Code&Future

https://github.com/picospuch/eetree-funpack-workshop/tree/phase-pico

感谢硬禾学堂, 这个扩展板设计得很好, 作为pico入门板卡, 很多功能能够得到 验证和测试, 谢谢.

团队介绍
james
团队成员
james
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号