我的问题很简单,我正在用C#创建一个小的2D游戏。这个游戏代表了一个角色,必须杀死怪物并获得经验来提高他的等级。随着他的等级增加,他将能够穿戴更高等级的物品,以及他的力量点增加,他将能够解锁新的物品。
如何通过创建项目需求来限制特定级别和特定强度的某些项目?以最简单但功能强大的方式,所以我不想涉及大量丑陋的SWITCH或IF ELSE语句。
注意:你可以把我的问题想象成一个MMORPG游戏,在游戏中,你丢下不同等级和类型的物品,但只有你能够穿着适合你的类型和等级的物品。所以,简单地说,我希望有人向我解释这种机制,以及我如何以专业的方式在C#中实现它。
发布于 2013-07-10 23:22:49
一种方法是利用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
}
}
}为了简化项目的实际创建并不重复代码,您可以创建表示经常出现的需求的具体规范类,例如,您可以创建AtLeastLevel10Specification或MinimumStrengthSpecification
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));
}
}发布于 2013-07-10 23:29:20
虽然丹尼尔的答案是合理的,而且最终更加通用,但我认为对于c#初学者来说,简单地实现一个方法可能更容易理解。这绝对比一个庞大的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();
}
}发布于 2013-07-10 23:27:56
创建一个打包所有统计数据的“需求”-array怎么样?对每一项使用相同的数组,然后遍历它们,并设置一个boolean-false (如果状态设为低)。
通过这种方式,你基本上只需要对每个值进行一次a>=b检查。
https://stackoverflow.com/questions/17574499
复制相似问题