Create a gist now

Instantly share code, notes, and snippets.

Embed
What would you like to do?
RubyPico 用ライフゲーム
class LifeGame
W, H = 124, 38
def initialize(n)
@field = new_field
scatter(n)
end
def set_cell(x, y)
@field[y + 1][x + 1] = 1
end
def get_cell(x, y)
@field[y + 1][x + 1]
end
def new_field
Array.new(H + 2) {Array.new(W + 2, 0)}
end
def scatter(n)
co = 0
while co < n
x, y = rand(W), rand(H)
if get_cell(x, y).zero?
set_cell(x, y)
co += 1
end
end
end
def next
nxf = new_field
each_cell do |x, y|
n = alive_cells(x, y)
if get_cell(x, y).zero?
nxf[y + 1][x + 1] = 1 if n == 3
else
nxf[y + 1][x + 1] = 1 if n == 2 or n == 3
end
end
@field = nxf
end
def alive_cells(x, y)
get_cell(x - 1, y - 1) + get_cell(x, y - 1) + get_cell(x + 1, y - 1) +
get_cell(x - 1, y) + get_cell(x + 1, y) +
get_cell(x - 1, y + 1) + get_cell(x, y + 1) + get_cell(x + 1, y + 1)
end
def each_cell
H.times do |y|
W.times {|x| yield(x, y)}
end
end
def generate_field_string
st = l = "*" * (W + 2) + "\n"
H.times do |y|
st += "*" + @field[y + 1][1..-2].map {|c| c.zero? ? " " : "O"}.join + "*\n"
end
st + l
end
def run(wait)
loop do
clearprint generate_field_string
self.next
sleep(wait)
end
end
end
LifeGame.new(650).run(0.7)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment