我正在建立一个允许玩家控制10个电路之间“功率流”的游戏。
10个电路中的每一个都是单独调整的,总数必须始终等于100%。
例如,完全平衡的情况是10%的所有10个电路(10x10 = 100)
编辑2:如果我在这里尝试做的事情被称为“平衡”以外的事情,请发表评论,我会研究它们。
现在播放器还具有锁定电路的能力,以便其他电路无法改变功率电平,但仍然可以直接更改。
编辑3:有时在这些情况下可能无法实现所请求的金额(例如:示例3和6),结果将是最接近的结果
编辑:看到我的帖子正在接受投票,我将包括我已经尝试过的内容
为了简化我的问题,我们只能使用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)
答案 0 :(得分: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