之前朋友推荐了一款拼图,可以拼出来某一天的日期、月份与星期数.
一般的拼图只有一个拼法,拼完了之后,也就结束了.
这个拼图就有点意思了,想着可以每天拼一个出来,打卡一下,就买了一个.
这个拼图看着是有点难,实际上是一点也不简单.
别说拼出来正确的日期了,就是完整的把9个模块拼进去,不论结果正确与否,也是老费劲了.
在尝试了一段时间后,拼不出就是拼不出,天赋上差点意思.
之后那是越想越气,吃嘛嘛不香,实在不行就只能走邪道了,我自己拼不出来,我写代码还不行吗?
以下就开始剧透了,想自己玩的,就稍后再看吧:
- 第一步,画出基础的拼图内容
我们先设计一下整个拼图,需要用一个二维数组来代表拼图中的每一个元素
[
"000000",
"000000",
"000000",
"000000",
"000000",
"000000",
"000000",
"000000",
"000000"
]
这里就偷懒了一下,数组里面用的是字符串,每个拼图格子的内容用0和1表示,1为此格子有内容,0则反之. 上面这个就是个空的拼图容器.
- 第二步,画出每个模块
[
"111110",
"010000",
"000000",
"000000",
"000000",
"000000",
"000000",
"000000",
"000000"
]
取一个模块出来,放到容器里,大概就是这么个内容.
这里就有两个重点:
1.每个模块有4个方向
2.每个模块有正反2个面
所以每个模块都有8种不同的形式.
这个说起来是有点抽象的,可以找一张纸,撕成上面这个模块的形状,自己比划一下就理解了.
- 第三步,根据不同模块,生成可放入容器的所有位置
这里就放了一部分代码,按行与列进行循环,生成具体的代码:
[
"111110",
"010000",
"000000",
"000000",
"000000",
"000000",
"000000",
"000000",
"000000"
],
[
"011111",
"001000",
"000000",
"000000",
"000000",
"000000",
"000000",
"000000",
"000000"
],
[
"000000",
"111110",
"010000",
"000000",
"000000",
"000000",
"000000",
"000000",
"000000"
],
[
"000000",
"011111",
"001000",
"000000",
"000000",
"000000",
"000000",
"000000",
"000000"
]
不同模块8种形式经过生成处理后,会有上百种放入容器的形式.
- 第四步,拼图行为
这里需要单独的处理下两个行为:
1.模块放入容器时的融合行为
[
"111110",
"010000",
"000000",
"000000",
"000000",
"000000",
"000000",
"000000",
"000000"
],
[
"000000",
"100000",
"111100",
"000000",
"000000",
"000000",
"000000",
"000000",
"000000"
],
[
"111110",
"110000",
"111100",
"000000",
"000000",
"000000",
"000000",
"000000",
"000000"
]
2.模块放不进容器时的判断行为
[
"111110",
"010000",
"000000",
"000000",
"000000",
"000000",
"000000",
"000000",
"000000"
],
[
"100000",
"111100",
"000000",
"000000",
"000000",
"000000",
"000000",
"000000",
"000000"
]
当想要往容器中放入模块时,发现有任意位置的数字有冲突,即为无法放入.
这个判断逻辑非常的重要,我们实际的拼图操作,就是依赖此逻辑.
- 第五步,反复尝试,直至拼图完成
当我们完成以上步骤之后,实际已经完成了80%的内容,后面只需要根据常规的拼图思路,完成剩余的部分.
梳理一下拼图的流程:
1.确定目标日期的拼图位置,如2025-01-06:
[
"100000",
"000000",
"000001",
"000000",
"000000",
"000000",
"000000",
"000100",
"000000"
]
2.放入一个模块
[
"000000",
"000000",
"000000",
"010000",
"011111",
"000000",
"000000",
"000000",
"000000"
]
放完之后的容器:
[
"100000",
"000000",
"000001",
"010000",
"011111",
"000000",
"000000",
"000100",
"000000"
]
3.重复上述步骤,直至把所有模块全部放入容器
以上只是一个粗略的步骤,实际上在放入模块时,需要进行的操作:
根据容器中现有的内容,排除掉冲突的模块,选择其一,再放入容器中
当放入了几个模块时,已填满了容器,无法再放入其他模块,但还有剩余的模块,那么就需要对已经放入的容器的模块进行调整,选择其模块的不同位置再次进行尝试:
至此,某一个日期的拼图就完成啦!