gpt4 book ai didi

c# - 我有一个游戏的攻击链系统,但它很快就会变得非常复杂

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:52:25 24 4
gpt4 key购买 nike

我正在为我的 compsci 本科生参加游戏开发类(class),我们的项目是制作 XNA 游戏。我们正在制作一个 jrpg 风格的游戏,并提出了一个很酷的战斗想法:每回合你排队 3 个技能,根据技能和选择的顺序,可以应用各种奖励效果。我们做了 a basic one with 2 skills: attack and fire .

你从第一个技能开始,然后箭头显示选择的第二个和第三个技能。第二层和第三层的方框显示此时添加的效果。

基础知识:攻击+攻击=第二次攻击的暴击率更高。Fire+Attack = 在攻击的原始伤害上增加一些火焰伤害。Fire+Fire = 应用燃烧状态

更难的部分是当您连续命中 3 个时,因为它们会进行某种特殊攻击。攻击有 1/4 几率造成暴击,火焰造成双倍伤害的火焰攻击(称为火球)。

在 if 语句中实现这一点可能会因使用更多技巧而变得痛苦。 if 语句的数量等于 n^n 从 1 到 n 的总和,所以如果我们想要 6 个技能,我们需要写 6+36+216=258 个 if 语句!其中许多也是多余的!这很容易出错,因为我们必须精心设计每个 if 语句,以便它们在我们编写流程图时处于正确的位置。

这就是为什么我们认为我们应该有一些具有静态效果的通用组合,如果它可以累积,可能会增加一个计数器,然后当我们连续有 3 个时调用具有该技能特殊攻击的函数。

首先想到的是有限状态机。除了我认为的特价商品外,它可以处理所有情况。也许是下推式自动机?我遇到的主要问题是我不知道如何在代码中实现它们。我上的课是理论课。

还有其他更高效或更容易编写/编码的方法吗?

最佳答案

我会想出某种递归模型:

enum Outcomes { Crit, DoubleCrit, FireDMG, Burn, NoEffect }

abstract class Attack
{
public Attack() { Child = null; }

List<Outcomes> GetOutcomes();
protected virtual Attack Child;
}
class Melee : Attack
{
public Melee() : base() { }
public Melee(Attack child) : base() { Child = child; }

List<Outcomes> GetOutcomes()
{
List<Outcomes> ret = new List<Outcomes>();
if(Child != null) ret.Add(Child.GetOutcomes());

if(ret.Contains(Outcomes.Crit))
ret.Add(Outcomes.DoubleCrit);
else
ret.Add(Outcomes.Crit);

return ret;
}
}
class Fire : Attack
{
public Fire() : base() { }
public Fire(Attack child) : base() { Child = child; }

List<Outcomes> GetOutcomes()
{
List<Outcomes> ret = new List<Outcomes>();
if(Child != null) ret.Add(Child.GetOutcomes());

List<Outcomes> PossibleOutcomes = new List<Outcomes>();

PossibleOutcomes.Add(Outcomes.FireDMG);
PossibleOutcomes.Add(Outcomes.Burn);

if(ret.Contains(Outcomes.Burn)) PossibleOutcomes.Add(Outcomes.Fireball)
if(ret.Contains(Outcomes.FireDMG)) PossibleOutcomes.Add(Outcomes.NoEffect);

// Use some randomization method to select an item from PossibleOutcomes
int rnd = 2; // Totally random number.
ret.Add(PossibleOutcomes[rnd]);

return ret;
}
}

然后链式攻击只需使用:

Attack ChosenAttack = new Melee(new Fire(new Melee()));

或者假设用户选择了每个分支,您只需要保留最后一个分支并将其作为 child 不断添加到他们选择的下一个攻击中。

Attack ChosenAttack = new Melee();

// Some events occur...

ChosenAttack = new Fire(ChosenAttack);

// Some more...

ChosenAttack = new Melee(ChosenAttack);

如果我不太理解问题并且我的建议行不通,我深表歉意。

关于c# - 我有一个游戏的攻击链系统,但它很快就会变得非常复杂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13391545/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com