X-Git-Url: https://git.xandkar.net/?a=blobdiff_plain;f=004%2Flife.awk;h=469229ad70d00b68759b6395f8722d90cb0eec07;hb=3a20c476f299ddbe993ac28b5dec75a407edf338;hp=714f209c23f0f22b90c164bb73acd59e268e16d1;hpb=7b9dc10be1a563669998cb12fdcebb84f0f57a00;p=cellular-automata.git diff --git a/004/life.awk b/004/life.awk index 714f209..469229a 100755 --- a/004/life.awk +++ b/004/life.awk @@ -6,31 +6,23 @@ function CHAR_ALIVE() {return "o"} function CHAR_DEAD() {return " "} -function init_cell() { +function get_random_state() { return int(2 * rand()) } -function init_board(n) { +function get_init_board(n) { board = ""; for (i=1; i <= n; i++) { - board = sprintf("%s%d", board, init_cell()) + board = sprintf("%s%d", board, get_random_state()) }; return board } -function print_border(x) { - for (i=1; i <= x; i++) { - printf CHAR_BORDER() - }; - print; -} - - -function char_of_state(state) { +function get_char_of_state(state) { if (state == 1) { return CHAR_ALIVE() } else if (state == 0) { @@ -39,22 +31,30 @@ function char_of_state(state) { } -function print_board(x, n, board) { - print_border(x); +function do_print_border(x) { + for (i=1; i <= x; i++) { + printf CHAR_BORDER() + }; + print +} + + +function do_print_board(x, n, board) { + do_print_border(x); for (i=1; i <= n; i++) { - printf "%s", char_of_state(substr(board, i, 1)); + printf "%s", get_char_of_state(substr(board, i, 1)); if (i % x == 0) { printf "\n" } }; - print_border(x); + do_print_border(x) } -function new_state(state, live_neighbors) { +function get_new_state(state, live_neighbors) { if (state == 1 && live_neighbors < 2) { return 0 } else if (state == 1 && live_neighbors < 4) { @@ -69,7 +69,7 @@ function new_state(state, live_neighbors) { } -function new_generation(x, n, board) { +function get_new_generation(x, n, board) { offsets["N" ] = - x ; offsets["NE"] = -(x - 1); offsets["E" ] = 1 ; @@ -86,17 +86,22 @@ function new_generation(x, n, board) { live_neighbors = 0; for (direction in offsets) { - neighbor = offsets[direction] + cell_id; - - # Make sure we're within limmits of the board - if ( !(neighbor < 1) && !(neighbor > n)) { - neighbor_state = substr(board, neighbor, 1); - live_neighbors += neighbor_state; - } + neighbor_id = offsets[direction] + cell_id; + + # ----------------------------------------------------------------- + # Real neighbors within boundaries, ghosts beyond that! + # ----------------------------------------------------------------- + if ((neighbor_id >= 1) && (neighbor_id <= n)) { + neighbor_state = substr(board, neighbor_id, 1) + } else { + neighbor_state = get_random_state() + }; + + live_neighbors += neighbor_state } - new_cell_state = new_state(cell_state, live_neighbors); - new_board = sprintf("%s%d", new_board, new_cell_state); + new_cell_state = get_new_state(cell_state, live_neighbors); + new_board = sprintf("%s%d", new_board, new_cell_state) }; return new_board @@ -111,11 +116,11 @@ function life() { y = stty_size[1] - 3; # Minus 1 char for each: border, border, cursor n = x * y; - board = init_board(n); + board = get_init_board(n); while (1) { - print_board(x, n, board); - board = new_generation(x, n, board); + do_print_board(x, n, board); + board = get_new_generation(x, n, board) } }