public static class Global
{
public static List <Faction> Factions;
public static Dictionary <Faction, FactionRelation> FactionRelationships;
}
public class Faction
{
public Faction Parent;
}
public class FactionRelation
{
public Faction ForeignFaction; //The enemy or friend of this faction
public decimal Multiplier; //Standings gain/loss with the faction get applied to ForeignFaction by this percentage. Ex: I get +100 with NativeFaction. If multiplier is -0.1M, then I'll get -10 with ForeignFaction
}
public class Player
{
public Dictionary <Faction, decimal> Standings;
public void SetStandings(decimal mod)
{
foreach (Faction f in Global.Factions)
{
}
}
}
上面的代码代表了一个游戏的基本派系系统。全局类初始化游戏,根据某些数据定义创建派别对象。它还包含一组派系和代表派系之间关系的十进制值。
派系
假设我们有两个主要派系:方向派和色彩派他们没有家长派系。
我们也有上流社会和下流社会的派系,他们的母派系都是直接的。最后,我们有红人和蓝人派系,他们的母派系都是有色人种。
所以,
指导人
上流社会
下流社会
有色人种
红人
平克福克
猩红人
蓝人
这种筑巢可能会深入得多;例如,红人可能有品克福克(pinkfolk)和斯卡尔福克(scarletfolk)作为子动作。
任何阵营的站立增益都应该在树上下传播,直到树的两端达到筑巢极限。集合的嵌套深度决定了应该在任何级别发生的站立修改的数量。为了使它更简单,让我们假设它是平均分配的。所以如果我直接和花花公子站在一起的话,我应该和红人和蓝人站在一起的话,我应该是50,和红人和红人站在一起的话,我应该是25。如果我直接和红人站在一起得到100分,我应该和蓝人站在一起得到50分,和红人站在一起得到25分。这个想法是,直接与最低层派系修改将比在最高层更明显所以,和色鬼比起来,平克福克更容易成为朋友或敌人。
如果这个算法有名字,我不知道是什么。
此外,任何没有父母的派别都可以与另一个没有父母的派别建立关系。所以,让我们说方向和颜色是敌人。任何派系与有色人种站在增益应导致一个比例的立场失去与方向民间。因为只有没有父母的派系才能有跨派系的关系(正的或负的乘数),这种持续性的损失总是发生在相关派系链的顶端,并逐渐减少。
理想情况下,我希望能够为派系关系分配更有趣的值,包括跨父派系和父派系的子动作。因此,对某些子动作的站立式修改可能会根据乘数通过其他一些派系传播,并且树中父派系的站立式增益将更为颗粒状。
玩家
player对象有一个列表,表示他们在每个派别中的排名。很简单-一个派系和一个十进制值这是我将要修改的值,因为每个玩家持有的数据代表他们与一个派别的立场(派系本身并不知道在这个意义上的玩家)。
--
我的问题是,我是应该通过一些陈旧的递归过程直接在player对象中设置一个值集合,还是有一种优雅的方法可以简单地根据player存储的很少的值来计算这个值?
另外,让这一点更有趣的是,有些派别彼此之间是中立的,即使是在同一棵树上(例如,红人和蓝人不关心对方)-或者混合分布,以致它不严格地-甚至这类事情会严重地使事情复杂化,或者有可能设计一个算法吗?哪一个更不可知论?
我真的只是在寻找一个如何让我的头围绕这个开始如果有人设计了类似的东西,我很想听听你的想法。
最佳答案
我所看到的问题是,你还没有确切地定义你想要的传播规则是什么。事实上,你举了两个互相矛盾的例子:
“因此,如果我直接与ColorFolk站在一起得到100个,那么我应该与RedFolk和BlueFolk站在一起得到50个,”——这个例子只在树上传播,而不传播给兄弟姐妹(没有提到对方向的增益folk。)
“如果我直接和雷德福克站在一起的话,我应该和蓝福克站在一起50分,和品科福克和斯卡莱特福克站在一起25分。”——而这个例子确实传播到了兄弟姐妹身上。
显然,如果没有至少一条规则来决定它为什么会传播到某些兄弟姐妹而不是其他兄弟姐妹,这两条都不可能是真的尤其是,如果站姿横向传播到兄弟姐妹,编写递归算法来执行此操作会非常困难,因为您的两个子派系将更新两次,一次来自其父派系,一次来自其兄弟姐妹派系。
如果需要,可以运行通用传播算法:
void propagateStanding(amount)
{
// calculate relative weightings
totalWeighting = 0.0;
for (relationship in faction.relationships)
{
totalWeighting += relationship.weight;
}
// propagate value
for (relationship in faction.relationships)
{
amountToGive = amount * relationship.weight / totalWeighting;
relationship.otherFaction.standing += amountToGive;
}
}
注意,这只包括传播,而不是增加到原来的派系。