A sample of SFE's ColorLCDShield library demonstrating Conway's Game of Life

Dependencies:   ColorLCDShield mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers Conway.cpp Source File

Conway.cpp

00001 #include <stdint.h>
00002 #include <stdlib.h>
00003 #include "Conway.h"
00004 
00005 #define MOD_8(i)          ((i) - (((i) >> 3) << 3))
00006 #define WORLD(x, y)       ((world[(y)][(x) >> 3] & (1 << (7 - MOD_8(x)))) > 0 ? 1 : 0)
00007 #define WORLDT_ADDR(x, y) worldTemp[(y)][(x) >> 3]
00008 
00009 void Conway::nextGeneration() {
00010     uint8_t left;
00011     uint8_t right;
00012     uint8_t up;
00013     uint8_t down;
00014     uint8_t numAlive;
00015     
00016     initWorldTemp();
00017     
00018     for (uint8_t j = 0; j < 128; j++) {
00019         up   = j == 0 ? 127 : j - 1;
00020         down = j == 127 ? 0 : j + 1;
00021         
00022         for (uint8_t i = 0; i < 128; i++) {
00023             left  = i == 0 ? 127 : i - 1;
00024             right = i == 127 ? 0 : i + 1;
00025             
00026             // Count alive cells
00027             numAlive =   WORLD(left, up)   + WORLD(i, up)   + WORLD(right, up)
00028                        + WORLD(left, j)                     + WORLD(right, j)
00029                        + WORLD(left, down) + WORLD(i, down) + WORLD(right, down);
00030             
00031             if (numAlive == 3) {
00032                 WORLDT_ADDR(i, j) |= 1 << (7 - MOD_8(i));
00033             } else if (numAlive == 2) {
00034                 WORLDT_ADDR(i, j) |= WORLD(i, j) << (7 - MOD_8(i));
00035             }
00036         }
00037     }
00038 }
00039 
00040 void Conway::swap() {
00041     for (uint8_t j = 0; j < 128; j++) {
00042         for (uint8_t i = 0; i < 16; i++) {
00043             if (world[j][i] != worldTemp[j][i]) {
00044                 world[j][i] ^= worldTemp[j][i];
00045                 worldTemp[j][i] ^= world[j][i];
00046                 world[j][i] ^= worldTemp[j][i];
00047             }
00048         }
00049     }
00050 }
00051 
00052 void Conway::initWorldTemp() {
00053     for (uint8_t j = 0; j < 128; j++) {
00054         for (uint8_t i = 0; i < 16; i++) {
00055             worldTemp[j][i] = 0x00;
00056         }
00057     }
00058 }
00059 
00060 void Conway::randomizeWorld(uint16_t seed) {
00061     srand(seed);
00062     
00063     for (uint8_t j = 0; j < 128; j++) {
00064         for (uint8_t i = 0; i < 16; i++) {
00065             world[j][i] = rand() ^ (rand() >> 4);
00066         }
00067     }
00068 }
00069 
00070 void Conway::randomizeWorld25(uint16_t seed) {
00071     srand(seed);
00072     
00073     for (uint8_t j = 0; j < 128; j++) {
00074         for (uint8_t i = 0; i < 16; i++) {
00075             world[j][i] = rand() & (rand() >> 4);
00076         }
00077     }
00078 }
00079 
00080 void Conway::randomizeWorld75(uint16_t seed) {
00081     srand(seed);
00082     
00083     for (uint8_t j = 0; j < 128; j++) {
00084         for (uint8_t i = 0; i < 16; i++) {
00085             world[j][i] = rand() | (rand() >> 4);
00086         }
00087     }
00088 }