From ee11046d07622845dee3ab25a24426bbe80499b5 Mon Sep 17 00:00:00 2001 From: Martin Mares Date: Sun, 24 Mar 2024 17:19:55 +0100 Subject: [PATCH] neopixel-square: The Game of Life --- test-neopixel-square/main.c | 83 +++++++++++++++++++++++++++++++++++-- 1 file changed, 79 insertions(+), 4 deletions(-) diff --git a/test-neopixel-square/main.c b/test-neopixel-square/main.c index 3aefaf4..05f44b2 100644 --- a/test-neopixel-square/main.c +++ b/test-neopixel-square/main.c @@ -154,6 +154,71 @@ static void neopixel_init(void) timer_enable_counter(TIM4); } +/*** Game of Life ***/ + +#define LN 8 + +byte life[LN+2][LN+2]; +byte lpred[LN+2][LN+2]; + +static void life_init(void) +{ +#if 1 + // The R pentomino + life[3][4] = 1; + life[3][5] = 1; + life[4][3] = 1; + life[4][4] = 1; + life[5][4] = 1; +#elif 0 + // Blinker + life[3][2] = 1; + life[3][3] = 1; + life[3][4] = 1; +#elif 0 + // Glider + life[1][3] = 1; + life[2][1] = 1; + life[2][3] = 1; + life[3][2] = 1; + life[3][3] = 1; +#endif +} + +static void life_step(void) +{ + memcpy(lpred, life, sizeof(life)); + + for (uint i=1; i<=LN; i++) + for (uint j=1; j<=LN; j++) { + int neigh = 0; + for (uint ii=i-1; ii <= i+1; ii++) + for (uint jj=j-1; jj <= j+1; jj++) + neigh += lpred[ii][jj]; + neigh -= life[i][j]; + if (life[i][j]) { + if (neigh < 2 || neigh > 3) + life[i][j] = 0; + } else { + if (neigh == 3) + life[i][j] = 1; + } + } +} + +static void life_show(void) +{ + uint led = 0; + for (uint i=1; i<=LN; i++) + for (uint j=1; j<=LN; j++) { + if (life[i][j]) + neopixel_set(led, 0, 7, 0); + else + neopixel_set(led, 0, 0, 1); + led++; + } +} + /*** Main ***/ int main(void) @@ -166,19 +231,29 @@ int main(void) debug_printf("Hello, world!\n"); - uint i=63; + // uint i=63; + life_init(); + life_show(); + uint lsteps = 0; for (;;) { // wait_for_interrupt(); debug_led(1); // neopixel_set(NPIX_NUM_LEDS-1, 0, 0x7f, 0); - neopixel_set(i, 0, 0, 7); - i = (i+1) % 64; - neopixel_set(i, 0, 63, 0); + // neopixel_set(i, 0, 0, 7); + // i = (i+1) % 64; + // neopixel_set(i, 0, 63, 0); delay_ms(100); debug_led(0); // neopixel_set(NPIX_NUM_LEDS-1, 0, 0, 0x7f); delay_ms(500); + if (lsteps++ < 30) + life_step(); + else { + life_init(); + lsteps = 0; + } + life_show(); } return 0; -- 2.39.2