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

时间:2014-10-06 02:10:30

标签: c# for-loop unity3d

我正在为一个侄子做一个小型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,如果它不是迭代到下一个列表位置并添加那里的项目。

想法?

3 个答案:

答案 0 :(得分:0)

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

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

您可以像这样创建Dictionary

Dictionary<key, value>();

key将是您的项目,值应为堆栈。

答案 1 :(得分:0)

我会在确定它是否存在之前完成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;
  }

}

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

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

答案 2 :(得分:0)

经过一夜好眠,回来看看答案。它让我思考,我把我的两段代码,添加新的和添加到项目计数在两个for循环中具有理想的插槽数量(5x5网格,25个插槽),这是没有用的。如果先前的陈述给了我一些奇怪的行为,我已经尝试过了。

我通过一个简单的语法更改来纠正整个情况,而不是检查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

感谢您的帮助(即使我没有使用它们,知道人们实际帮助也很棒)