簡體   English   中英

在列表中搜索子類屬性

[英]Searching for child class properties in a list

現在我正在創建一個 Quest Requirement Checker,以查看玩家是否能夠完成任務。 我現在正在處理的任務類型是“在庫存中有一件物品”,如您所見,如果玩家在他/她的庫存中有一個或多個指定的物品,就會完成。

現在,我的確切問題是什么? 嗯,……物品。

首先。 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

因為在Item沒有MaterialClassification之類的東西。

我想做的是實施不同類型的評估。

  • 如果任務要求一杯水,我應該尋找住在我的Beberage班級內的財產。

  • 如果任務只要求一把劍。 我應該在其庫存中尋找名稱為“Sword”的物品。

  • 如果任務要求鑽石傳奇劍,那么......你明白我的意思。

有沒有辦法在我的系統中查找這些擴展類屬性? 我找不到這樣做的方法。

PD:對不起,我的英語不好,不是母語人士。

編輯:我已經編輯了我的答案以解決通用任務方法的想法。

如果您希望任務能夠跨多種不同類型的通用的,你可能想實現一個IsSameIsEquivalent的方法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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM