首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建需求

创建需求
EN

Stack Overflow用户
提问于 2013-07-10 23:18:24
回答 3查看 109关注 0票数 2

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

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

注意:你可以把我的问题想象成一个MMORPG游戏,在游戏中,你丢下不同等级和类型的物品,但只有你能够穿着适合你的类型和等级的物品。所以,简单地说,我希望有人向我解释这种机制,以及我如何以专业的方式在C#中实现它。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-10 23:22:49

一种方法是利用Specification pattern

因此,基本上,您的项目将有一个WearerSpecification属性,该属性返回一个规范,如果当前字符满足它,该规范将返回true。

如下所示:

代码语言:javascript
复制
public abstract class Item
{
    private readonly ISpecification<Character> _wearerSpecification;

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

    public ISpecification<Character> WearerSpecification
    {
        get { return _wearerSpecification; }
    }
}

在角色试图拾取物品时调用的方法中,代码将如下所示:

代码语言:javascript
复制
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

代码语言:javascript
复制
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;
    }
}

然后,您可以直接在项声明中使用这些类:

代码语言:javascript
复制
public class VeryHeavyShield : Item
{
    public VeryHeavyShield()
        : base(CreateSpecification())
    {
    }

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

Stack Overflow用户

发布于 2013-07-10 23:29:20

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

代码语言:javascript
复制
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();
    }
}
票数 3
EN

Stack Overflow用户

发布于 2013-07-10 23:27:56

创建一个打包所有统计数据的“需求”-array怎么样?对每一项使用相同的数组,然后遍历它们,并设置一个boolean-false (如果状态设为低)。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17574499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档