#!/usr/bin/env ruby # -*- ruby -*- # perlLife.pl - Conway's Game of Life # Copyright (C) YAMAMIYA Takasi CLEAR = "\33c" class LifeMap def initialize(x, y) # @board[x][y] = cell @board = newBoard(x, y) end def newBoard(x, y) board = Array.new(x) board.map! do |row| Array.new(y) end board end private :newBoard def width() @board.size end def height() @board[0].size end def random (0 ... width).each do |x| (0 ... height).each do |y| @board[x][y] = rand < 0.5 ? true : false end end end def show print CLEAR (0 ... width).each do |x| (0 ... height).each do |y| print @board[x][y] ? "O " : " " end print "\n" end end def step newBoard = newBoard(width, height) (0 ... width).each do |x| (0 ... height).each do |y| newBoard[x][y] = nextWhen(@board[x][y], numAt(x, y)) end end @board = newBoard end def numAt(x, y) sum = 0 [ [x - 1, y - 1], [x - 1, y ], [x - 1, y + 1], [x , y - 1], [x , y + 1], [x + 1, y - 1], [x + 1, y ], [x + 1, y + 1] ].each do |_x, _y| sum += 1 if (0 <= _x and _x < width and 0 <= _y and _y < height and @board[_x][_y]) end sum end private :numAt def nextWhen(cell, num) if (cell) then return ([false, false, true, true, false, false, false, false, false, false, false, false][num]) else return ([false, false, false, true, false, false, false, false, false, false, false, false][num]) end end private :nextWhen end # main while "forever" do board = LifeMap.new(20,20) board.random (1 .. 50).each do board.step board.show sleep 0.2 end end