ライフゲーム
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