2014-10-06 55 views
-1

我正在为一个侄子制作一个小型RPG游戏,并且我决定将一些任务放入混合中,而不仅仅是纯粹的战斗骷髅。我建立了一个工作库存,可以添加,移除和使用物料,但是库存中的物料只会在达到限制(25个物料)之前填满,而不会堆叠。使用for循环控制列表项目C#

我弥补这个用下面的代码:

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,如果它不是迭代到下一个列表位置并在那里添加项目。

想法?

回答

0

您的代码有几个问题。你真的应该使用if else作为你的逻辑。

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

您可以创建一个Dictionary这样的:

Dictionary<key, value>(); 

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

+0

这帮了一把,我回去重新思考我的想法。尝试使用if-else再次设法解决它,但不需要一个字典,因为一个项目有一个计数器(即ITEM.ItemCount)从默认设置为1(除非另有说明),并增加了使用码。 感谢您的回应和帮助! – 10074405 2014-10-06 12:15:41

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功能对库存处理来说非常有用。 希望这给了一些见解。

+0

似乎没有为我诚实地工作,但它确实给了我几件事情要考虑。这帮了我的忙。 谢谢! – 10074405 2014-10-06 12:13:45

0

经过一个良好的夜间睡眠,回来并阅读答案。这让我想到了,我将两段代码添加到Item中,并添加了两个for循环,其中包含理想数量的插槽(5x5网格,25个插槽),这些都无效。如果以前的陈述给了我一些奇怪的行为,我已经尝试了别的。

我拯救了整个局势有一个简单的语法变化,而不是检查,如果ITEMNAME为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

感谢您的所有帮助(即使我没有做到“不要用它们,很高兴知道人们真的帮助过)