import term import rand import time const ( cell = '█' nothing = ' ' switches = { cell: nothing nothing: cell } transformers = [nothing, cell] ) struct Game { mut: grid [][]string } fn (g Game) get_surrounding_alive_count(x int, y int) int { mut count := 0 for i := x - 1; i <= x + 1; i++ { for j := y - 1; j <= y + 1; j++ { if (i != x || j != y) && i >= 0 && j >= 0 && i < g.grid.len && j < g.grid[x].len { if g.grid[i][j] == cell { count++ } } } } return count } fn (mut g Game) evolve() { mut temp_grid := [][]string{} for x in 0 .. g.grid.len { temp_grid << []string{} for y in 0 .. g.grid[x].len { count := g.get_surrounding_alive_count(x, y) if count == 3 || (g.grid[x][y] == cell && count == 2) { temp_grid[x] << cell } else { temp_grid[x] << nothing } } } g.grid = temp_grid } fn (mut g Game) display() { for y in 0 .. g.grid[0].len { mut line := '' for x in 0 .. g.grid.len { line += g.grid[x][y] } println(line) } } fn new_game() Game { w, h := term.get_terminal_size() mut grid := [][]string{} for x in 0 .. w { grid << []string{} for _ in 0 .. h { is_live := rand.f64() > 0.82 icon := transformers[int(is_live)] grid[x] << icon } } return Game{grid} } fn main() { mut g := new_game() g.display() for { g.evolve() term.erase_clear() g.display() time.sleep(100 * time.millisecond) } }