创建需求

时间:2013-07-10 15:18:24

标签: c#

我的问题只是我在C#中创建一个小型2D游戏。这个游戏代表一个角色,必须杀死怪物并获得经验,以提高他的水平。随着他的等级增加,他将能够穿更高等级的物品以及他的力量点增加他将能够解锁新物品。

如何通过创建项目要求来限制特定级别和特定强度的某些项目?以最简单但最强大的方式,所以我不想涉及大量丑陋的SWITCHIF ELSE声明。

注意:您可以将我的问题想象成一个MMORPG游戏,您可以在其中放置不同级别和类型的项目,但只有您能够佩戴适合您的类型和级别的项目。所以我只想让某人向我解释这种机制,我怎样才能以专业的方式在C#中实现它。

3 个答案:

答案 0 :(得分:4)

一种方法是使用Specification pattern

因此,基本上,您的项目将具有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
        }
    }
}

为了简化项目的实际创建并且不重复代码,您可以创建表示经常出现的要求的具体规范类,例如:您可以创建AtLeastLevel10SpecificationMinimumStrengthSpecification

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 class VeryHeavyShield : Item
{
    public VeryHeavyShield()
        : base(CreateSpecification())
    {
    }

    private static ISpecification<Character> CreateSpecification()
    {
        return new AtLeastLevel10Specification().And(
                   new MinimumStrengthSpecification(50));
    }
}

答案 1 :(得分:3)

虽然Daniel的答案是合理的,并且最终更具通用性,但我认为简单地实现一种方法对于c#beginner来说可能更容易理解。 它肯定比一个巨大的switch条款好。

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();
    }
}

答案 2 :(得分:1)

如何创建“需求”-array,其中包含所有统计信息。每个项目的相同数组,然后迭代它们并设置一个布尔值假,如果统计数据为低。

通过这个你基本上只有一个&gt; = b检查每个值。