粒子加速器的设计方案与关键数值快捷查询

Mod版本:1.0.1。

NeoForge版本:21.1.219。

计算公式从 wiki 获得。

本文中加速器使用加速一个物品到指定速度后再注入第二个物品来触发合成的方法。

所以计算数值的选取也是针对第一个被加速的物品的。

现在已经更新如何使用两个粒子同时到一半速度的合成方法了,但数据仍然有用。乘上零点五

加速器的设计主要集中在两个目的:

    1.减少建造成本;

    2.减少完成加速所需要的时间。

请读者根据自身需求考虑。


另外附上一个最小有意义的环,对于所有小于该环的数值,并没有意义,所以不会给出。

粒子加速器的设计方案与关键数值快捷查询-第1张图片提供的转弯距离是:3.4m。

该环的最大速度是:72m/s。

72m/s速度对应的门最大门距离是:4.2m。

(图中设计会在速度大于50m/s时把粒子导入下一个环,而50m/s对应的最大门距离是3.5m)


关键节点数值

在1.0.1版本中已有的加速器配方需要的能量分别是:

能量500J1000J2500J5000J8000J10000J15000J
产物钻石辐水晶下界合金碎片过充水晶沉重核心鞘翅下界之星
产物铂粉回响碎片钚粉


黑洞
产物末影化合物





这里加粗了一些重点产物,这也是数值选取的依据。

(后续速度统一用m/s的单位,距离统一用m的单位,能量统一用J的单位,不再写出)

最小转弯距离



速度50010002500500080001000015000
距离8.912.62028.235.74048.9

建议向上取整后进行设计

最大门距离

最大门距离表明一个粒子寻找下一个门的检索范围。提高最大门距离将允许同样数量的导向环建造更大的环,这是减少建造成本的关键。

如下是各个整数距离对应的速度值,(注意!最大门距离是可以取一位小数的,该表格省略了小数点)

最大门距离2345678910
对应的速度16及以下3664100144196256324400及以上

另一个表格是基于粒子加速器速度传感器的。(因为最大门距离不会大于10,所以更大速度不会列入表格中)

最大门距离3.54.356.17.910
传感器信号345678
对应的速度5075100150250500

单环多级加速设计

把加速器分解成各个模块有利于专注设计单个可工作的单元从而简化任务。

多个环实现逐级加速可以大大减少建造成本和合成时间(这里略过计算过程)。

粒子加速器的设计方案与关键数值快捷查询-第2张图片

第一级加速模块

第一级加速的主要目的是提供一个初速度,减少后续的铺设成本,同时也大大加快了合成(如果直接低速情况下去跑大环,会有非常多的时间都是在空跑,除非大环堆叠了非常多的马达,此时并不需要后续的设计了)

可以增加这个环的大小,以获得更大的初速度,但不建议太大,因为这部分的马达并不能复用。

粒子加速器的设计方案与关键数值快捷查询-第3张图片

速度选择模块

速度传感器可以用来根据速度发出红石信号,进而可以实现根据速度去改变导向环的状态。因此可以分选出满足速度条件的粒子去更大的环。

具体还需要用到红石比较器的减法器模式来实现大于等于这个条件的判定。

粒子加速器的设计方案与关键数值快捷查询-第4张图片

如图所示是两个速度选择的模块,其条件分别是速度大于500(右边那一个)和速度大于2500。


合并模块

导向环只能一对一,但加速器中存在有两个输入一个输出的节点,此时就需要用速度传感器来改变导向环的状态以接收粒子。

由于最早的第一级加速模块使得粒子在进过传感器时必然能发出三级以上的红石信号,所以只需要这样设置就可以达到目的了粒子加速器的设计方案与关键数值快捷查询-第5张图片

合成模块

在前面速度选择模块中讲了如何实现速度条件的判定,在这里只要速度满足条件就发送一个合成物品即可实现合成。

同时其碰撞地点一定在传感器和用于合成的导向环之间,这可以用速子吸收器来回收能量。甚至发电。

粒子加速器的设计方案与关键数值快捷查询-第6张图片

值得注意的是,这里是有不同档位的,但如果要做自动合成那要么考虑翻译成档位的信号,要么直接选择最大的档位。(如果环本身不能支持这个档位速度的粒子那就会导致粒子在某个点离开环。)

顺带一提,挡位和档位是不同的词但这里不细究用法

粒子加速器的设计方案与关键数值快捷查询-第7张图片

组装方案

这里读者应该按照自己的需求去组装。(图中只实现了5000J能量的碰撞,对15000J这需要49m的转弯距离,不过可以使用50m的距离这不会增加导向环的需求但是却可以实现15000m/s的粒子定向飞出 具体思路和前面的速度选择模块一致。)

建议像图中那样共用两个边(图中绿色的部分),在这里放置的加速马达可以参与每一个环的加速过程,大大提高了利用率。

对于合成模块,一定要装在公用的边上,虽然也能装在其他边,但这并没有意义。(毕竟同时只有一个粒子被加速,合成端再多也不会加快速度)

粒子加速器的设计方案与关键数值快捷查询-第8张图片

一些提醒

注意!一定要确保用于合成的加速器的产物被及时导出,这个设计方案只会在每一轮加速进行一次合成尝试,一旦错过(如果加速器产物没有导出那加速器会拒绝接收物品)则会浪费材料。

注意!如果使用投掷器进行单个物品的发货,那要确保加速器同一时间只在处理一种配方。

注意!路径上的生物被粒子攻击时会减少粒子的速度,这可能导致设计失效。


多环的设计方案


同时加速两个物品有如下有优点

  1. 对每个环的最大速度要求降低,这减少了转弯半径的需求也就降低了占地面积,优化的设计可能减少需要强制加载区块的数量

  2. 因为最大速度的降低,加速时间也降低了,这种时间节约不同于前面优化设计(前面的设计只能减少空跑的时间)

但也有如下缺点:

  1. 增加了建造成本

  2. 增加了建造难度(作业不好抄了)


要想实现粒子对撞,即在一个环中以相反的方向运动(在多环的设计中需要额外考虑)

多环加速的重点是让粒子能保持某个速度。

前面单环多级加速的设计可以在这里使用。

一个测试得到的事实是,对固定的双环对撞设计,产物总是固定在一个加速器中

接下来以500m/s的环合成1000J的配方为例子。


多环加速的原始版本

当粒子达到预定速度后让其离开加速环进入存储环等待碰撞即可。

(存储环的粒子如果击中实体则会减少速度,这在实际铺设中需要注意)

(要注意注入存储环的粒子的运动方向,只有对撞才能合成。)

粒子加速器的设计方案与关键数值快捷查询-第9张图片

粒子加速器的设计方案与关键数值快捷查询-第10张图片

多环加速的进阶版本

存储环和加速环可以有共用的部分,如图就是一个简单的设计,在加速前先根据速度选择是否经过加速马达的边。

最终这种设计会让速度稳定在设计的值(这个值取决于前面的速度选择模块)所以还能拿来破坏方块或者处死生物?

粒子加速器的设计方案与关键数值快捷查询-第11张图片

而碰撞模块就需要确保两个粒子都达到预定速度

这等价于粒子经过存储的环,在这里简单做一个同时满足的条件判断电路(and)再通过 这个结果让粒子得以注入。)

图中粉色部分就是上述功能实现的模块,(测试发现粒子总在绿色的位置碰撞,这是跟电路时序有关的一个信息)

粒子加速器的设计方案与关键数值快捷查询-第12张图片粒子加速器的设计方案与关键数值快捷查询-第13张图片

最后如果想要进一步压缩空间可以考虑重叠一部分区域,但要确保电路能够铺设 以及还需要一些关于碰撞模块的设计。

粒子加速器的设计方案与关键数值快捷查询-第14张图片

程序模拟带来的结论

使用py程序模拟,其中第一加速环是固定的2个马达。

考虑了马达作用的那部分时间。

其余环在可以容纳的情况下公用马达,在马达数量大于环长度的情况下只使用环的长度的马达。

仅仅考虑了50m/s;500m/s;2500m/s;5000m/s的环的组合,并没有考虑所有可以被分离的速度。

省流版本

不要建造末速度小于500m/s的环。

一个500m/s的环配上2500m/s或者5000m/s 亦或同时配备多级加速是一个不错的选择。

当可以用的马达可以直接填满整个环的时候,多级加速没有意义。(因为,多级加速能节约的那部分时间就是粒子空跑而不被加速的时间,如今这部分时间本就不存在的话也不存在优化了。)

详细版本

图中第n行(从1开始数)代表了(n-1)的二进制表示分级加速的选取方案 。(最大的15000m/s的环总是选取,因为没这个不可能加速到15000m/s)

而第17行则表示使用了多少个共用的马达。(这和从1开始数的列是一样的)

(m1m2m3m4)2中各位意义如下,其中零代表未选取,而1代表选取。

m1(最高位):5000m/s末速度的环;

m2:2500m/s末速度的环;

m3:500m/s末速度的环;

m4(最低位):50m/s末速度的环。

(这里v m/s末速度的环指的是按照这个速度得到的最小拐弯半径对应的环)

表格内部的数据是直接加速到15000m/s和分级加速到15000m/s所用时间的比值,按照小于1,从1到2,从2到3,大于3分别用蓝色,黄色,橙色,红色作为背景。

粒子加速器的设计方案与关键数值快捷查询-第15张图片

粒子加速器的设计方案与关键数值快捷查询-第16张图片

粒子加速器的设计方案与关键数值快捷查询-第17张图片

粒子加速器的设计方案与关键数值快捷查询-第18张图片

粒子加速器的设计方案与关键数值快捷查询-第19张图片

如图可知,50m/s的环总是拖累整体。(具体表现就是所有偶数行的数值都要小一些)

第7,11,15行的数字都要高一些。(对应的意义是,500m/s和2500m/s的环;以及500m/s和5000m/s的环;还有500m/s,2500m/s和5000m/s的环实现的多级加速效果更好)

使用的代码

有没有大神来数学推理一下?

'''
a代表了共用马达的数量
t1代表的是直接加速直到15000m/s使用的时间
t2代表的是多级加速直到15000m/s使用的时间
v代表速度
p代表周长 其中分别用了 500m/s需要的 2500m/s 需要的 5000m/s需要的 还有15000m/s需要的
x代表在环上的距离
MAX代表最多马达数量(实际上如果MAX超过了边长乘2则此时并不对应于共用两个边的加速器的情况,但在小于的时候仍然是正确的)
ans[m][n]其中 m的二进制表示分别代表了那些环是被选取的,而n从0到MAX-1代表了 使用1到MAX个共用马达时的时间比(t1/t2)
具体来说 m的二进制表示 m1m2m3m4 中 m1代表了5000m/s的环 m2代表了2500m/s的环 m3代表了500m/s的环 m4代表了 50m/s的环
比如对 1111就是使用了五个环 而 1110就是去除了50m/s的环。 1011就是去除了2500m/s的环
假设x取0到a-1的时候都是被加速,a到p是空跑
在计算时间前先加a是因为设计的线路通常都是先让粒子去加速一次然后再开始跑圈
因为第一级加速固定了距离和马达所以用时其实也是固定的
没有考虑小数精度问题
没有考虑具体加速马达是如何工作的(此处按最坏情况也就是在离开加速马达时候才被加速)
并没有考虑游戏实际运行的细节之类的,仅仅是数学模型。
并没有考虑所有能达到的末速度,这里只有速度传感器配合红石比较器可以产生不同红石信号才可以达到分离这个末速度。
'''

p = {500: 38,2500: 80,5000: 116,15000: 196}
MAX = 50
ans =[[0]*MAX for i in range(16)]
for k in range(16):
    print(f"正在进行第{k}次")
    for a in range(1,MAX+1):
        t1,t2 = 0,0
        v = 1
        x = 0
        while(v<15000):
            if x < a:
                x  += 1
                t1 += 1/v
                v  += 1
            else:
                x  += 1
                t1 += 1/v
            if x == p[15000]:
                x = 0
        v = 1
        x = 0
        while(v<15000):
            if v<=50 and k & (1 << 0):
                if x < 2:
                    x  += 1
                    t2 += 1/v
                    v  += 1
                else:
                    x  += 1
                    t2 += 1/v
                if x == 13:
                    x = 0
            elif v<=500 and k & (1 << 1):
                if x < min(a,p[500]):
                    x  += 1
                    t2 += 1/v
                    v  += 1
                else:
                    x  += 1
                    t2 += 1/v
                if x == p[500]:
                    x = 0
            elif v<=2500 and k & (1 << 2):
                if x < min(a,p[2500]):
                    x  += 1
                    t2 += 1/v
                    v  += 1
                else:
                    x  += 1
                    t2 += 1/v
                if x == p[2500]:
                    x = 0
            elif v<=5000 and k & (1 << 3):
                if x < min(a,p[5000]):
                    x  += 1
                    t2 += 1/v
                    v  += 1
                else:
                    x  += 1
                    t2 += 1/v
                if x == p[5000]:
                    x = 0 
            else:
                if x < a:
                    x  += 1
                    t2 += 1/v
                    v  += 1
                else:
                    x  += 1
                    t2 += 1/v
                if x == p[15000]:
                    x = 0
        ans[k][a-1] = t1/t2
print(ans)

#也可以用其他方法显示结果,比如用openpyxl写成Excel表格