ライフゲーム書いた

ライフゲームとは生き物っぽいものをシミュレーションできるものですよ。
ゲームというお題をもらったので、あんまりコードが長くならず絵的に見栄えのするものにしようとしたら、こんなのになりました。


例によってRubyで書く。
Rubyをはじめて見る人にもできるだけわかりやすくをもっとーに。

#!/usr/bin/ruby
#
#=ライフゲームもどき
#
#Authors:: Leigh_hakuro
#Version:: 0.1 2008-12-24
#

#セル
class Cell
  #状態
  @state

  #生きている隣接セルの個数
  @neighbor

  #初期状態は死
  def initialize
    @state = false
    @neighbor = 0
  end

  #生きている隣接セル数を1増やす
  def addNeighbor
    @neighbor += 1
  end

  #セルの状態を更新
  def update
    #生きている隣接セルが1以下あるいは4以上の場合、死ぬ
    if @neighbor <= 1 || @neighbor >= 4
      @state = false
    #隣接セル数が3の場合、必ず生きる
    elsif @neighbor == 3
      @state = true
    end
    #それ例外の場合、現状維持

    @neighbor = 0
  end

  #現在の状態を取得
  def getState
    return @state
  end

  #状態を反転
  def switchState
    @state = (@state ? false : true)
  end

  #状態を設定
  def setState(state)
    @state = state
  end
end

#いわゆる方眼紙
class Grid
  #初期化 size×sizeの空間を作る
  def initialize(size)
    @size = size
    @cells = []
    size.times{
      tmp = []
      size.times{
	tmp << Cell.new
      }
      @cells << tmp
    }
  end
  
  #各セルの状態を表示
  def show
    @size.times{|x|
      @size.times{|y|
	state = @cells[x][y].getState
	addNeighbor(x, y) if state
	print(state ? "" : "")
      }
      puts
    }

    updateState
  end

  #物体を挿入
  def insert(map, x, y)
    map.each_with_index{|i, i_idx|
      i.each_with_index{|j, j_idx|
	@cells[i_idx + x][j_idx + y].setState(j)
      }
    }
  end

  private

  #隣接セル数を追加
  def addNeighbor(x, y)
    for i in x-1..x+1 do
      for j in y-1..y+1 do
	if !(i == x && j == y)
	  @cells[i == @size ? 0 : i][j == @size ? 0 : j].addNeighbor
	end
      end
    end
  end

  #各セルの状態を更新
  def updateState
    @size.times{|x|
      @size.times{|y|
	@cells[x][y].update
      }
    }
  end
end

#物体のパターンを定義
module Pattern
O = true
X = false

GLIDER = [
[X,X,O],
[O,X,O],
[X,O,O]]

FLY_MACHINE = [
[X,X,X,X,X,O,O,O,O],
[X,X,X,X,O,X,X,X,O],
[X,X,X,X,X,X,X,X,O],
[O,O,X,X,O,X,X,O,X],
[O,O,O,X,X,X,X,X,X],
[O,O,X,X,O,X,X,O,X],
[X,X,X,X,X,X,X,X,O],
[X,X,X,X,O,X,X,X,O],
[X,X,X,X,X,O,O,O,O]]

end


#メイン部分
#空間の生成
bord = Grid.new(32)
#物体の挿入
bord.insert(Pattern::FLY_MACHINE, 5, 5)

#表示ループ
loop{
  #画面送りのため32回改行
  32.times{ puts }

  #表示
  bord.show

  #0.2秒停止
  sleep(0.2)
}