【问题标题】:Controlling list items with for loops C#使用 for 循环 C# 控制列表项
【发布时间】:2014-10-06 02:10:30
【问题描述】:

我正在为一个侄子开发一款小型 RPG 游戏,我决定将一些任务加入其中,而不仅仅是单纯地与骷髅战斗。我建立了一个可用的库存,因为我可以添加、删除和使用物品,但是库存中的物品将被填满,直到达到限制(25 件)而无需堆叠。

我用以下代码解决了这个问题:

finished = false;    
if(Backpack[bSlot].ITEM.ItemName == Item.ItemName){
                        if(!finished){
                            Backpack[bSlot].ITEM.ItemCount += 1;
                            finished = true;
                        }
                    }

正如您所见,它只是检查我们添加的项目(项目)是否与我们在插槽中的项目相同。

但是,这只有在项目完全相同的情况下才有效,任何其他项目都被丢弃并且他们的游戏对象被破坏。

这是我将物品添加到背包的功能:

public void AddItem(ItemDefine Item){
    bool finished = false;
    for (int bSlot = 0; bSlot < Backpack.Count; bSlot++) {
        //if slot is empty, add item
        if(Backpack[bSlot].ITEM.ItemName == null){
            if(!finished){
                Backpack[bSlot].ITEM = Item;
                finished = true;
            }
        }

        //If item is the same as the one in our current slot
        if(Backpack[bSlot].ITEM.ItemName == Item.ItemName){
            if(!finished){
                Backpack[bSlot].ITEM.ItemCount += 1;
                finished = true;
            }
        }

        //if the item is NOT the same as the one in our current slot
        if(Backpack[bSlot].ITEM.ItemName != Item.ItemName){
            if(!finished){
                Backpack[bSlot].ITEM = Item;
                finished = true;
            }
        }
    }
}

我目前的问题是我无法检查项目是否相同,是否将数量(ItemCount)增加 1,以及是否只是迭代到下一个列表位置并添加项目在那里。

想法?

【问题讨论】:

    标签: c# for-loop unity3d


    【解决方案1】:

    您的代码存在一些问题。你真的应该使用if else 来做你的逻辑。

    但是,您可以使用hash table 更轻松地执行此操作。哈希表将使您更容易避免重复已有的项目,并允许您堆叠可堆叠的项目。

    您可以像这样创建Dictionary

    Dictionary<key, value>();
    

    key 将是您的项目,值应该是一个堆栈。

    【讨论】:

    • 这有点帮助,我回去重新考虑我的想法。再次尝试使用 if-else 并设法修复它,但不需要字典,因为项目具有按原样的计数器(即 ITEM.ItemCount),默认设置为 1(除非另有说明)并通过使用增加代码。感谢您的回复和帮助!
    【解决方案2】:

    我会在确定它是否在之前完成forloop。

    public void AddItem(ItemDefine Item){
    
      bool exists = false;
      if(Backpack.Where(x => x.ItemName == Item.ItemName).ToArray().Length > 0)
          exists = true;
    
      switch(exists) {
          case true: {
                         // Item Exists
                         ItemDefine newItem = Backpack.Where(x => x.Itemname == Item.ItemName).FirstOrDefault();
                         // we double check to make sure it really exists.
                         If(newItem != null) {
                            newItem.ItemCount += 1;
                         }
                     } break;
          case false: {
                         // Item Does Not Exist
                         Backpack.add(Item);
                      } break;
          default: {
                       // Something went horribly wrong
                   } break;
      }
    
    }
    

    在此示例中,我们首先搜索列表以查看具有此名称的项目是否存在,如果存在,我们会评估我们之后所做的事情。 如果它存在,我们实际上只是增加项目计数,否则我们只是将其添加到列表中, 请注意,如果它是一个数组,我不知道你是如何声明 Backpack 变量的 或列表背包。

    有很多方法可以扩展逻辑,但 List where 函数非常适合库存处理。 希望这能提供一些见解。

    【讨论】:

    • 老实说,这似乎对我不起作用,但它确实让我思考了一些事情。这帮助了我。谢谢!
    【解决方案3】:

    睡个好觉后,回来阅读答案。这让我开始思考,我将我的两段代码,添加新代码和添加到项目计数放在两个 for 循环中,其中理想数量的插槽(5x5 网格,25 个插槽)不起作用。我之前已经尝试过 else if 语句,这给了我一些奇怪的行为。

    我通过一个简单的语法更改来纠正整个情况,而不是检查 itemName 是否为空,而是检查图标是否为空,因此修复如下:

    public void AddItem(ItemDefine Item){
            bool finished = false;
            for (int bSlot = 0; bSlot < Backpack.Count; bSlot++) {
                //if slot is empty, add item
                if(Backpack[bSlot].ITEM.ItemIcon == null){
                    if(!finished){
                        Backpack[bSlot].ITEM = Item;
                        finished = true;
                    }
                }else if (Backpack[bSlot].ITEM.ItemName == Item.ItemName) {
                    if (!finished) {
                        Backpack[bSlot].ITEM.ItemCount += 1;
                        finished = true;
                    }
                }
            }
        }
    

    这甚至可以达到插槽的限制,每种物品类型都在另一段代码中进行说明,即武器限制为 1,食物限制为 128,资源 128 和任务物品 1

    感谢您的所有帮助(即使我没有使用它们,很高兴知道有人真正提供帮助)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-23
      • 1970-01-01
      • 2022-01-06
      • 2011-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多