C# 创建需求

C# 创建需求,c#,C#,我的问题很简单,我正在用C#创建一个小型2D游戏。这个游戏代表一个角色,他必须杀死怪物并获得经验来提高他的等级。随着他的等级增加,他将能够穿戴更高等级的物品,同时他的力量点增加,他将能够解锁新物品 如何通过创建项目需求来限制特定级别和特定强度的某些项目?以最简单但功能强大的方式,因此我不想涉及一个大而丑陋的开关或IF-ELSE语句 注意:你可以把我的问题想象成一个MMORPG游戏,在这个游戏中,你可以放下不同级别和类型的物品,但只有你才能穿戴适合你类型和级别的物品。因此,我只想有人向我解释这一机

我的问题很简单,我正在用C#创建一个小型2D游戏。这个游戏代表一个角色,他必须杀死怪物并获得经验来提高他的等级。随着他的等级增加,他将能够穿戴更高等级的物品,同时他的力量点增加,他将能够解锁新物品

如何通过创建项目需求来限制特定级别和特定强度的某些项目?以最简单但功能强大的方式,因此我不想涉及一个大而丑陋的
开关
IF-ELSE
语句


注意:你可以把我的问题想象成一个MMORPG游戏,在这个游戏中,你可以放下不同级别和类型的物品,但只有你才能穿戴适合你类型和级别的物品。因此,我只想有人向我解释这一机制,以及我如何以专业的方式在C#中实现它。

一种方法是利用

因此,基本上,您的物品将有一个
WearerSpecification
属性,该属性返回一个规范,如果当前角色满足该规范,该规范将返回true

大概是这样的:

public abstract class Item
{
    private readonly ISpecification<Character> _wearerSpecification;

    protected Item(ISpecification<Character> wearerSpecification)
    {
        _wearerSpecification = wearerSpecification;
    }

    public ISpecification<Character> WearerSpecification
    {
        get { return _wearerSpecification; }
    }
}
public class Character
{
    public void PickUpItem(Item item)
    {
        if(item.WearerSpecification.SatisfiedBy(this))
        {
            // item can be picked up
        }
        else
        {
            // item can't be picked up
        }
    }
}

为了简化项目的实际创建并避免重复代码,您可以创建表示经常出现的需求的具体规范类,例如,您可以创建
至少10级规范
最小强度规范

public class AtLeastLevel10Specification : ISpecification<Character>
{
    public bool IsSatisfiedBy(Character character)
    {
        return character.Level >= 10;
    }
}

public class MinimumStrengthSpecification : ISpecification<Character>
{
    private readonly int _minimumRequiredStrength;

    public MinimumStrengthSpecification(int minimumRequiredStrength)
    {
        _minimumRequiredStrength = minimumRequiredStrength;
    }

    public bool IsSatisfiedBy(Character character)
    {
        return character.Strength >= _minimumRequiredStrength;
    }
}
public类至少10级规范:i规范
{
公共布尔值满足(字符)
{
返回字符。级别>=10;
}
}
公共类最小强度规格:I规格
{
私有只读int _最小要求强度;
公共最小强度规格(int最小要求强度)
{
_最小要求强度=最小要求强度;
}
公共布尔值满足(字符)
{
返回字符。强度>=\u最小所需强度;
}
}
然后,您可以在项目声明中直接使用这些类:

public class VeryHeavyShield : Item
{
    public VeryHeavyShield()
        : base(CreateSpecification())
    {
    }

    private static ISpecification<Character> CreateSpecification()
    {
        return new AtLeastLevel10Specification().And(
                   new MinimumStrengthSpecification(50));
    }
}
public类VeryHeavyShield:项
{
公共安全防护罩()
:base(CreateSpecification())
{
}
私有静态isSpecification CreateSpecification()
{
返回新的AtLeastLevel10Specification()。和(
新的最小强度规范(50);
}
}
如何创建一个“需求”数组,在其中打包所有统计数据。为每个项目创建相同的数组,然后遍历它们,如果stat设置为low,则将布尔值设置为false


通过这种方法,你基本上只需要对每个值进行a>=b检查。

虽然丹尼尔的答案是合理的,而且最终更加通用,但我认为简单地实现一种方法可能对c#初学者来说更容易理解。 它肯定比一个巨大的
开关
子句要好

public class Item
{
    public virtual bool IsWearable(Character c)
    {
        return true;
    }
}

public class BananaSword : Item
{
    public override bool IsWearable(Character c)
    {
         return c.Level >= 10 && c.Race == CharacterRace.BananaWarrior;
    }
}

public class BananaDude : Character
{
    public List<Item> GetWearableItems()
    {
        return AllGameItems.Where(i => i.IsWearable(this)).ToList();
    }
}
公共类项目
{
公共虚拟bool可穿戴(角色c)
{
返回true;
}
}
公共类BananaSword:Item
{
公共覆盖布尔可穿戴(字符c)
{
返回c.Level>=10&&c.Race==CharacterRace.BananaWarrior;
}
}
公共班纳杜德:性格
{
公共列表GetWearableItems()
{
返回所有GameItems.Where(i=>i.IsWearable(this)).ToList();
}
}

在Item类中创建方法CheckRequirements(字符c)。不管你想怎么实现它(使用ifs、数学、需求矩阵等等),这可能并不难。我真的不明白这个问题的意思。Switch和if/else在任何方面都不是“丑陋”的,并完成它们精心设计的任务:检查条件。@C4stor:但是想象一下一个涉及很多物品和类型的大型游戏。他们是否创建了一个非常庞大的
开关
of
if else
代码,以满足他们游戏所需的所有要求?对于所有的投票人,我问这个问题只是为了了解更多关于C的信息。我参与游戏创作的另一个原因是我想增加我在c#方面的知识,所以请停止投票,试着帮助我。@ErricJManderin-不要对投票失败感到不安。这不是对你个人的反思。它是本网站提供的工具之一,可帮助为本网站的未来访问者提供最有用的内容。@Erric J Manderin:这是一个QA网站,不是学习的地方。问答必须精确,才能有用和有效。你的问题没有“答案”,只有建议,你可以主观地对其排序。事实是,根据您的用例,您使用不同的技术。这就是为什么我否决了这个问题,因为它不是“可回答的”,也不像未来用户那样可重用。这就是说,我希望你在答案中找到一些对你的案例有益的东西:)那么这被认为是一个好方法吗?。你能提供更多的方法来实现我的要求,让我学到更多吗?。不过,我会非常感谢你。@ErricJManderin-如果你的目标是学习,那么对你最好的建议是:停止试图让你头脑中的一切变得完美,开始编码吧。你会从错误中吸取教训,一旦你有了代码,你也能提出更好的问题。@ErricJManderin:如果不是一个好方法,我不会发布它。这就是我会以某种形式使用的方法。@Daniel Hilgarth:我真的非常感谢你非常宝贵的帮助,Daniel,非常感谢你。@ErricJManderin:不客气。请务必阅读更新,因为它显示了与Rotem提供的更简单方法相比的最大优势:可以轻松重用和组合规范。非常感谢Rotem我非常感谢您的帮助请注意:这是我展示的规范模式简化版本的实现,基本上直接在item类中实现。然而,它的缺点是,规范不再像完全实现模式那样可以组合或重用。