现在,我正在创建一个任务需求检查器,以查找玩家是否能够完成任务。我现在正在处理的任务类型是“在库存中拥有物品”,如您所见,如果玩家的库存中有一个或多个指定物品,它将完成。
现在,我的确切问题是什么?好吧,...项目。
首先。 Item
是具有以下结构的类:
public int ID { get; set; }
public string Name { get; set; }
public double Price { get; set; }
public Item(int id, string name, double price)
{
ID = id;
Name = name;
Price = price;
}
还有一个名为Tool
的类,它扩展了Item
类:
public string Material { get; set; }
public string Classification { get; set; }
public Tool
(
int id,
string name,
double price,
string material,
string classification
) : base(id, name, price)
{
Material = material;
Classification = classification;
}
现在,这就是我创建每个工具的方式:
Items.Tool tool = new Items.Tool(1, "Shovel", 100, "Wood", "Poor");
我的播放器对象具有和这样的项目列表:
public List<Items.Item> InventoryItems { get; set; }
它作为库存。另外,要向列表中添加新项目,请使用以下功能:
player.AddItem(tool, 1);
public void AddItem(Items.Item item, int quantity)
{
for(int i = 0; i < quantity; i++)
{
InventoryItems.Add(item);
}
}
另一方面,我当前的任务类型“在库存中有物品”具有一个属性,该属性同时是项目列表:
public List<Items.Item> RequiredItems { get; set; }
这是我将项目添加到此列表的方式:
quest.AddRequiredItem(tool, 1);
public void AddRequiredItem(Items.Item item, int quantity)
{
for(int i = 0; i < quantity; i++)
{
RequiredItems.Add(item);
}
}
为了完成此任务,玩家必须拥有与RequiredItems
列表相同(或更多)数量的物品。因此,如果此任务要求玩家四处寻找3支劣质木铲,则InventoryItems
列表中至少应有3支劣质木铲。
我的任务是一个名为HaveItemsInInventory
的类,它实现了下一个函数以评估该条件:
override public bool Accomplish()
{
bool questAccomplished = true;
foreach (var group in RequiredItems.GroupBy(x => x))
{
if (Application._player.InventoryItems.Count
(
x =>
(
x.Name == group.Key.Name &&
x.Material == group.Key.Material &&
x.Classification == group.Key.Classification
)
) < group.Count())
{
questAccomplished = false;
break;
}
}
return questAccomplished;
}
这就是我所有问题出现的地方。这两行或代码是错误的:
x.Material == group.Key.Material &&
x.Classification == group.Key.Classification
因为Material
中没有Classification
或Item
这样的东西。
我想做的是实施不同类型的评估。
如果一个任务要一杯水,我应该寻找Beberage
类中的住所。
如果任务只要求一把剑。我应该在其清单中查找名称为“ Sword”的物品。
如果任务要求钻石传奇剑,那么……我明白了。
是否可以在系统中查找这些扩展类的属性?我找不到办法。
PD:对不起,我的英语不好,而不是母语。
答案 0 :(得分:1)
编辑:我已经编辑了答案,以解决通用任务方法的想法。
如果您希望任务在多种不同类型上通用,则可能要在IsSame
上实现IsEquivalent
或Items.Item
方法,然后继承该方法。您甚至可以重写Object.Equals方法(这可能是更合适的方法)。
class Item
{
public virtual bool IsSame(Item comp){ return comp.Name == Name; }
}
class Tool: Item
{
public override bool IsSame(Item comp)
{
return base.IsSame(comp) && (comp is Tool) && ((Tool)comp).Material == Material && ((Tool)comp).Classification == Classification;
}
}
然后在您的完成迭代中:
override public bool Accomplish()
{
bool questAccomplished = true;
foreach (var group in RequiredItems.GroupBy(x => x))
{
if (Application._player.InventoryItems.Count
(
x =>
(
x.IsSame(group.Key)
)
) < group.Count())
{
questAccomplished = false;
break;
}
}
return questAccomplished;
}