使用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,以及是否只是迭代到下一个列表位置并在那里添加项目。
想法?
您的代码有一些问题。您真的应该使用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
感谢您的帮助(即使我没有使用它们,也很高兴知道有人真正帮助我)