石橋を叩いて壊すページ

ゼロから始めるFactorioの回路構築(条件回路編)

前回に引き続きさらにFactorioの回路の話。
Factorioで「回路ネットワーク」の研究を完了させると、ケーブルやチェストのほかに「定数回路」「算術回路」「条件回路」が使用可能になる。
定数回路と算術回路の使い方については前回の記事に書いた。今回は条件回路の使い方について書く。

基本編 > 入力・出力・混合編 > 定数・算術回路編 > 条件回路編 > 実践例編 > 累積回路編

条件回路

条件回路には条件を設定することができ、条件がYESと判断された場合、指定された信号を出力する。 例えば「鉄板が200枚以上なら、『木材が1』を出力する」などである。
基本編では「条件がYESと判断されたら、ランプを光らせる」というお題を作ったが、 それの光ではなく信号を出すバージョンと考えて良い。


チェストの中の鉄板が200枚以上なら「木材が1」を出力する条件回路の設定例。

基本編にも書いたとおり、条件を判断してランプを光らせるには、ランプに条件を直接指定すればよかった。
しかし、条件が複雑な場合はランプでは対応できない。 例えば「鉄板が100枚以上、なおかつ、銅板が100枚以上の場合にランプを光らせる」という条件はランプには設定できない。

条件回路は入力された信号をもとに判断をして結果を信号として出力するので、 複数の条件回路を使って複数の判断を行い、それらの判断結果を組み合わせることで、 「鉄板が100枚以上、なおかつ、銅板が100枚以上の場合にランプを光らせる」のような複雑な条件判断をすることができる。

では実際に「鉄板が100枚以上、なおかつ、銅板が100枚以上の場合にランプを光らせる」をやってみよう。


実際に「鉄板が100枚以上、なおかつ、銅板が100枚以上の場合にランプを光らせる」をやってみた回路。
(1)1台目の条件回路は「鉄板が100枚以上なら、木材が1を出力」する。
(2)2台目の条件回路は「銅板が100枚以上なら、木材が1を出力」する。
(3)以前の記事に書いたとおり、1つの回路に複数の出力があると信号は足し算されるので、 上記(1)(2)の出力が足し算され「木材が2」の信号となる。
(4)ランプには「木材=2」の条件を指定してあるので、両方の条件が成立した際にランプが光る。

この例では、チェストからの信号を2台の条件回路が判断して信号を出力し、 さらにその信号をランプが受け取り値を判断することでランプを点灯/消灯させている。
一見すると難しいが、「チェストの出力を2台の条件回路が判断する」、 「2台の条件回路の出力をランプが判断する」という2段階で動作しているということに気づけば、 それぞれの工程はとてもシンプルなことをしているに過ぎない。

「なおかつ」以外の条件の組み合わせ方

上記では「鉄板が100枚以上、なおかつ、銅板が100枚以上の場合」にランプを光らせた。
ではこれの応用で、「鉄板が100枚以上、または、銅板が100枚以上の場合」、 言い換えれば鉄板か銅板のどちらか一方でも100枚以上ならランプが光るようにすることを考えてみよう。

慣れない人には難しい話だと思うが、実はやることは上記例のうちランプの作動条件を変えるだけである。以下をご覧いただきたい。


実際に「鉄板が100枚以上、または、銅板が100枚以上の場合にランプを光らせる」をやってみた回路。
(1)1台目の条件回路は「鉄板が100枚以上なら、木材が1を出力」する。
(2)2台目の条件回路は「銅板が100枚以上なら、木材が1を出力」する。
(3)以前の記事に書いたとおり、1つの回路に複数の出力があると信号は足し算されるので、 上記(1)(2)の出力が足し算される。
(4)ランプには「木材≧1」の条件を指定してあるので、上記のどちらか片方または両方の条件が成立した際にランプが光る。

上記の例の場合、
もし鉄板が100枚、銅板が99枚なら、(1)の条件だけが成立して結果は「木材が1」の信号となり、
もし鉄板が99枚、銅板が100枚なら、(2)の条件だけが成立して結果は「木材が1」の信号となり、
もし鉄板と銅板がともに100枚なら、(1)と(2)の条件が共に成立して信号が足し算され結果は「木材が2」の信号となる。
ランプの点灯条件は木材≧1なので、よって鉄板か銅板のどちらか一方または両方が100枚以上の時ランプが光ることになる。

これをさらに応用すれば、以下のような判断をする回路も構築できる。

  • 鉄板と銅板のどちらも100枚より少ない時にランプを光らせたい
    →上記の回路をベースに、ランプの作動条件を「木材=0」にする。
  • 鉄板と銅板のどちらか片方だけが100枚以上の時にランプを光らせたい
    →上記の回路をベースに、ランプの作動条件を「木材=1」にする。
  • 鉄板・銅板・鋼鉄・プラスチックのうちいずれか2つ以上が100個以上ある時にランプを光らせたい
    →上記の回路をベースに、条件回路を鉄板用・銅板用・鋼鉄用・プラスチック用の4台に増やし、さらにランプの作動条件を「木材≧2」にする。

「すべて」「いずれか」「それぞれ」条件

算術回路に特殊なアイテム「それぞれ」があったのと同様に、 条件回路にも「それぞれ」がある。 また「すべて」と「いずれか」という特殊なアイテムもある。
これらについてみていこう。

それぞれ」は入力されているそれぞれの信号が条件を満たしているかを判断する。
例えば「鉄板が100、銅板が50、プラスチックが30」という信号が入力されているとき、 「それぞれの信号が≧50ならそれぞれ出力」と設定しておくと、 鉄板・銅板・プラスチックごとにそれぞれ「50以上か」という条件が判定され、 最終的に「鉄板が100、銅板が50」という信号が出力される。
「プラスチックが30」は「50以上」ではないので、出力に含まれない。

すべて」は入力されているすべての信号が条件を満たしているかを判断する。
例えば「鉄板が100、銅板が60、プラスチックが30」という信号が入力されているとき、 「すべての信号が≧50ならすべて出力」と設定しておくと、何も出力されなくなる。
なぜなら、入力されている信号のうち「プラスチックが30」は「50以上」ではないので、 「すべての信号が」条件を満たしてはいないからである。
ここでプラスチックを50に増やすと「すべての信号が」条件を満たした状態になるので、 最終的に「鉄板が100、銅板が60、プラスチックが50」という信号が出力される。

いずれか」は入力されているいずれかの信号が条件を満たしているかを判断する。
例えば「鉄板が100、銅板が50、プラスチックが30」という信号が入力されているとき、 「いずれかの信号が≧60ならすべて出力」と設定しておくと、「鉄板が100、銅板が50、プラスチックが30」が出力される。
なぜなら、入力されている信号のうち「鉄板が100」は「60以上」なので、 「いずれかの信号が」条件を満たしているからである。
ここで鉄板を50に減らすと、「いずれかの信号が」条件を満たした状態ではなくなるので、最終的に何も出力されなくなる。

なお算術回路の説明でゼロは無視されると書いたが、条件回路においても同様にゼロは無視されるので注意が必要である。
例えばこのページの最上部で「鉄板が100枚以上、なおかつ、銅板が100枚以上の場合にランプを光らせる」というお題を実行したが、 ではこれを特殊アイテムを使って「すべての信号が100以上の場合にランプを光らせる」と置き換えたらどうなるだろうか。
答えは、「鉄板が0、銅板が100」という信号が入力された際にランプが光ってしまう。 ゼロは無視されるので「銅板が100」の信号だけが存在している扱いになり、 その銅板の値が100以上なので「すべての信号が条件を満たしている」と判断されるためである。
また、「鉄板が100、銅板が100、プラスチックが50」という信号が入力された場合は、 鉄板と銅板が100枚以上であるにも関わらず「すべての信号が100以上」ではないためランプが光らないといった問題も起こる。
入力される信号が「鉄板も銅板もゼロにならない、鉄板銅板以外の信号は来ない」という前提であれば置き換えることは可能だが、 そうでない場合は意図しない結果を起こす可能性がある。
よって、これらの特殊なアイテムを使いこなすには入力側の前提をよく考える必要がある。

2021/1/27追記:
V1.1にて、出力設定に「いずれか」を設定が可能になった。 この場合、条件回路は条件を満たす信号のうちアイテム一覧順で最も若い1つの信号だけを返すようになる。
例えば「鉄板が100、銅板が50、プラスチックが30」という信号が入力されているとき、 「いずれかの信号が≦60ならいずれか出力」と設定しておくと、 「銅板が50」が出力される。
なぜなら、入力信号のうち60以下なのは銅板とプラスチックのみで、そのうちアイテムリスト順で最も若いのは銅板だからである。

なおここで紹介したうち「すべて」と「いずれか」の2つについては、 条件回路以外に信号を入力する設備の判断条件に直接設定することもできる。
例えばランプに直接「すべての信号が100以上の場合」という作動条件を設定し光らせることもできる。
判断の考え方は上記と同じである。

出力設定 (2021/10/5追記)

条件回路の出力設定では、信号の値として「1」または「入力数」を選択することが出来る。


冒頭の画像を再掲。条件回路では判定のメインである「条件」のほかに、判定がYESとなった場合の「出力」を設定できる。
画像では「木材が1」を出力するように設定されているが、他にも「入力数」という設定項目も選べる。

出力に「1」を選択した場合、条件が成立したとき「指定したアイテムが1」という信号を出力する。
例えばこの記事で上記したような「木材が1」といった信号を出力する。
出力に「入力数」を選択した場合、条件が成立したとき「入力されている信号のうち、指定したアイテムの信号」を出力する。
例えば「鉄板が100、銅板が50」という信号が入力されているとき、出力に「銅板」の「入力数」を指定すると、 条件が成立したとき「銅板が50」が出力される。

出力に「入力されていない信号」の「入力数」を設定すると、条件が成立しても何も出力されなくなってしまうので注意しよう。
例えば「鉄板が100、銅板が50」という信号が入力されているとき、出力に「木材」の「入力数」を指定すると、 条件が成立しても何も出力されない。
入力信号に「木材」がないからである。もしあれば、それが出力される。

条件に「すべて」や「いずれか」を使う場合も、同じ動作になる。
すなわち、出力に「1」を選択した場合、条件が成立したとき「指定したアイテムが1」という信号を出力する。
出力に「入力数」を選択した場合、条件が成立したとき「入力されている信号のうち、指定したアイテムの信号」を出力する。
入力信号に「木材」がないときに出力に「木材」の「入力数」を指定すると、条件が成立しても何も出力されないのも上記同様である。

条件に「それぞれ」を使う場合だけ、動きが少し特殊である。

条件に「それぞれ」を使い、かつ出力に「1」を使う場合、 出力される信号は「指定したアイテム」が「判断がYESになる信号の個数」分になる。
例えば「鉄板が100、銅板が50、プラスチックが10」という信号が入力されているとき「それぞれが≧20」なら 「木材が1」を出力するよう設定した場合、実際の出力は「木材が2」になる。
なぜなら、入力信号のうち20以上なのは鉄板と銅板の2つなので、「木材が1」が2つ分出力されるからである。
この出力法則はうまく使えば、「入力信号のうちいくつのアイテムが条件を満たしているか数えたい」といった場合に便利である。

一方、「それぞれ」を使い、かつ出力に「入力数」を使う場合は、 出力は「指定したアイテム」が「判断がYESになる信号の合計」分になる。
例えば「鉄板が100、銅板が50、プラスチックが10」という信号が入力されているとき「それぞれが≧20」なら 「木材が入力数」を出力するよう設定した場合、実際の出力は「木材が150」になる。
これは入力されている信号のうち、条件を満たしている鉄板と銅板の信号の合計値である。

実にややこしいが、この辺りはもう深く考えず、そういうものだと覚えるのが良いだろう。

信号の抽出 (2022/9/19追記)

前回と今回の記事で紹介した、定数回路、算術回路、条件回路、さらに「それぞれ」を組み合わせることで、 不特定多数の信号の中から目的の信号のみを抽出することができる。

例えばチェストの中にたくさんのアイテムが入っているとする。そこから鉄板の信号だけを取り出したい場合。
これだけならとても簡単で、チェストの信号を算術回路に入力し「鉄板+0=鉄板」の計算をさせれば、算術回路の出力は鉄板の信号だけになる。
鉄板と銅板の信号を取り出したい、という場合は算術回路を2台使って同様の操作を行えばよい。

ただ、アイテムの数が増えてくると算術回路が増えてきて大変なので、そんなときは抽出操作の出番である。

① まず定数回路を置き、「鉄板が1万、銅板が1万」という信号を出力させる。
② チェストと①の定数回路を回路でつなぎ、各信号を足し算させる。
③ ②の足し算の結果を条件回路に入力し、 「それぞれが≧1万」なら「それぞれが入力数」という判断をさせる。
すると、条件回路は値が1万を超えている信号だけを出力する。 しかし鉄板と銅板には②で1万を足し算しているので、この2つは必ず出力に含まれる。
④ 算術回路を置いて①の定数回路の信号を入力させ、 「それぞれ×マイナス1をそれぞれ出力」させる。
こうすると定数回路の値を符号反転した「鉄板がマイナス1万、銅板がマイナス1万」という信号が出力される。
⑤ ③の出力と④の出力をつなぎ、各信号を足し算させる。
すると、②で足した1万が⑤で足したマイナス1万により相殺され、鉄板と銅板の信号は元の値に戻される。

これで、鉄板と銅板の信号だけが抽出できるわけである。
この方法なら、抽出したいアイテムが何種類あっても定数回路・算術回路・条件回路を少し用意するだけで信号を抽出できる。


チェストの信号から鉄板と銅板の信号だけを抽出する実験回路。
ここでは定数回路で鉄板と銅板に1万を足し、条件回路で1万以上の値のみ抽出後、1万を引く計算をしている。
チェストの信号には4種類のアイテムが含まれているが、最終出力(電柱)では鉄板と銅板の信号だけを抽出できている点に注目。

ただし既にお気づきの方もいるだろうが、この方法は確実ではない。 例えば上記画像でチェストに白パックが20スタック(2万個)入っていたら、 条件回路の条件「それぞれ≧1万」の条件がYESになるため信号が出力され、 最終出力に白パックの信号が混じってしまう。
その場合には定数回路や条件回路に使っている数値を1万ではなく1億にするとか1兆にするとか、 あるいは逆に定数回路で1億を引いて条件回路でマイナス値の信号だけを通過させるなど、 その回路の各信号が取りうる値の最大値・最小値を勘案して抽出方法をうまく調整する必要がある。
どうしても値の範囲を勘案しきれない場合は、本節冒頭記載の通りアイテムの数だけ算術回路を使うほうが確実で簡単である。

これで一通りの回路の機能を見て回ったと思うので、次回は実践例を紹介する。

基本編 > 入力・出力・混合編 > 定数・算術回路編 > 条件回路編 > 実践例編 > 累積回路編

この記事を評価

この記事にコメント

  1. ...

【この記事にコメント】
お名前:
コメント:

Menu