使用不同参数计算多次迭代的最佳方法是什么?

时间:2016-05-20 11:20:56

标签: c# algorithm design-patterns

我正在制作一个程序来计算需要满足哪些要求才能从游戏中获得成就。

成就可以有多个级别,每个级别都有不同的要求,玩家可能已经满足了部分要求。所以,例如:

成就A级1需要10个鼠尾
成就A级2需要8个鼠尾和2个狼尾

为了获得成就A级2,玩家将需要总共18只老鼠尾巴和2只狼尾巴,但如果他已经有5只老鼠的尾巴我会喜欢该节目告诉他他需要13只老鼠的尾巴还有2只狼尾巴。

因此,我正在寻找一种数学方程式或编程方法,可以轻松地(可能在一个循环中)计算每个级别的要求并减去玩家已经拥有的东西,换句话说,某种循环可以计算不同的等式每一次。原因是玩家可以选择他想要的等级,所以他可以选择"告诉我我需要的等级1和#34;或者"告诉我10级"在他选择之后,程序需要进行总计算,我可以手工完成,如:

int wolftail, rattail;
int wolftailInv, rattailInv;
if (level == 1)
{
  wolftail = 0;
  rattail = 10 - rattailInv;
}

if (level == 2)
{
  wolftail = 2 - wolftailInv;
  rattail = 18 - rattailInv;
}

或者,换句话说,2级总数的数学等式将是(让我们暂时忽略玩家已经拥有的东西):

Level 2 = Level 1 + 2x wolftail + 8x rattail
Level 1 = 10x rattail
=>
Level 2 = 10x rattail + 2x wolftail + 8x rattail

而等级1的等式仅为:

Level 1 = 10x rattail

所以我想知道是否有一种数学或程序方法可以考虑每个单独级别的不同数学方程并自动添加它们,但只需要那些。实际上,我正在寻找类似替换的程序化等价物:

x = 2y + apples
y = banana
=>
x = 2x banana + apples

这是一个简单的例子,但是一个简单的总和不会起作用的原因,因为有这样的水平,还有:

Level 6 = Level 5 + strangestuff
Level 5 = Level 4 + otherstuff
Level 4 = Level 3 + otherstuff
Level 3 = Level 2 + zzz

所以等级6的总和是:

Level 6 = Level 2 + zzz + 2x otherstuff + strangestuff

但是如果玩家已经达到等级3,则等式变为:

Level 6 = 2x otherstuff + strangestuff

因此,我需要在c#中进行数学替换和/或考虑到产生总和的不同组件,并在需要时将其取出。

2 个答案:

答案 0 :(得分:0)

因此,将每个级别创建为项目和金额列表。例如:

enum ItemType
{
    RatTail,
    WolfTail,
    Stuff1,
    Stuff2
}

Dictionary<ItemType, int> Level1 = new Dictionary<ItemType, int>
{
    {RatTail, 10}
};

Dictionary<ItemType, int> Level2 = new Dictionary<ItemType, int>
{
    {RatTail, 18},
    {WolfTail, 2}
};

// Additional levels here

然后,您将创建一个列表或级别数组:

List<Dictionary<ItemType, int>> Levels = new List<Dictionary<ItemType, int>>
{ Level1, Level2, Level3, ...};

用户的广告资源也存储在其中一个词典中。

每个级别都包含总成本以达到该级别,而不是前一级别的增量成本。要确定从等级X到等级Y的成本是多少,这很简单:

For every item in Level Y
    Look up that item in Level X
    If the item exists in Level X then
        Subtract Level X count from Level Y count
        Add item and difference to Result
    Else
        Add item and Level Y count to Result

结果是等级Y(目标)和等级X之间的差异。

然后,为了弄清楚玩家必须赚多少钱,考虑到他当前的库存,你会做同样的事情。对于结果中的每个项目,减去玩家的当前计数。结果是玩家必须在目前拥有的东西之上获得收益。

我建议将差异代码放入循环中,例如:

Dictionary<ItemType, int> ComputeLevelDifference(
    Dictionary<ItemType, int> CurrentLevel,
    Dictionary<ItemType, int> TargetLevel)
{
    // compute level difference here, and return
}

然后,确定玩家从一个级别到下一个级别必须获得的收益:

var LevelDifference = ComputeLevelDifference(CurrentLevel, TargetLevel);
var PlayerMustEarn = ComputeLevelDifference(PlayerInventory, LevelDifference);

以上假设当玩家向上移动一个级别时,他会花费&#34;他的库存中所需的物品。也就是说,如果需要10个老鼠的尾巴才能达到1级,那么玩家必须收集那些老鼠尾巴,然后花费它们前进到水平,所以当他达到1级时,他的库存中有0个鼠尾巴。 / p>

如果模型是他收集了鼠尾并且没有花费它们,那么你就不必进行水平差异。相反,您只需使用播放器的当前广告资源和目标级别来计算级别差异。

答案 1 :(得分:0)

也许更简单的方法可以提供帮助:

正如您已经说过的那样,为了获得成就,玩家可以通过支付来支付的部分库存。在这种情况下,应该有一些库存对象由玩家对象拥有并包含他当前拥有的所有东西。现在,每项成就也都有关于实现成就所需要的东西的清单。现在,您只需使用玩家库存中相同类型的金额减去成就库存中的每个类型,结果您将获得包含完成成就所需的所有缺失项目的库存。