打印
[单片机资料]

使用WS2812拼板开发游戏(三)——独立钻石

[复制链接]
513|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tobot|  楼主 | 2022-5-17 23:19 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
在开始前照例感谢21ic,另外啰嗦两句,虽然我提出申请的时候说的是用多块WS2812拼板开发游戏,但到本篇为止,依然在玩单板,还没有开始拼板,只能说继续努力吧……
独立钻石(Solitaire)又称为单身贵族棋,是一个单人玩的棋类游戏,估计用它来练手写算法的人也不少。为了保证后面的内容大家都看得明白,再简单介绍一下:棋盘是一个33孔的底座,每个孔上最多可以放置一颗棋子,初始的时候只留下棋盘最中心的一个孔,其余放满棋子;玩的时候选取一颗棋子在横向或者纵向上(不能依斜线)的方向跳过一颗棋子,放置在空位上(只允许越过一颗棋子),被跳过的棋移除;如此一直玩下去,使剩下来的棋子越少越好,如下图。
由于棋盘非常简单,定义四种颜色分别表示棋盘的状态:不亮表示棋盘不存在的区域,棕色表示棋盘上没有安放棋子的空闲区域,绿色表示棋盘上已放置棋子的位置,橙色表示即将选取的棋子和行动路径,紫色表示正在当前选择中棋子和路径。
由于最大范围是7*7,因此使用一块WS2812B就能实现,上电后的初始状态如下:
在这个项目中,用于点亮WS2812B板的MCU板是N32G457VL开发板,使用了SPI接口(PA7)用于输出点灯信号,从供电5V处直接取VccGND
另外N32G457VL开发板上自带了三个自定义按键,分别连接MCUPA4~PA6,按下后可以拉低电平,在项目里用于调整选择(select)、确认(confirm)、执行(execute)。
为了便于理解和计算,在下面的描述和程序的编写中都将棋盘上可以摆放棋子的位置用两位数表示,十位表示行,个位表示列。上电后,首先按下“执行”,发现24号灯变成紫色,表示可以选定该棋子。
这时如果按下“选择”,会发现42号灯变成紫色,24号灯恢复绿色,表示当前可以选择42号位置的棋子。
如果这时按下“确认”,42号灯变成橙色,4344号灯变成紫色,表示已经选定了42号位的棋子,预选的路径为经过43号位,跳向44号位。
这时按下“选择”无效,只能按下“确认”,表示选定的棋子只用唯一的路径可用,需要确认此路径。此时424344号灯均为紫色。
确认后,按下“执行”,42号和43号灯变成棕色,44号灯变成绿色,23号灯变成紫色。表示已经执行完成,系统自动选择下一个可以移动的棋子为23号。
这时可以通过“选择”调整和更换下一步行动的棋子,可选择棋子包括23号、45号,63号。如此类推,直至无法行动,计算出步数和剩余棋子数量。
为了记录操作步骤,在开发板的usb接口看到每次操作。
这个代码本身没有什么特别好介绍的,就是大量的循环和判断:
首先是选定棋子,灯为绿色状态,个位或者十位+1或者-1为绿色状态,且同方向+2或者-2棕色或者紫色状态,表示可以选取该棋子;每按一次选取从当前数循环递增寻找下一个可选棋子,超过最大数后如果仍然没有可选棋子,从第一个位置开始尝试。
按下“确认”,根据选定棋子寻找路径,方法同上;“确认”后,目的位置仍然可以继续有下一跳,则继续寻找路径。
“执行”只执行确认后的路径,即除了最后一个棋子位置变为绿色外,路径上的全部位置变成棕色,同时步数+1
如此循环,直至无法选取。
PS:我准备下一步把usb接口输入做进来,通过上位机选择棋子和路径,实现自动下棋功能。

使用特权

评论回复

相关帖子

沙发
起点116| | 2023-2-23 21:38 | 只看该作者
厉害

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

44

主题

3834

帖子

7

粉丝