2014-10-06 45 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

感謝您的所有幫助(即使我沒有做到「不要用它們,很高興知道人們真的幫助過)