]> mj.ucw.cz Git - home-hw.git/commitdiff
neopixel-square: The Game of Life
authorMartin Mares <mj@ucw.cz>
Sun, 24 Mar 2024 16:19:55 +0000 (17:19 +0100)
committerMartin Mares <mj@ucw.cz>
Sun, 24 Mar 2024 16:19:55 +0000 (17:19 +0100)
test-neopixel-square/main.c

index 3aefaf4f9f55398a3023eb2c059b51300e3258dd..05f44b2e40f381878e5b3f139d604d9323472c4b 100644 (file)
@@ -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;