按照fandom上的饥荒食谱系统攻略Crock Pot,我认为极有可能是如许的:
起首我们思虑食谱的类,class Recipe1.1 每个食谱拥有它必需含有的食材和必需没有的食材。
List<IngredientType> MustHave; //必需有的食材 List<IngredientType> MustNotHave; //必需没有的食材那里IngredientsType是一个enum,或者也能够用一个byte来暗示来节省内存,假设食材品种最多有258种。
1.2 每个食谱拥有它所需要的食物度
为了可拓展性,那里将那个做成一个表:
Dictionary<FoodType, float> ValueRequirements;此中FoodType是一个enum:
enum FoodType { Meat; //肉 Seafood; //海鲜 Fruit; //果 Vegetable; //蔬菜 Egg; //蛋 Sweetener; //甜剂 MonsterFoods; //怪物食物 DairyProduct; //奶成品 Bug; //虫 }好比若是某个食谱的ValueRequirements表格存储情况如下:
indexKey (FoodType)Value (float)0Meat2.01Egg1.0则那个食谱至少需要食材到达肉值2.0和蛋值1.0。
1.3 每个食谱有一个优先级属性
int Priority;//优先级2. 接下来我们考虑食材的类,class Ingredient
2.1 每种食材拥有一种它专属的食材类别,食材与食材类别为一对一。
IngredientType Type;2.2 每种食物供给一至多种食物度
那里的实现办法与上面食谱的类不异:
Dictionary<FoodType, float> ValueRequirements;例如鱼供给1.0海鲜值和0.5肉值:
IndexKey (FoodType)Value (float)0Seafood1.01Meat0.5到那里,根本上就完成了一个小型的食谱系统了。
3. 详细烹调办法
3.1 一次烹调操做会输入4个食材。
那里我们的输入是长度为4的Ingredient数组。输出是最末绝对与之婚配的食谱。
Recipe Cook(Ingredient[] ingredient);那4个食材的食物值能够相加成单个食物值表格, 成果的为sum
Dictionary<FoodType, float> sum = Sum(ingredient);那里我们的烹调系统需要已经存在一个List来贮存所有玩家能够烹调的食谱, 而且那个List始末以食谱的优先级priority排序:
List<Recipe> AllRecipes;3.2 我们创建一个List来暂时贮存所有找到的婚配食谱:
List<Recipe> MatchedRecipes = new List<Recipe>();3.3 从优先级高至低,来遍历那个List,来找到 更高优先级 可能的 所有 婚配的食谱。
3.3.1 从优先级高至低,依次遍历。
即:若是查抄完了此中一个优先级i,找到了至少一个婚配的食谱,就停行遍历优先级i-1,break。不然继续遍历i-1曲到整个List遍历完成。
3.3.2 遍历优先级i中的每一个食谱,依次查抄:
3.3.2.1 上面计算得出的sum能否满足那个食谱
3.3.2.2 查抄输入食材ingredients能否满足食谱的必需有食材MustHave和必需没有食材MustNotHave。
3.3.2.3 若是上面两项都满足,则该食谱婚配。把它参加到婚配的食谱列表matchedRecipes中。
3.4 最末从婚配食谱列表MatchedRecipes中调取随机一个食谱返回。
该食谱的产品即本次烹调的产出。
那个烹调办法的复杂度应该是O(n * m)此中n是AllRecipes的大小,即系统中所有可烹调食谱的数量,m为系统中所有食材的品种数量。
那个烹调系统应该会设定一个“最差食谱”,即在遍历完成后,必然能被婚配的食谱来根绝AllRecipes遍历完成后没有食谱婚配的情况。