我必须制作这样的Flash游戏: 有一个带孔的板(超过1000个)。最初,板上有3个钉子,周围有橡皮筋。 我们有3种可能的操作: 1.添加挂钉 - 在挂板上添加挂钉 2.取下挂钉 - 取下挂钉(如果挂钉超过3个) - 橡皮筋必须采用剩余挂钉的形状。 3.移动挂钉 - 橡皮筋必须用挂钉的当前位置更新。
您如何解决最佳找到橡皮筋形状的问题?
我有2个想法,但我必须对它们进行一些处理。主要的想法是我们必须仅在“移动”操作时改变橡皮筋的形状,并且我们使用相同数量的钉子,只有一个是在改变位置:
凸包算法的推导。我们必须知道橡皮筋内部有钉子,外面是钉子。它可能会有点复杂。
我们只使用3个钉:2个锚和1个中间。 2个锚点形成1个中间桩的相互作用的边界线。在该生产线的活动侧,橡皮筋在2个锚钉和中间栓钉之间起到2段的作用。在非活动侧,1个中间栓可自由移动,而橡皮筋在2个锚钉之间起直线作用。对上述情况的警告是,存在这样的情况:在边界线的活动侧中的1个中间栓的移动可以导致2个段中的一个接触第4个栓钉。程序必须检测到这种情况并相应地更新新的锚钉。这些只是来自这个概念的一些有限经验的建议。开发人员应根据自己的经验和判断确定最佳方法。
你还有其他想法或建议吗?
答案 0 :(得分:3)
“开发商应该根据他的经验和判断来确定最佳方法。” - 你从你给出的规范中复制并粘贴了这个吗? :)
你要求一个“最佳”的解决方案,但如果我是你,我的目标是“正确,快速”的解决方案。你已经签订了合同,你可以将渐近线留给学者们。
无论如何,你只有在玩家移动钉子时才更新乐队的计划看起来很好。我们需要记住所有接触橡皮筋的钉子,对于每个钉子,我们必须记住它所在的橡皮筋的哪一侧(为了正确地绘制带子)。
现在,假设玩家将钉子A从 a 移动到 a'。
作为一般原则,值得注意的是,即使你的时间段很短,而且从 a 到 a'的距离很小,但仍有可能发生多种事情。因此,您将不得不考虑该时间段中可能发生的所有事件,选择最早此类事件,相应地更新您的数据结构,然后继续剩余的时间段。
那有什么样的活动?
所以你应该确定所有这些事件;计算每个事件发生的时间;按时间排序事件;处理最早的事件(仅限);重复剩下的时间段。
(如果两个事件同时发生怎么办?我会根据你的经验和判断来做到这一点。)
编辑补充说:一个复杂因素是钉子可能出现在橡皮筋的多个部分上(例如,乐队可能会出现A-B-A-C-A)。但我认为上面的算法草图仍然有用。
进一步的皱纹是,即使使用少量钉子,您也可以对乐队进行任意扭曲的配置。例如,假设带子在钉子B和C之间拉伸。现在取钉子A并将其移动到钉子B和C周围的8字形(顺时针绕B,顺时针绕C,比方说)。每次围绕循环,钉子A拾取另外几个乐队。你不能让配置的复杂性无限制地增长,所以需要一些方法来阻止事情失控。我建议对乐队的长度施加一个最大限制,这样任何将它拉得太远的尝试都会使它突然消失(当然,在此之前你会有警告标志,例如乐队变得更薄,颜色变化,不祥的吱吱声)。