《饥荒》中的烹调食谱系统,实现逻辑是如何的?

4周前 (01-09 14:27)阅读1回复0
kewenda
kewenda
  • 管理员
  • 注册排名1
  • 经验值125745
  • 级别管理员
  • 主题25149
  • 回复0
楼主

按照fandom上的饥荒食谱系统攻略Crock Pot,我认为极有可能是如许的:

起首我们思虑食谱的类,class Recipe

1.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遍历完成后没有食谱婚配的情况。

0
回帖

《饥荒》中的烹调食谱系统,实现逻辑是如何的? 期待您的回复!

取消
载入表情清单……
载入颜色清单……
插入网络图片

取消确定

图片上传中
编辑器信息
提示信息