お世話になっております。
Unity2021+C#+RPGフレームワークのクラフトシステムで、OverCook2のような料理ゲームを作っています。
素材ベースから絞り込んだレシピを組み立てる手法について分からないので相談させてください。
クラフトシステムにはレシピがあります。
レシピには素材のリストがあります。
C#
1List<Item> ingredientsList = recipe.ingredientsList 2Item outcomeItem = recipe.outcome
といった形です。
レシピから素材が足りているかをチェックし、足りていればクラフトするという、レシピベースのクラフトは普通に可能です。
しかし、皿には先に素材から乗せていきます。
素材を起点として、作れるレシピを絞り込んで、足りた時点で自動でクラフトするという手法がうまく実現出来ず悩んでいます。
たとえばこのようなレシピがあるとします。
recipe | outcome | ingredient |
---|---|---|
c | c | a,b |
d | d | c,e |
g | g | d,f |
dから見るとaはcの材料なので、aやbは孫材料と呼ぶとします。
おなじくdから見てcやeは子材料と呼ぶとします。
そこで、皿に最初にfを入れた場合、全レシピから
C#
1List<recipe> allRecipeList.Where(x => x.ingredientsList.name == f.name)
でレシピはgのみに絞り込めるので、次に入れられる材料が確定し、dを持てばrecipe.useでクラフト可能です。
しかし、ここでdではなく孫材料であるaが皿に入った時、孫材料である、という判別のしかたが分かりません。
さらに、可能性のある対象レシピの子材料でも孫材料でもないものは皿に入れられないように弾きたいです。
また、f->aと皿に入れた後に、次に受け入れ可能なのはbとdとeのみに制限したい(cは既に孫材料であるaが皿にあるため持てない)という仕様にしたいのですが、
その実現方法が分かりません。
f,a,dが皿に入った場合は、次に受け入れ可能なのはbのみです。
つまり、孫材料が皿に入っている場合は、子材料は弾きたいという事です。
recipe | outcome | ingredient |
---|---|---|
かけうどん | かけうどん | 茹でたうどん,かけスープ |
わかめうどん | わかめうどん | かけうどん,わかめ |
わかめエビうどん | わかめエビうどん | わかめうどん,エビ |
の場合、エビと茹でたうどんが皿にある場合は、かけうどんは(茹でたうどんが既に皿にあるため)持てないようにしたいという事です。
このような挙動を解決したい場合、どのような手法でググればよいかなどが分かりません。
何かパターン名や再帰、LinqのSelectManyやGroupBy、集合などで解決出来そうな気はしているのですが、あちらが解決すればこちらが実現出来ないなどで
グルグルと混乱してしまい悩んでいます。
どなたか解決方法を教えていただけないでしょうか?
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/04/01 12:59 編集
2022/04/01 14:03 編集