亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在列表中搜索子類屬性

在列表中搜索子類屬性

C#
互換的青春 2022-10-23 13:54:17
現在我正在創建一個任務要求檢查器,以查看玩家是否能夠完成任務。我現在正在處理的任務類型是“庫存中有物品”,如您所見,如果玩家在他/她的庫存中有一個或多個指定的物品,它將完成?,F在,我的確切問題是什么?嗯,……物品。首先。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列表中相同數量(或更多)的物品。InventoryItems所以,如果這個任務要求玩家四處尋找 3 把劣質木鏟,它的清單上應該至少有 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;}
查看完整描述

1 回答

?
慕村225694

TA貢獻1880條經驗 獲得超4個贊

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


如果您希望任務在多種不同類型上通用,您可能希望在 上實現IsSameorIsEquivalent方法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;

}


查看完整回答
反對 回復 2022-10-23
  • 1 回答
  • 0 關注
  • 107 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號