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