异星工厂吧 关注:64,202贴子:418,768

数字电路[信号网络]控制生产浅析

只看楼主收藏回复

作为一个代码狗, 我想过我可能会在嵌入式, 服务器调优等各种领域运用位运算, 但是我万万没想到我第一次使用位运算居然是在打游戏.
本文介绍的内容: 如何通过位运算, 来实现信号网络中信号的复用.
(注, 如果对位运算不感兴趣, 直接跳转到构建步骤即可)
说人话就是,只使用一个Z信号,来控制factorio中的矿物的生产. 再简单点就是用Z信号来实现对存储中心的各种矿物容量的判断, 来实现达到阈值时停止采矿, 低于阈值时开始采矿.
题外话, 开始和停止采矿是对电闸的应用,本文就不做介绍了.
背景:factorio中的信号一共就不到50个.而各种产品的数目缺远远多于这个值. 如果每一个产品分配一个信号来控制产量的话, 我们也就只能控制不到50个.
我在数学上实在没有什么天赋, 整个工厂根本不平衡, 而且我还安装了机器人世界mod,用机器人来运输,避免了流水线的计算. 但是工厂还是不平衡. 于是我决定使用信号网络来控制整个工厂的生产.
---------------下面开始正题----------------
首先介绍一点点位运算的数学基础吧. 本文就是对位运算的应用.
factorio位运算中的操作一共有以下几种:
移位运算[左移, 右移]. 逻辑运算[AND, OR, XOR].(NOT运算没有被支持, 但是能够通过xor 1来模拟出来, 问题不大)
另外本文完全基于二进制的运算, 我相信大家理解二进制应该是不难的. 反正我们也不用做进制的转换.
下面是一些位运算的例子.
有一个数 0001,
左移运算就是将数的所有位, 全部往左移动n个位. 左边超出原来的长度的就会被丢弃(但是在factorio里面长度限制很大), 右边的会补0
0001 << 1 = 0010
右移运算同理,但是右移会碰到右边的边界, 数据会被丢弃(这也不重要, 丢弃的数据我们不需要).
AND运算,就是位与运算, 每一个对应的位进行与运算. 全1为1, 其他为0
0010 & 0011 = 0010
OR运算,就是位或运算, 每一个对应的位进行或运算, 有1为1, 全0为0
0010 | 0001 = 0011
------------------数学基础完毕, 我也不知道你能否理解, 但是这也不是很重要---------------------
在开始在游戏里放运算器之前, 我还需要介绍一个游戏里面的机制.
一个网络中的同种信号的多个输入回累加起来.
比如说我现在有一个矿石网络, 有三个输入Z信号的, 每一个输入的Z信号的值都是1, 那么我再从这个拿到Z信号的值的时候就变成了3.
这个机制能够方便的帮助我们进行累加操作. 比如说将铁矿仓储中心(100个储物箱组成)用缆线连接起来,就会自动的获取铁矿的数目.
-------------------开始建设----------------------
我们现在使用一个简单的5个材料的单信号网络演示.
图有点没截好, 信号网络的核心电线杆子没有整进来.
这个网络三部分组成,
上面的五个箱子+上面5个判断运算器,+ 上面的5个算术运算器构成了输入部分. 按照箱子, 判断,算术为一组连接起来.
图片外面的一个电线杆子是网络核心部分, 将算术运算器的输出端连接起来, 然后接到电线上.
下面的两排算术运算器+路灯作为输出部分. 这里我用路灯代替电闸系统.
这几排运算器从上到下在下文中的称呼分别为,
判断运算器,
左移运算器,
右移运算器,
AND运算器

下面开始系统的构造.
第一步: 摆放储物箱.
第二步, 摆放判断运算器
第三步, 连接储物箱和判断运算器, 一定要竖着连接, 并且注意要连接判断运算器的输入部分,
第四步, 修改判断条件.
这五个箱子我分别放置了一组的铁, 铜, 齿轮, 钢材, 电路板
判断条件为对应材料的数量大于等于一组.


可以看到我的输出信号全部是Z[1]
第五步, 摆放输入系统的算术运算器.
第六步, 设置算术运算器.
上半个重点来了
按照从左到右的顺序, 依次对Z信号进行 << 1,2,3,4,5的设置. 主要, 千万不要设置重复了. 输出信号设置为Z.将移位后的Z信号输出即可



第七步, 将左移运算器的输出接到电线杆上. (实际应用中, 你应该是接入一个复杂的信号网络中)

第八步, 摆放一排算术运算器
第九步, 设置算术运算器,
按照从左到右的顺序依次设置为右移>> 1,2,3,4,5和上面的左移方向相反, 数字相等即可.

第十步, 再摆放一排算术运算器
全部设置为AND 1
第十一步, 摆放一排路灯.
第十二步, 将右移运算器, AND运算器和路灯按照竖直方向连接起来, 注意一定是上一元件的输出到下一元件的输入, 不要接错了.
另外还需要将电线杆上的Z信号拿下来, 将右移运算器的输入连接起来,接到电线杆上.
第十三步, 将路灯的点亮条件设置为Z等于1
至此一个简单的单一信号复用的控制网络就建好了, 你可以修改以下判断运算器的条件, 或者控制储物箱中的数量. 你会发现对应的路灯也会随之变化.
开始构建自己的超大型控制网络吧(开始游戏编程之旅).


IP属地:湖南1楼2019-04-02 13:46回复
    萌新瑟瑟发抖


    来自Android客户端2楼2019-04-02 16:06
    回复
      2026-03-03 18:00:24
      广告
      不感兴趣
      开通SVIP免广告
      挺详细的教学,让我明白了位移和and运算的作用。多谢楼主。
      但是每种产物都能发出自己的信号不一定要转成单一信号吧。


      IP属地:海南来自Android客户端3楼2019-04-02 17:54
      收起回复
        异星只有50个信号怎么说,异星每个产品不是都有一个信号,还有字母和数字


        IP属地:福建来自手机贴吧4楼2019-04-03 06:11
        收起回复
          感谢大神


          IP属地:河南来自Android客户端5楼2019-04-03 19:11
          回复
            这年头,没点知识水平连游戏都么得玩了


            IP属地:青海来自Android客户端6楼2019-04-06 15:49
            回复
              萌新射射发抖!***玩了两百小时了还在粗狂的大量使用传送带和饱和生产!以后教育孩子给他玩这游戏。。就知道多读书了,本科的老爹肝不动了。。得特么研究生才行。。


              IP属地:广东来自Android客户端7楼2019-04-07 05:36
              回复
                借楼提一嘴,关于信号的分时复用,一个简单的模型就是建一个中心只发送时间同步信号,比如一个递增的x信号,其他的比如火车站可以当X=3的时候输出要传送的信号,这样可以避免多个信号源同名信号直接叠加的问题,同理如果考虑子网隔离可以弄个基本的路由系统,这样底层的链路层和网络层都有了就可以考虑复杂一点的控制了。


                IP属地:辽宁8楼2019-04-11 18:34
                收起回复
                  2026-03-03 17:54:24
                  广告
                  不感兴趣
                  开通SVIP免广告
                  为什么不*10 *100呢?异星的信号好像是十进制的


                  IP属地:上海9楼2019-04-13 12:19
                  收起回复
                    从缺氧 到 异星,还有今天看的 幸福工厂, 现在的游戏 都这么硬核吗? 好烧脑!


                    IP属地:重庆10楼2019-04-20 23:11
                    收起回复
                      感谢大佬


                      来自Android客户端11楼2019-04-22 14:12
                      回复
                        大神,能不能帮帮我,我不知道把哪个地方改错了。把我火车自动行驶的自动和手动哪个选项 给改没了。求求了。帮帮我吧


                        12楼2019-04-22 15:10
                        回复
                          这是游戏贴吧?!!!!


                          IP属地:河南13楼2019-05-05 00:39
                          回复
                            楼主我有个疑惑:可不可以把右移运算器给去掉,然后and运算器改成从左到右and运算1,2,4,8,16呢?如果是十进制的话就and运算1,10,100,1000,10000。


                            IP属地:广东来自Android客户端14楼2019-05-30 07:49
                            收起回复
                              2026-03-03 17:48:24
                              广告
                              不感兴趣
                              开通SVIP免广告
                              弱弱的问一下,这个有什么用


                              IP属地:河南来自Android客户端15楼2019-06-29 01:38
                              回复