-1

我正在构建一个允许玩家控制 10 个电路之间的“功率流”的游戏。

10 个电路中的每一个都单独调整,总和必须始终等于 100%。

例如,一个完美平衡的情况是所有 10 个电路都为 10% (10x10=100)

编辑2:如果我在这里尝试做的不是“平衡”,请发表评论,我会研究它们。

现在玩家还可以锁定电路,使功率等级不能被其他电路改变,但仍然可以直接改变。

编辑 3:在这些情况下,有时可能无法达到要求的数量(例如:示例 3 和 6),最接近的可能结果将是结果

编辑:看到我的帖子收到反对票,我将包括我已经尝试过的内容

  1. 变化的总和除以请求更改的电路加上请求更改的电路和取消的电路不变 - 这种方法的问题是负面和积极的变化同时可能会平衡并导致没有变化发生的“死锁”情况
  2. 根据需要通过电路添加和采取循环电路 - 这种方法的问题是它很少正确平衡
  3. 首先应用减法和加法,然后将所有电路平衡回范围内(因此总数变为 100) - 问题是电源将在不应该出现的地方结束,应该为 0 的电路以少量功率结束

为了简化我的问题,我们可以只使用 5 个电路。

我需要帮助来计算计算以下内容的数学。经过 20 次左右的尝试后,我认为我过于复杂了,因为我一直以 200 行脚本结束,还是这实际上非常复杂?

示例 1:加法示例

 20  20  20  20  20 Start values
+10 +10   0   0   0 Change
 30  30 3.3 3.3 3.3 After first iteration
 50  50   0   0   0 After x iterations (eg key held down)

示例 2:减法示例

 20  20   20   20   20 Start values
-10 -10    0    0    0 Change
 10  10 26.6 26.6 26.6 After first iteration
  0   0 33.3 33.3 33.3 After x iterations (eg key held down)

示例 3:锁定 + 加法(L 被锁定)

      L          
2.5  90  2.5  2.5  2.5 Start values
  0   0  +50    0    0 Change
  0  90   10    0    0 After first iteration
  0  90   10    0    0 After x iterations (eg key held down)

示例 4:锁定 + 减法(L 被锁定)

      L          
2.5  90  2.5  2.5  2.5 Start values
  0 -10    0    0    0 Change
  5  80    5    5    5 After first iteration
 25   0   25   25   25 After x iterations (eg key held down)

示例 5:多重锁定 + 减法(L 被锁定)

      L    L      
 2.5  90  2.5  2.5  2.5 Start values
   0 -10    0    0    0 Change
 5.8  80  2.5  5.8  5.8 After first iteration
32.5   0  2.5 32.5 32.5 After x iterations (eg key held down)

示例 6:从不平衡开始的平衡变化(这个数学可能有点偏离)

 2.5   90  2.5  2.5  2.5 Start values
 +10  +10  +10    0    0 Change
16.7 66.6 16.7    0    0 After first iteration
33.3 33.3 33.3    0    0 After x iterations (eg key held down)
4

1 回答 1

0

首先检索所有可能被运行时更改的电路:

Candidates = AllCircuits \ (LockedCircuits u ChangedCircuits)

这里,\表示集合减号运算符,u是联合运算符。

计算每个电路的平均变化:

targetTotalChange = totalChange
averageChange = totalChange / |Candidates|

现在,开始更换候选人。考虑到限制,请按照他们当前的潮流对候选人进行排序。如果averageChange为负数,则按升序排列。如果是正数,则按降序排列。

并记住您已经处理了多少电路:

processedCircuits = 0

现在按指定顺序迭代所有候选:

for each candidate in Candidates

检查是否可以将平均变化添加到该电路中。否则,调整值:

    processedCircuits++
    prevPower = candidate.PowerFlow
    targetPower = prevPower + averageChange
    if(targetPower < 0)
    {
        totalChange += prevPower
        candidate.PowerFlow = 0
        //recalculate average change
    }
    else if(targetPower > 100)
    {
        totalChange -= 100 - prevPower
        candidate.PowerFlow = 100
        //recalculate average change
    }
    else
    {
        totalChange -= averageChange
        candidate.PowerFlow += averageChange
    }

当您需要重新计算平均变化时,请执行以下操作:

averageChange = totalChange / (|Candidates| - processedCircuits)

小心除以零。

现在您已经调整了所有其他电路。剩下的就是调整改变的电路。这很容易。我们将所有其他电路更改为targetTotalChange - totalChange。可以将此更改添加到更改的电路中。我们可以添加相应的百分比:

percentage = (targetTotalChange - totalChange) / targetTotalChange
for each circuit in ChangedCircuits
    circuit.PowerFlow += percentage * targetChange[circuit]
next
于 2015-12-24T08:58:44.863 回答