【DigiKey创意大赛】“九子贤棋”游戏机 项目总结
[复制链接]
作品:“九子贤棋”游戏机
作者:nemon
一、作品简介(100-200字)
最近了解到,有一些少数民族棋类游戏,濒于失传,再不抢救一下,就得从民族文化遗产变成传说了。于是基于Maix Bit(K210)做了一个用于“九子贤棋”的游戏机。
“九子贤棋”又名LuckyStar,是中国西部的一种在五角星形棋盘上玩的益智游戏。
游戏开始时在五角星形棋盘的每个直线交叉点各放一枚棋子,然后按玩家意愿,移除一个棋子。之后,玩家可以像跳棋那样,移动一颗棋子到空白的位置,同时可以移除移动过程中跳过的棋子。移动棋子必须沿着直线,一次必须跳过一枚棋子,且只能跳过一枚棋子。当按前述规则无法移动任何棋子时,游戏结束。如果游戏结束时,棋盘上只剩下一枚棋子,则玩家获胜。
用户可以通过“九子贤棋”游戏机试玩,在玩的过程中熟悉游戏规则,如果不知道怎么走,还可以使用提示功能获得行棋指导。
输入和控制用Grove-Dual-Button实现——一个按钮调整焦点位置,一个按钮按下去触发功能。
主控用Maix Bit套件。这个套件除了K210核心板及板载外设,还附有一个LCD屏和一个摄像头。核心板MCU是嘉楠堪智科技的边缘智能计算芯片K210(RISC-V架构 64位双核,带浮点运算)通过24PIN DVP摄像头接口和24PIN LCD接口与配套的外设连接。既支持MicroPython 语言开发,也提供C 语言 SDK。
二、系统框图
1、外设模块关系
MCU与摄像头、LCD分别通过24PIN DVP摄像头接口和24PIN LCD接口连接,Grove-Dual-Button与板子的1、2、5、6pin相连。
2、软件逻辑关系
把界面操作、控制逻辑、数据和行棋逻辑分开到不同的过程里,再通过类包装,把模块运行和功能分到不同的类中。
三、各部分功能说明(图文结合)
1、按钮
从模块电路图可以看出,按钮按下时,为低电平。因此应该用下降沿作为中断。
2、重置和行棋
(1)重置操作实际就是把棋局数据初始化。
(2)行棋操作,需要结合按钮中断来进行:绿色按钮用来移动焦点、红色按钮表示在当前焦点进行操作。那么在下棋的时候分为4种情况:
I.第1个棋子,就只有从棋盘去除一种操作
II.如果在一颗棋子上操作,要看是否已经持有棋子。如果没持有,那么当前棋子作为持有棋子,否则将持有的棋子放下。
III.如果在空白的交叉点操作,也要看是否已经持有棋子。如果没持有,那么不做任何事;否则检查持有的棋子是否可以这么走,如果可以持有的棋子放下,取走他路过的棋子,如果不合法就把持有的棋子放回原位置。
3、对战
对战这个事开始想的比较复杂,总觉得得加个线、弄个联网之类的。后来玩起来才发现,这个是单人游戏,不需要实时连接,那么就简单了,只要在每个游戏机上增加计时功能就可以了。
计时我用的是utime包,能统计到毫秒,主要用了3个方法:
(1)t1=utime.ticks_ms() 可以获取精确的毫秒数。
(2)di=utime.ticks_diff(t1, t0) 可以计算 t1-t0 的毫秒数
(3)utime.localtime(int(di/1000))可以把秒换算成“(年,月,日,小时,分钟,秒,工作日,晚期)”格式的的元祖,注意这个元组的起点是2000年1月1日,所以要减掉才能用。
4、行棋助手
助手这个功能,上一篇帖子讲过了用solution来实现,放到MaixBIt上,要解决的就只剩显示了。solution返回的是一个list,里面每一项是格式为“(棋子号,起点,终点)”的元组。因此只要提取出第0项,用“ 'move piece %d from %d to %d'%(tmp_soution[0]) ”生成字符串就可以了。
这里好像有个问题,就是如果对战时,用了“Get TIP”功能,是不是不公平?答案肯定是否定的——虽然K210能跑起来深度优先搜索,但是要用户要花好几秒盯着'WAIT PLEASE'才能看到答案。这就像跨栏比赛,你一路踹倒栏也不犯规,时间依然有效,因为踹栏花的时间代价远大于跨过去。运行起来效果是这样的(现在的建议是把位置7上的棋子移动到0,也就是最上面空出的五角星的尖):
5、OneApp
这个本来是按非抢先的应用框架设计的,但是到了后期发现现有的功能在一个界面里基本能够实现,所以在这个项目里没有发挥什么作用。也许后面增加别的游戏的时候可以用起来。
整体思路有点像arduino,就是把每个应用分成setup、loop两个阶段,但是因为有界面,所以增加了一个repaint的部分。
通过每次调用子应用loop获取该应用当前的状态来决定是否阻塞。其他的就都很好理解了,直接看代码吧。
四、作品源码
下载地址 : https://download.eeworld.com.cn/detail/nemon/630781
7百多行也不很长,不好理解的部分都加了密集的注释,还留有很多调试代码,刚好方便各位同学验证。
五、作品功能演示视频
六、项目总结
先列一下杂七杂八的项目贴。
1、MAIX BIT KIT开箱
2、MAIX BIT KIT上手流水账
3、MAIX BIT KIT上的简单应用
4、MAIX BIT KIT上的“九子贤棋”
5、MAIX BIT KIT 的按键处理
6、MAIX BIT KIT上“九子贤棋”的核心逻辑
7、增加计时和获取提示
感谢比赛组委会给了我一次熟悉和联系MaixBit这个强大套件的机会,我在做这个项目过程中大量使用了Maixpy IDE,也对Maixpy这一micropython的sipeed发行版的多个库的功能有了深入的认识,复习了深度搜索算法。虽然项目进行的踉踉跄跄,还是终于完成了所有设计功能。以后有时间准备重构一下代码,再增加一些功能、美化一下。
七、其他
在此感谢主办方和工作人员以及各位群友!
附:word版
补充内容 (2024-1-14 22:01): 视频在沙发层
|