読者です 読者をやめる 読者になる 読者になる

毛のはえたようなもの

インターネット的なものをつらつらとかきつらねる。

ライフゲーム

Ruby

86世代の方たちがテスト期間中にライフゲームの実装をしていたのでたのしそーだなーと指をくわえてみていました。暇になったのでRubyでやってみよーの巻。詳しい問題設定などは下記
どう書く:どう書く?org
Wikipedia:ライフゲーム - Wikipedia

実装

なんだかendまるけになってしまたよ(´・ω・`)

require "curses"

class Cells

  attr_reader :height, :width

  def initialize(height, width)
    @height = height
    @width = width
    @array = Array.new(height + 2) {
      Array.new(width + 2, 0)
    }
  end

  def []=(i,j,x)
    @array[i + 1][j + 1]=x
  end

  def [](i, j)
    @array[i + 1][j + 1]
  end

  def oneGen
    newGen = Cells.new(self.height, self.width)

    (self.height).times{|h|
      (self.width).times{|w|
        surround = (self[h-1,w-1] + self[h-1,w] + self[h-1,w+1] +
                    self[h,w-1] + self[h,w+1] +
                    self[h+1,w-1] + self[h+1,w] + self[h+1,w+1])
        if surround == 3 || (self[h,w] == 1 && surround == 2)
          newGen[h,w] = 1
        else
          newGen[h,w] = 0
        end
      }
    }
    return newGen
  end

  def makeRandom(life)
    liveCell = @height * @width * life / 100
    i = 0
    while i < liveCell
      h,w = rand(height),rand(width)
      if self[h,w] == 0
        self[h,w]=1
        i+=1
      end
    end
  end

  def printCell
    self.height.times{|h|
      self.width.times{|w|
        Curses::setpos(h, w)
        Curses::addstr(self[h,w] == 1 ? "*" : ".")
      }
    }
  end
end

Curses::init_screen

height, width, life = ARGV.collect{|i| i.to_i}
cell = Cells.new(height, width)
cell.makeRandom(life)
loop {
  cell.printCell
  cell = cell.oneGen
  Curses.refresh
  sleep 0.1
}

Curses::close_screen

実行

コマンドラインで「ruby 実行ファイル 領域縦幅 領域横幅 初期セルの生きている割合(%)」を入力してください。あとは勝手にうにうに動きます。

ruby life.rb 5 5 50