我要做一个这样的flash游戏:
有一块木板上有洞(超过1000个)。最初,有3个钉放在板上,周围有一个橡皮筋。
我们有三种可能的行动:
一。添加钉-在板上添加钉
2.拆下销钉-拆下销钉(如果有3个以上的销钉)-橡皮筋的形状必须与其余的销钉相同。
三。移动销钉-必须使用销钉的当前位置更新橡皮筋。
如何解决橡胶带形状的优化问题?
我有两个主意,但我得稍微改进一下。主要的想法是,我们只能在“移动”操作时改变橡皮筋的形状,并且我们使用相同数量的销钉,只有一个是改变位置:
凸壳算法的推导。我们得知道橡皮筋里面有夹心钉,外面有夹心钉。可能会有点复杂。
我们只使用3个钉子:2个锚和1个中间。两个锚形成了1个中间桩相互作用的边界线。在线路的有效侧,橡皮筋在两个锚栓和中间栓之间起两段作用。在非活动侧,1号中间销钉可以自由移动,而橡皮筋在2号锚栓之间起直线作用。上述注意事项是,在某些情况下,边界线活动侧的1个中间桩的移动可导致2个节段中的一个接触第4个桩。程序必须检测到这种情况并相应地更新新的锚栓。这些只是一些有限经验的建议。开发人员应根据其经验和判断确定最佳方法。
你还有其他想法或建议吗?
最佳答案
“开发人员应该根据自己的经验和判断来确定最佳方法。”—您是否从所给的规范中复制并粘贴了这个?:)
你要求一个“最佳”的解决方案,但如果我是你,我的目标是一个“正确,足够快”的解决方案。你有一个合同要履行,你可以把渐近线留给学术界。
无论如何,你的计划,更新乐队只有当球员移动一个钉看起来是一个不错的我们需要记住所有接触橡皮筋的钉子,对于每个钉子,我们必须记住橡皮筋在哪一边(为了正确地画橡皮筋)。
现在,假设玩家将peg a从a移动到a。
作为一般原则,值得记住的是,即使你的时间段很短,从a到a'的距离很小,但是可能会发生很多事情。因此,您必须考虑该时间段中可能发生的所有事件,选择最早的事件,相应地更新数据结构,然后继续执行该时间段的其余部分。
有什么活动?
钉一个“拿起”乐队。(如果Peg A不在乐队中,并且A–A'线穿过乐队中两个Peg之间的一条线,则会出现这种情况。)
钉一个“放下”乐队(如果Peg A在乐队中,与邻居B和C在一起,而A-A'穿过B-C线,则会这样做。)
Peg A在乐队里赢得了一个邻居。(当peg A在频带上,B是A的邻居,三角形A-A'-B包含另一个peg C时,就会发生这种情况。)
佩加在乐队里失去了一个邻居(当钉A在带上,带上相邻的钉A-B-C,钉B在三角形A-A'-C中时,就会发生这种情况。)
因此,您应该确定所有此类事件;计算每个事件将发生的时间;按时间顺序对事件进行排序;处理最早的事件(仅限);对时间段的其余部分重复此操作。
(如果两个事件同时发生怎么办?这要看你的经验和判断。)
编辑后补充说:一个复杂的情况是,一个peg可能出现在橡皮筋的多个段上(例如,橡皮筋可能会变成a-B-a-C-a)但我认为上面的算法草图仍然有效。
另一个问题是,即使使用少量的销钉,也可以任意扭曲带的配置。例如,假设带状物被拉伸在钉B和C之间。现在取钉A,在钉B和C周围以8的图形移动(假设是顺时针绕B,逆时针绕C)。每次绕一圈,peg a都会捡起另外两块带子。你不能让配置的复杂性在不受约束的情况下增长,所以需要一些阻止事情失控的方法。我建议对乐队的长度施加最大限度的限制,这样任何试图把它拉得太远,都会使它折断(当然,在发生这种情况之前,你会有警告信号,例如,带越来越薄,颜色变化,不祥的吱吱声)。