39 lines
1.8 KiB
Text
39 lines
1.8 KiB
Text
# conway's game of life
|
|
|
|
# naive, super slow implementation for proof-of-concept
|
|
# (accessing char array would probably be way faster!)
|
|
for frame, layer, x, y in TileIter(self):
|
|
dead = self.get_char_index_at(frame, layer, x, y) == 0
|
|
# N, NE, E, SE, S, SW, W, NW
|
|
neighbor_offsets = [(0, -1), (1, -1), (1, 0), (1, 1),
|
|
(0, 1), (-1, 1), (-1, 0), (-1, -1)]
|
|
neighbors = 0
|
|
neighbor_chars = []
|
|
neighbor_colors = []
|
|
for offset in neighbor_offsets:
|
|
check_x, check_y = x + offset[0], y + offset[1]
|
|
# don't check at edges
|
|
if not (0 < check_x < self.width and 0 < check_y < self.height):
|
|
continue
|
|
neighbor_char = self.get_char_index_at(frame, layer, check_x, check_y)
|
|
if neighbor_char != 0:
|
|
neighbors += 1
|
|
# remember neighbor char in case we come alive
|
|
neighbor_chars.append(neighbor_char)
|
|
fg = self.get_fg_color_index_at(frame, layer, check_x, check_y)
|
|
neighbor_colors.append(fg)
|
|
bg = self.get_bg_color_index_at(frame, layer, check_x, check_y)
|
|
neighbor_colors.append(bg)
|
|
# rule #4: any dead cell with exactly 3 neighbors becomes alive
|
|
if dead and neighbors == 3:
|
|
# pick a random neighbord character to be
|
|
self.set_char_index_at(frame, layer, x, y, random.choice(neighbor_chars))
|
|
change_fg = random.choice([False, True])
|
|
self.set_color_at(frame, layer, x, y, random.choice(neighbor_colors), change_fg)
|
|
# rule #3: any living cell with >3 neighbors dies from overcrowding
|
|
elif neighbors > 3:
|
|
self.set_char_index_at(frame, layer, x, y, 0)
|
|
# rule #1: any living cell with <2 neighbors dies from underpopulation
|
|
elif neighbors < 2:
|
|
self.set_char_index_at(frame, layer, x, y, 0)
|
|
# rule #2: any living cell with 2 or 3 neighbors survives
|