kairo-gokko (27) equal リレー



equal リレーを追加します。 not リレーのときとほとんど同じです。

テスト用回路はこう。

f:id:sonota88:20200320082948p:plain

動かした様子です。

f:id:sonota88:20200320083147g:plain

以下の iframe で実際に動かせます。 音量小さめにしていますが音が出ます。

こちらも同じものです。
https://sonota88.github.io/kairo-gokko/pages/27/index.html


equal リレーと not リレーは重複する処理が多いので、 Unit::Relay という親クラスを作って以下のような継承階層にしました。

- SingleCell
  - Relay
    - EqualRelay
    - NotRelay

あとは描画部分の外枠を描く部分を共通化したりといったところですね。

状態更新処理の部分は強引に共通化すると分かりにくくなりそうな気がしたため、 いったん様子見します。

(……これ書いてるときに気づきましたが、これはポリモーフィズムで書き直せるパターンですね。うーん、ちょっと悩みますが、リファクタリングは後回しにして先に進みます。)


通化以外では、スイッチの状態変化フラグを扱う部分が下記のようになりました。

--- a/main.rb
+++ b/main.rb
@@ -82,7 +82,12 @@ def update_tuden_relay_switch_lamp(circuit)
   circuit.last_update = Time.now
 
   circuit.update_tuden_state()
-  circuit.switch_changed = circuit.update_not_relays_state()
+
+  switch_changed_eq = circuit.update_equal_relays_state()
+  switch_changed_not = circuit.update_not_relays_state()
+  circuit.switch_changed =
+    switch_changed_eq || switch_changed_not
+
   circuit.update_lamps_state()
 
   Sound[:relay].play if circuit.switch_changed

equal リレーと not リレーで異なる音が出るようにしてもおもしろいかもしれませんね。