流水线合成材料依赖表的生成算法

2023-11-06

前不久玩了一个烧脑的游戏"异星工厂",就是开局一农民,然后通过建造自动化的流水线,最后合成宇宙飞船飞回故乡的故事.其中自动化的流水线需要玩家自己规划,比如这样的:

 

下面的这个是游戏中的一个物品"电力机械臂"的合成配方:

可以看到,这里合成一个"电力机械臂",需要"齿轮","铁板","电路板"这三种材料,而铁板又是由铁矿直接加工而成的,但是电路板的合成就很复杂了.

纵使有一本手册大全,也是无法对游戏提供帮助的,看下游戏开局地图:

矿产的位置很固定,因此无法对生产线的规划起到作用.

但是,如果能从原材料出发,逐渐合成愈加复杂的物品,直至最后的宇宙飞船,这样就对流水线的规划有了一定的参考作用,而这个算法也是解决这个问题的.

输入:

产品,原料1,原料2....

(输入数据为无限可列个,如果没有原料,则表示产品为可以直接获得的,无需合成)

输出:

从原材料出发,直至合成所有的物品的依赖图

下面是我做的一个例子:

输入:

iron_ore, #这里iron_ore为铁矿,是可以从游戏地图上直接获得的,无需材料合成
copper_ore,
copper_cable,copper_plate #这里铜线copper_cable,需要铜板copper_plate合成,而铜板是由下面的那个公式合成来的
copper_plate,copper_ore
iron_plate,iron_ore
electronic_circuit,iron_plate,copper_plate
iron_gear_wheel,iron_plate
inserter,electronic_circuit,iron_gear_wheel,iron_plate
science_pack_1,copper_plate,iron_gear_wheel
transport_belt,iron_plate,iron_gear_wheel

输出:

类似这样的图:

从左下角的iron_ore(铁矿)与copper_ore(铜矿),逐渐向右上方依次合成,直至合成全部产品.

代码:

import matplotlib.pyplot as plt

file = open("connections.txt", 'r')#这里的connections.txt就是一个文本,文本内容为上面输入的数据
# 原材料,用于记录原料与遍历结束后的绘图,不同层级用"##"分割
raw_material = []
# 待筛选的产品
products = []
# 绘图中的直线记录列表
line_plot = []
# 记录每一层的个数
each_level_num = []

num_in_this_level = 0
for line in file:
    line = str(line).strip("\n").split(",")
    line = [i for i in line if i]
    print(line)
    if len(line) == 1:
        raw_material.append(",".join(line))
        num_in_this_level += 1
    else:
        products.append(line)
file.close()
raw_material.append("###")
each_level_num.append(num_in_this_level)
while len(products):
    num_in_this_level = 0
    # pro:每一个待筛选产品,list
    for pro in products:
        # module:待筛选产品的组件,str
        module_in_num = 0
        for module in pro[1:]:
            module = module.replace(" ", '')
            if module in raw_material:
                module_in_num += 1
            else:
                break
            if module_in_num == len(pro) - 1:
                raw_material.append(pro[0])
                num_in_this_level += 1
                products.remove(pro)
                # 开始记录绘图的直线指向坐标
                line = []
                for module in pro[1:]:
                    target = raw_material.index(module)
                    line.append(target)
                line_plot.append(line)
    raw_material.append("###")
    each_level_num.append(int(num_in_this_level))

# raw_material生成结束,开始绘图
# 当前层数
level = 0
# 当前层中的位置
num_in_this_level = 0
# line_plot中应该绘制的下标
plt_num = 0
for material in raw_material:
    if material == "###":
        level += 1
        num_in_this_level = 0
        continue
    plt.text(level * 10, 10 * num_in_this_level + (level + 1) * 7, material)
    # print("描点" + material, level * 10, 10 * num_in_this_level + (level + 1) * 7)
    if level > 0:
        # 开始绘图
        targets = line_plot[plt_num]
        plt_num += 1
        # target为每一个需要相连的下标
        for target in targets:
            # target_level为目标层级
            target_level = 0
            for level_num in each_level_num:
                if target > level_num:
                    target -= level_num
                    target -= 1
                    target_level += 1
                else:
                    plt.plot([target_level * 10, level * 10],
                             [target * 10 + (target_level + 1) * 7, 10 * num_in_this_level + 7 * (level + 1)])
                    # print("划线")
                    # print([target_level * 5, target * 10 + (target_level + 1) * 7],
                    #       [level * 10, 10 * num_in_this_level + 7 * (level + 1)])
                    break
    num_in_this_level += 1
plt.show()

这里通过matplotlib.pyplot来绘图.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

流水线合成材料依赖表的生成算法 的相关文章

随机推荐

  • Java JDK1.8中类常量池、运行时常量池、字符串常量池所处区域

    类常量池 诞生时间 编译时 所处区域 方法区 类常量池存在Class文件中 一个Class文件对应一个类常量池 储存内容 符号引用和字面量 字符串常量池 诞生时间 编译时 所处区域 堆 储存内容 堆内的字符串对象的引用和字符串常量 运行时常
  • untiy AVProVideo 判断视频是否加载完成,可以播放

    我的插件版本是5 3 不同版本API可能会不同 如果一开就跳转视频 会因为视频没有加载完 导致跳转失败 因此必须等待视频加载完再进行跳转 可以直接等一小会再跳转 但是如果固定等待时间的话 一是每个视频加载耗时不一样 不能精确控制 而是由明显
  • 线性表的顺序结构,C语言实现

    线性表的顺序结构 C语言实现 include
  • C++中operator关键字(重载操作符)

    C 中operator关键字 重载操作符 C 编程语言中重载运算符 operator 介绍 C 编程语言中赋值运算符重载函数 operator 介绍 operator operator operator 操作符重载 参考 C 编程语言中赋值
  • 后端即服务BaaS

    Bmob LeanCloud 腾讯TAB APICloud 作为移动开发者 你应该了解Baas 后端即服务 移动端免费可用的BaaS接入方案 通过Bmob Android轻松制作一个APP Android高效率编码 第三方SDK详解系列 二
  • Multi-Object Tracking with Multiple Cues and Switcher-Aware Classification 论文笔记

    Multi Object Tracking with Multiple Cues and Switcher Aware Classification 似乎是商汤投 CVPR2019的论文 文中提出了一个统一的多目标跟踪 MOT 框架 学习充
  • MFC实现图片浏览器

    MFC实现图片浏览器 源代码可以加微信 DDDDYKAJ 一 功能介绍 该程序是基于对话框的图片管理的程序 改程序有以下几个功能 1 获取加载图片的图片数目 2 按下 下一张 浏览所有图片 3 图片按照序号定位 并显示 4 获取每一张图片的
  • 前端练习项目

    30 Web Projects 30 多个带有 HTML CSS 和 JavaScript 的 Web 项目 由 Packt Publishing 提供 https github com PacktPublishing 30 Web Pro
  • Greenplum 查看连接与锁信息数据字典

    Greenplum 查看连接与锁信息数据字典 目录 查看系统中会话 连接 SQL与锁情况 1 查看当前活动的客户端连接数 2 查询客户端连接的情况 3 查看持有锁和等待锁的一些信息 已经修改验证 4 查询系统中正在执行的或者等待执行的事务
  • 怎么给word文档注音_怎么为整篇word文字添加拼音标注

    类型 教育学习大小 21 8M语言 中文 评分 10 0 标签 立即下载 有时候一篇文章时给小朋友或者中文初学者看的 那么怎样给整篇文章每个字批量添加拼音标注呢 下面小编就来教一下大家 由于对word宏命令不太熟悉 我将个任务分解为三部分
  • 使用Opencv+Python的AR小demo

    摘要 浅浅了解一下 Python OpenCV 试着给自己的 iphone 8 做一下相机标定 github 源码 https github com aeeeeeep OpenCvArDemo 定义 增强现实 AR 是一种真实世界环境的交互
  • java 读取svg_Java Batik操作SVG,实现svg读取,生成,动态操作

    SVG在现在的应用场景中还是很常见的 例如绘制复杂的矢量图形 说到SVG 就不得提下Canvas 在这里我就不详细列举它们之间的不同之处 以及为什么要选择SVG或Canvas了 首先 我的项目是一个Maven项目 所以只需要导入batik的
  • Vuex的简单使用--累加器

    简介 Vuex 是一个专为 Vue js 应用程序开发的 状态管理模式 它采用集中式存储管理应用的所有组件的状态 并以相应的规则保证状态以一种可预测的方式发生变化 安装 在项目根目录执行如下命令来安装 Vuex依赖包 npm install
  • Windows10通过局域网共享文件的方法

    要实现局域网共享 必须两台电脑必须在同一个网段 就是要同时连接同一个路由器 两台电脑最好都使用以下设置 在主电脑和需要复制文件的电脑中 点击 开始 菜单 选择 设置 打开后点击 网络 选择共享中心 在主电脑中需要共享的文件夹中做以下设置 要
  • ROS STAGE教程2(地图定义和GMAPPING建图)

    目前用在ROS Kinetic上的stage版本为4 1 官方教程http rtv github io Stage modules html 用户可以用stage或者gazebo来创建地图和机器人 传感器模型来进行仿真 并与自己的SLAM模
  • 在运行hive时报错 权限问题

    在运行hive时报错 tmp hive on HDFS should be writable Current permissions are rwx 这是 tmp hive文件夹权限不够 须要提升权限 操作例如以下命令就可以解决这个问题 h
  • R语言如何导入数据

    在使用R的时候 我们肯定需要导入数据 现在总结一下如何导入不同类型的数据 1 使用键盘输入数据 在导入数据比较少的时候 我们使用这种方法 R中的函数 edit 会自动调用一个允许手动输入数据的文本编辑器 具体步骤如下 1 创建一个空数据框
  • python基础(第六章)文件读写+算法

    文件读写 1 文件 1 Python2 File Python3 TextIOWrapper 2 一定要有file文件路径 路径 文件名 文件格式 否则 TypeError Required argument file pos 1 not
  • 记录基于STM32的独轮车测试板构建(一)电机篇

    今年是学校第一次参加智能车竞赛 毫无传承下想要脱颖而出那必定得先发制人 预选的是独轮车组 得用完全陌生的英飞凌单片机搞全新的独轮车模 难度不小 前些天看了看龙邱的库 在配套的母版上确实很简单好用 但独轮车母版和配套工程还不知道啥时候才有 如
  • 流水线合成材料依赖表的生成算法

    前不久玩了一个烧脑的游戏 异星工厂 就是开局一农民 然后通过建造自动化的流水线 最后合成宇宙飞船飞回故乡的故事 其中自动化的流水线需要玩家自己规划 比如这样的 下面的这个是游戏中的一个物品 电力机械臂 的合成配方 可以看到 这里合成一个 电