ライフゲーム最後まで
作ってみました
kanazawa.rb meetup28
2014/12/20
ライフゲームとは
http://ja.wikipedia.org/wiki/ライフゲーム
設計
meetup26
Coderetreat mini in Kanazawa.rb
設計ポイント
どのセルにおいても周囲に8つのセル
が存在するようにし、判定処理を共
通にする
例えば
隅のセルの場合、隣接するセルは3つ
①
②③
①
②③④
⑤
隅以外の1行目セルの場合、隣接するセルは5つ
1つのセルに隣接するセルの数によって
処理が 異なるのは複雑になるため、好
ましくない
状態が変動しない2行2列を追加することに
よって常にセルに対して隣接するセルは8つ
①
②③④
⑤
⑥ ⑦ ⑧
実装
実装ポイント
状態が変更される前のセル配列で判定
処理を行う為、状態が変更された配列
とは別に保持しておく必要がある
どツボに嵌っちゃいました
変更前の配列がコピーできない
私のRubyでの勘違い
cloneやdupはディープコピーではない
ディープコピーを使い場合はMarshal
変更前の配列がコピー出来たと持って、
コピー元配列の値を変更すると、コピー
先配列まで値が変わってしまう。
[1] pry(main)> a = Array.new(3).map { Array.new(3) { Object.new} }
=> [[#<Object:0x007fdd19c595d8>, #<Object:0x007fdd19c595b0>, #<Object:0x007fdd19c59588>],
[#<Object:0x007fdd19c59538>, #<Object:0x007fdd19c59510>, #<Object:0x007fdd19c594e8>],
[#<Object:0x007fdd19c59498>, #<Object:0x007fdd19c59470>, #<Object:0x007fdd19c59448>]]
[2] pry(main)> b = a.clone
=> [[#<Object:0x007fdd19c595d8>, #<Object:0x007fdd19c595b0>, #<Object:0x007fdd19c59588>],
[#<Object:0x007fdd19c59538>, #<Object:0x007fdd19c59510>, #<Object:0x007fdd19c594e8>],
[#<Object:0x007fdd19c59498>, #<Object:0x007fdd19c59470>, #<Object:0x007fdd19c59448>]]
上記のようにcloneだと、コピー元とコピー先
のオブジェクトが同じになってしまう
[1] pry(main)> a = Array.new(3).map { Array.new(3) { Object.new} }
=> [[#<Object:0x007fdd19c595d8>, #<Object:0x007fdd19c595b0>, #<Object:0x007fdd19c59588>],
[#<Object:0x007fdd19c59538>, #<Object:0x007fdd19c59510>, #<Object:0x007fdd19c594e8>],
[#<Object:0x007fdd19c59498>, #<Object:0x007fdd19c59470>, #<Object:0x007fdd19c59448>]]
[6] pry(main)> b = Marshal.load(Marshal.dump(a))
=> [[#<Object:0x007fdd1d2d5eb8>, #<Object:0x007fdd1d2d5e90>, #<Object:0x007fdd1d2d5e68>],
[#<Object:0x007fdd1d2d5e18>, #<Object:0x007fdd1d2d5df0>, #<Object:0x007fdd1d2d5dc8>],
[#<Object:0x007fdd1d2d5d78>, #<Object:0x007fdd1d2d5d50>, #<Object:0x007fdd1d2d5d28>]]
Marshalを使うことによって、コピー元とコ
ピー先のオブジェクトが別物になる
Demo
まとめ
私には45分で設計・実装は無理だと思
い知った。実装だけで90分かかった。
ライフゲーム最後まで作って
もやもやがすっきりした。
少しだけRubyの理解が深まった
ご静聴ありがとうございました

ライフゲーム最後まで作ってみました