大家好, 我是james, 一名hacker. 平时喜欢研究一些可编程的小东西.
这回我为硬禾学堂的扩展版编写了一个贪吃蛇游戏,名字叫yasnake, yet another snake. 这个是根据很多年前我还是学生的时候用turbo c写的一个贪吃 蛇游戏改过来的, 基本算法逻辑完全一样, 我也努力用micopython提供的api来 实现borland bgi api,除了必须的语法改变(从c到micropython)其他基本上没有 变化. 这里的难点是理解micopython和python的区别, 找到更快速驱动st7789的 方法, 在屏幕上显示字符矩阵.
这里的贪吃蛇游戏采用了基于方块的棋盘设计, 一个屏幕可以最多显示30x29个 方块(字符为CP437中的DARK SHADE方块, 也可以自己设计图案, 但是这里为了方 便, 直接使用了vga2 8x8), 这些方块构成了游戏的基础. 这里直接使用text相 关函数在场景的画布上直接绘制, 没有使用sprite以节省资源, 提高速度. 这些 基础设计思路完全可以用来实现其他的经典游戏, 比如俄罗斯方块, 象棋, 连连 看, 爱消除, 等棋盘游戏.
游戏使用了电磁蜂鸣器来播放游戏音乐, 可以按K1打开关闭背景音乐. 使用了旋 转编码器控制方向, 如果以前进方向为正向, 那么贪吃蛇游戏其实只需要向左或 者向右, 正好使用了旋转编码器的顺时针和逆时针方向.
thonny作为micropython的ide来说, 功能刚好够用, 还能根据uart输出简单对数 据进行绘图, 比较适合初学者, 但是对于我来说过于简单了, 另外我也不太习惯 使用thonny内置的编辑器, 所以我选择了用emacs来进行变更, 搭配ampy, rshell等命令行工具执行或者上传代码.
为了让代码编写过程更自动化, 我为这个项目编写了makefile. 直接编辑根目录 下面的main.py, 然后执行以下命令会把代码上传到板卡, 然后开始运行.
make build
还有以下命令
make reset #重启板卡 make m=app/xxx.py #试运行app/xxx.py文件 make clean #清空板卡
对于刚刚接触micropython的初学者, 肯定想直接从网上找到一些python片段复 制粘贴进去就能运行, 但是很遗憾, 由于语言的限制, 没有办法100%直接运行, 这也是初学者的误区, 他们只是像而已, 也可以说都是对应语言的子集, 还是有 很多语言特性没有实现, 有些是硬件限制, 有些是没有意义, 有些为了效率考虑, 总之不能直接当作对应的语言.
不过micropython已经很接近cpython了, 对比typescript, 它会被转译成 typescript, 然后再编译成机器码. 值得一提的是, 据pxt的测试, static typescript执行效率要比micropython高很多, 最低支持16KB sram, 256KB flash(microbit v1), micropython并不是编译成机器码之后再下载到板卡, 所 以可能会有一些额外开销, 但是他们都能在最低能支持到 16KB/256KB. micropython更简单一些, 但是效率也稍低一些, 但是micropython 实现起来应该比pxt要简单一些.
使用micopython无需搭建环境, 直接访问使用thonny等工具即可开始编码.
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()
这里使用了协程, 以实现两个任务同时处理的目的.
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
本期没有硬件变动.
- micropython使用起来很方便, 可以很好的实现创意
- 这个micropython扩展板整体设计很好, 可以做很多实验
- 又是一次愉快的编程体验
- 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
- 播放背景音乐
背景音乐的开始和暂停使用了一个继承类, 原类没有暂停功能.
https://github.com/picospuch/eetree-funpack-workshop/tree/phase-pico
感谢硬禾学堂, 这个扩展板设计得很好, 作为pico入门板卡, 很多功能能够得到 验证和测试, 谢谢.