使用for循环C#控制列表项

本文关键字:列表 控制 for 循环 使用 | 更新日期: 2023-09-27 18:25:35

我正在为一个侄子开发一款小型RPG游戏,我决定加入一些任务,而不仅仅是纯粹的骷髅战斗。我建立了一个工作库存,因为我可以添加、删除和使用物品,但库存中的物品只会填满,直到达到极限(25件),而不会堆积。

我用以下代码纠正了这个问题:

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

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

然而,只有当物品完全相同,任何其他物品都被丢弃,并且他们的游戏对象被破坏时,这才会起作用。

这是我在背包中添加物品的功能:

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,以及是否只是迭代到下一个列表位置并在那里添加项目。

想法?

使用for循环C#控制列表项

您的代码有一些问题。您真的应该使用if else作为您的逻辑。

然而,有一种更简单的方法可以使用哈希表来实现这一点。哈希表将使您更容易避免现有项目的重复,并允许您堆叠可堆叠的项目。

您可以创建一个字典,如下所示:

Dictionary<key, value>();

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

在确定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是Array,我不知道你是如何声明它可变的或List双肩包。

有很多方法可以扩展逻辑,但Listwhere函数非常适合库存处理。希望这能给我们一些启示。

晚上睡个好觉后,回来阅读答案。这让我思考,我把我的两部分代码,Adding New和Adding to the Item count放在两个循环中,循环中有理想数量的插槽(5x5网格,25个插槽),但都不起作用。我之前已经尝试过其他if语句,这些语句给了我一些奇怪的行为。

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

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

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