奇异推格子算法

这个奇异推格子和普通的推格子游戏的区别在于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. 如果有极大重力的话,单位会变成【阻力】。也就是让箱子的推力无法前进的那个【未能成功发出】的阻挡物。甚至一开始就没法推出去。

切断力

切断力只与家具块有关。

当一个家具块的某条裂缝为不粘起来的较为碎裂的状态时,可能会允许这种情况发生:

 (推前)

(推后)

但这次暂不处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值