之前我用STM32+OLED+AI实现了一个贪吃蛇小游戏,具体可以看《Kimi K2.5怎么样?嵌入式应用真的强,它拯救了我在OLED上的贪食蛇小游戏》。感兴趣的朋友很多,刚好这几天不忙,再尝试一个别的游戏。
硬件还是之前的那块板子,这次准备做一个俄罗斯方块的小游戏。这个游戏对于80、90后应该不陌生,在玩具匮乏的那个年代,给我们提供了丰富的精神食粮。
实现步骤如下:
1、工程框架准备
还是做贪吃蛇时候准备的那个工程,STM32F103C8T6做主控,I2C接口的OLED驱动已经移植好,74HC165的按键检测也已经移植好。

2、提示词准备
我在贪吃蛇游戏提示词的基础上做了修改,适配俄罗斯方块游戏的规则,具体内容如下:

3、得到设计方案
我用的AI工具还是kimi code cli,内部模型已经自动更新到了k2.6,据说更强了!上面的提示词发给AI,很快就得到了设计方案:

它还问我最高分要不要断电保存!额,先不用了。
这里我提示了它一下,游戏相关的源文件和头文件,和驱动文件(IIC、HC165)放到一个路径下,方便管理。
4、开始写代码
这个游戏很简单,所以没有做什么需求分析、任务拆解。上面步骤进行完,就可以开始写代码了。
我趴着玩了会儿手机,不夸张的说,真的没有超过五分钟,它就写完了。

相关文件创建如下,英文单词tetris,就是俄罗斯方块的意思:

5、两个错误和一个惊喜
先说错误,有两个。第一个,修改main主函数的时候,少写了一个结束的花括号,导致main后面的函数全都报错。我印象里,上次写贪吃蛇好像就出过类似问题,我觉得这是个很低级的问题,但不知道为啥,出现的概率还挺高。
而且,好像在STM32的HAL库里面,出现的概率尤其高!
第二个问题:

有一些重复的定义,告诉AI后很快就改好了。
然后是惊喜,众所周知,keil MDK里面添加了新的文件路径,一般是要手动去工程选项的这个位置去添加:

但是,kimi直接帮我改好了,省去了我手动添加的步骤,操作如图:

Keil这个工具比较旧,我还担心kimi改不了,没想到如此丝滑。必须要赞一下!
6、玩游戏
接下来,跟我一起玩游戏吧!


还有动图:

支持左右移动、变形,下面还有虚影预显示摆放结果,向下按还能加速落下,啧啧啧!
最后,关于这个俄罗斯方块,有两个技术点我觉得值得一提:
a、GRAM显存缓冲
它没有在每次画点的时候直接操作OLED,而是先在内存里维护了一个1024字节的缓冲区(8页*128列)。所有绘制完成后,按页通过HAL_I2C_Mem_Write一次性发送128字节。这样每帧只需要8次大数据传输,而不是1024次单字节事务。在100kHz的I2C速率下,勉强能做到8fps左右,玩俄罗斯方块够用了。
如果改为DMA方式传输,速度能更快,但是当前应用够了!
b、踢墙
旋转的时候如果碰壁,它会尝试左右偏移1格或2格。这个功能虽然简单,但大大提高了操作手感,不然贴着墙的时候根本转不了。
总之,这次体验比上次写贪食蛇感觉还要好。一方面是模型确实进步了,另一方面是我自己也学乖了:先规划、再确认、然后一步一步来,不急着催它。
最后的最后,我把完整的对话记录导出了一份MD文档,放在工程根目录下。如果后面想查某个功能的实现细节,随时翻出来看。
有兴趣的同学,也可以自己动手试试。俄罗斯方块这种东西,看着复杂,其实逻辑挺清晰的。有AI帮忙,真的省不少事。
打完收工!