作为一个代码狗, 我想过我可能会在嵌入式, 服务器调优等各种领域运用位运算, 但是我万万没想到我第一次使用位运算居然是在打游戏
.
本文介绍的内容: 如何通过位运算, 来实现信号网络中信号的复用.
(注, 如果对位运算不感兴趣, 直接跳转到构建步骤即可)
说人话就是,只使用一个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
至此一个简单的单一信号复用的控制网络就建好了, 你可以修改以下判断运算器的条件, 或者控制储物箱中的数量. 你会发现对应的路灯也会随之变化.
开始构建自己的超大型控制网络吧(开始游戏编程之旅
).
本文介绍的内容: 如何通过位运算, 来实现信号网络中信号的复用.
(注, 如果对位运算不感兴趣, 直接跳转到构建步骤即可)
说人话就是,只使用一个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
至此一个简单的单一信号复用的控制网络就建好了, 你可以修改以下判断运算器的条件, 或者控制储物箱中的数量. 你会发现对应的路灯也会随之变化.
开始构建自己的超大型控制网络吧(开始游戏编程之旅












