游戏元素合成配方的图数据结构选型咨询
合成游戏配方的图数据结构设计方案
核心思路
引入配方节点作为原料与产物之间的中间层,替代直接从原料到产物的定向边。每个配方节点对应一条完整的合成规则,以此解决单一原料节点到产物节点无法记录配对原料的问题。
结构定义
节点类型
- 元素节点:代表所有可作为原料或产物的游戏元素,比如
bird、metal、egg、airplane。 - 配方节点:代表一条具体的合成规则,每条规则对应唯一的配方节点(即使产物相同,原料组合/顺序不同也对应不同的配方节点)。
边的规则
- 元素节点 → 配方节点:表示该元素是此配方的有序原料之一(顺序敏感,比如
metal+bird和bird+metal对应不同的配方节点)。每个配方节点必须连接且仅连接两个元素节点(允许两个节点为同一元素,比如bird+bird)。 - 配方节点 → 元素节点:表示该配方的产物是此元素(支持一个配方生成多个产物的场景)。
对应示例配方的结构
以你的示例为例:
bird + bird = egg:bird→ 配方节点R0 ←bird,R0 →eggmetal + bird = airplane:metal→ 配方节点R1 ←bird,R1 →airplanesky + bird =/= airplane:
不存在从sky→R←bird且R→airplane的结构,因此该组合无法合成飞机。
其余生成airplane的配方(metal+air、metal+sky、bird+engine),各自对应独立的配方节点R2、R3、R4,每个节点都定向连接到airplane元素节点。
结构优势
- 完全适配你的三条配方规则:
- 强制每个配方节点绑定两个原料元素(支持同种元素);
- 单一产物元素可连接多个配方节点,对应多种合成路径;
- 单一配方节点可连接多个产物元素,实现多产物合成。
- 精确区分原料顺序:不同顺序的原料组合对应不同配方节点,解决非对称合成的问题;
- 扩展性强:可在配方节点上附加额外属性(比如合成耗时、所需工具、解锁条件等)。
伪代码实现示例
class ElementNode: def __init__(self, name): self.name = name # 存储所有以该元素为原料的配方节点 self.linked_recipes = [] class RecipeNode: def __init__(self, recipe_id): self.recipe_id = recipe_id # 有序存储两个原料元素节点 self.ingredients = [] # 存储所有产物元素节点 self.products = [] # 可选附加属性 self.craft_time = 0 self.required_tool = None
内容的提问来源于stack exchange,提问作者bit_n
相关产品推荐
相关产品推荐

