C#Crafting Logic

时间:2014-04-22 00:06:01

标签: c# list dictionary unity3d

有很多类似的问题,但没有一个明确的答案。我正在使用Unity3D引擎来创建游戏。我已经设置了一个库存系统,其中包含添加项目,删除项目和检查库存是否包含一定数量项目的方法。

我想要做的是每次更新,循环浏览项目,如果玩家拥有制作配方所需的项目,则显示添加一个按钮,玩家可以点击该按钮来制作新项目。< / p>

我以为我可以使用词典来存储所需的物品和数量。像这样:

    public static Dictionary<string, int> sword = new Dictionary<string, int>() {
        {"stone", 2},
        {"Wood", 1}
    };

    public static Dictionary<string, int> plank = new Dictionary<string, int>() {
        {"Wood", 5}
    };

但我还需要一种方法来存储所有食谱并循环它们。像字典词典。所以我可以遍历所有制作项目名称。我能做类似的事吗?

public static Dictionary<string, Dictionary> recipes = new Dictionary<string, int>() {
    {"Wood Sword", sword},
    {"Wood Plank", plank}
};

我希望能够在一个类文件中定义所有配方,并在另一个类文件中循环它们。

我没有太多使用c#的经验,所以我不擅长使用列表和词典,所以我很感激任何建议和帮助。

谢谢!

3 个答案:

答案 0 :(得分:0)

嗯..根据你的规格,我想出了类似的东西:

    public enum Ingredient = { Wood, Stone, Water, Gold/*and so on*/ };

    public class RecipeItem 
    {
            public Ingredient Ingredient{ get; set;}
            public int Amount {get; set;}
    }

    public class Recipe
    {
            public string Name {get; set;}
            public List<RecipeItem> RecipeItems {get;set;}
    }

定义食谱时代码中的某处:

    var recipes = new List<Recipe>(){
            new Recipe(){
                    Name = "Wood Sword",
                    RecipeItems = new List<RecipeItem>(){
                            new RecipeItem(){
                                    Ingredient = Wood,
                                    Amount = 1
                            },
                            new RecipeItem(){
                                    Ingredient = Stone,
                                    Amount = 5
                            }

                    }
            },
            new Recipe(){
                    Name = "Plank",
                    RecipeItems = new List<RecipeItem>(){
                            new RecipeItem(){
                                    Ingredient = Wood,
                                    Amount = 5
                            }

                    }
            }
            // More recipes
    };

PS:我建议你花几天时间学习C#的基础知识

答案 1 :(得分:0)

您正在寻找的内容类似Dictionary<string, Dictionary<string, int>> - Dictionarystring键和Dictionary<string, int>值。像这样初始化它:

var recipes = new Dictionary<string, Dictionary<string, int>>
{
    { "Sword", new Dictionary<string, int> { { "stone", 2 }, { "wood", 1 } } },
    { "Plank", new Dictionary<string, int> { { "wood", 5 } } }
};

我个人觉得有点沉重,容​​易搞砸。我更倾向于使用结构来保持内部结构,例如:

public struct RecipeComponent
{
    public readonly string Material;
    public readonly int Count;

    public RecipeComponent(string material, int count)
    {
        Material = material;
        Count = count;
    }   
}

public readonly Dictionary<string, RecipeComponent[]> recipes = new Dictionary<string, RecipeComponent[]>
{
    { "Sword", new[] { new RecipeComponent("stone", 2), new RecipeComponent("Wood", 1) } },
    { "Plank", new[] { new RecipeComponent("Wood", 5) } }
};

稍微强一些,但您仍然可以在运行时操作recipes列表的内容,包括替换所需组件的列表。 ReadOnlyDictionary有助于解决这个问题。

答案 2 :(得分:0)

到目前为止(对我而言),最简单的方法是使用通用列表和for循环。 第一:使用此功能检查物品是否在库存中 public bool CheckItems(列表检查){

List<Item> it = new List<Item> (check);// Make sure original list is not changed.
        foreach(Item inventoryItem in myItems) {// Loop through your INVENTORY's items.
            if (it.Contains(inventoryItem)) {//If contains, remove.
                it.Remove(inventoryItem);
                if(it.Count == 0) {
                    return true; //When the count is less than zero, you can craft the item.
                }
            }
        }
        return false;
    }

这只需要在工艺函数中调用,如果返回true,则可以制作项目。 注意:检查清单是工艺所需的项目清单,myItems是清单中的项目清单。