这个奇异推格子和普通的推格子游戏的区别在于2点:
1. 有些格子是连在一起的家具块。这些家具块如果连在一起(没有裂缝),则被推一个会整个被推。
2. 格子有可能破裂。如果它的形变承受力较弱的话。这很好理解,就是指我们推一个塑料到一个墙上,塑料有可能就扁了。
事先声明:
想过很多自然界的模型,但与推格子的抽象程序不符合。
1,2两点是模拟了我们推箱子中的两个自然情况:一是黏着的东西整体被推。二是东西也有可能被推碎了。只需要实现这两种情况即可,其他元素仍然是非常抽象的推箱子。
算法示意
奇异推箱子是支持同时推的,如上图所示,我用一个力同时往右推了1和2。
【总力是否能够成功发出】=【1的力成功发出】&【2的力成功发出】
这里的推的是零散的箱子,所以不需要考虑到家具块的分解。
但如果其中有n个箱子是隶属于家具块的,如下图所示:
那么有两种情况,
A.1箱子与家具块之间本身就有缝隙了(被切了的话),不变。仍然当做【1的力成功发出,1是发力源头】
B.1箱子与家具块直接本身没有缝隙,紧密缠绕的话,那么整一个家具就作为发力源头。也就是【1的力成功发出】要变成【黄色大家具的移动成功发出】。
如果是上图的情况则为:
【总力是否能够成功发出】=【黄色大家具的力成功发出】&【2的力成功发出】
【XX的力成功发出】
如果右侧无格子:
家具的移动成功发出=无条件,直接成功发出。
如果右侧有格子:
家具的移动成功发出=【右侧(推力对象侧)的单位力的成功发出】
【右侧(推力对象侧)的单位力的成功发出】:
如果右侧的单位是格子,则【成功发出】表示【格子的右侧格子成功发出】(递归出去。)
如果右侧的单位是家具块,则【成功发出】表示【家具块所有的右侧不是自己的格子成功发出】(多个递归出去)
如果右侧的单位的【重力】很重,无法成功发出,则结果为【右侧(推力对象侧)的单位力未能成功发出】并返回。
*如果这么递归下去,突然又遇到了自己递归链上的一个箱子作为下一个格子的话,则默认都是【成功发出】,如下图所示中的5.7
【XX的力未能成功发出】
沿着递归线路返回:
如果收到【未能成功发出】的是家具块,如图中5号:
#这里有切断力的情况,但暂不处理
判断家具块中的所有递归链上的发力源格子(家具块所有的右侧不是自己的格子都会产生一条递归链):
1. 判断自己是否可以破裂,如果满足破裂条件,则自己的状态为【待碎】,则结果为【成功发出。】
2. 如果自己不可以破裂,则结果为【未能成功发出】。
只要有一个发力源格子返回【未能成功发出】,那么整个家具块就以【本家具块未能成功发出】返回。
如果收到【未能成功发出】的是普通箱子,如图中4号:
1. 判断自己是否可以破裂,如果满足破裂条件,则自己的状态为【待碎】,返回【成功发出。】
2. 如果自己不可以破裂,则返回【未能成功发出】。
【结果】
当递归回到了
【总力是否能够成功发出】=【黄色大家具的力成功发出】&【2的力成功发出】
源头时,如果满足条件,则
1. 【待碎】的格子碎裂。
2. 所有递归线路上返回过【成功发出的格子】均右移。
如果任意条件不满足,则发力失败。
重力
一个单位都具有一个重力。
重力在这里是个外部数字,只和1个东西有关:
1. 如果有极大重力的话,单位会变成【阻力】。也就是让箱子的推力无法前进的那个【未能成功发出】的阻挡物。甚至一开始就没法推出去。
切断力
切断力只与家具块有关。
当一个家具块的某条裂缝为不粘起来的较为碎裂的状态时,可能会允许这种情况发生:
(推前)
(推后)
但这次暂不处理。