[ruby-list:41695] Ruby本のlifegame

From: Norio Kobayashi <ncoba@...>
Date: 2005-12-11 04:26:17 UTC
List: ruby-list #41695
『オブジェクト指向スクリプト言語Ruby』第1版第5刷 で 
Ruby の勉強をしています。

上の本に載っているライフゲームについてですが、p272 の nextgen メソッド

def nextgen
  n = {}
  @lives.each_key {|geom|       # (1)
    n[geom] ||= 0
    @neighbors[geom.y][geom.x].each {|pos|
      n[geom+pos] ||= 0
      n[geom+pos] += 1
    }
  }
  n.each {|geom, count|
    if count == 3 || @lives[geom] && count == 2
      @lives[geom] = true
    else
      @lives[geom] = nil        # (2)
    end
  }
end

(2) のところで、「生物が存在しない」として nil を代入していますが、
(1) で全てのキーに対して、すなわち、生物が存在しない所(nil)も、
生物が存在するとして計算してしまっているので、これだとうまくいかないと
思うのですが…。

・(1) で @lives[geom] == true に対してのみ計算を行う
・(2) を @lives.delete(geom) に書き換える

のどちらかが必要だと思います。

また、p273 のリスト 6-11 には、作成したプログラムをテストするコードが
載っていますが、to_s メソッドを本の中では再定義していないので、

class LifeGame
  def to_s
    board = []
    for i in 0..@height-1
      board << " " * @width
    end
    each_life{|geom| board[geom.y][geom.x] = "*"}
    board
  end
end

のようなコードが載っていた方がうれしいです。

Ruby 勉強中なので、間違っていたらすみません。



In This Thread

Prev Next