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

Dependencies:   ColorLCDShield mbed

Conway.cpp

Committer:
kayekss
Date:
2015-02-22
Revision:
1:eed4416d3359
Parent:
0:bc852e1d0b48

File content as of revision 1:eed4416d3359:

#include <stdint.h>
#include <stdlib.h>
#include "Conway.h"

#define MOD_8(i)          ((i) - (((i) >> 3) << 3))
#define WORLD(x, y)       ((world[(y)][(x) >> 3] & (1 << (7 - MOD_8(x)))) > 0 ? 1 : 0)
#define WORLDT_ADDR(x, y) worldTemp[(y)][(x) >> 3]

void Conway::nextGeneration() {
    uint8_t left;
    uint8_t right;
    uint8_t up;
    uint8_t down;
    uint8_t numAlive;
    
    initWorldTemp();
    
    for (uint8_t j = 0; j < 128; j++) {
        up   = j == 0 ? 127 : j - 1;
        down = j == 127 ? 0 : j + 1;
        
        for (uint8_t i = 0; i < 128; i++) {
            left  = i == 0 ? 127 : i - 1;
            right = i == 127 ? 0 : i + 1;
            
            // Count alive cells
            numAlive =   WORLD(left, up)   + WORLD(i, up)   + WORLD(right, up)
                       + WORLD(left, j)                     + WORLD(right, j)
                       + WORLD(left, down) + WORLD(i, down) + WORLD(right, down);
            
            if (numAlive == 3) {
                WORLDT_ADDR(i, j) |= 1 << (7 - MOD_8(i));
            } else if (numAlive == 2) {
                WORLDT_ADDR(i, j) |= WORLD(i, j) << (7 - MOD_8(i));
            }
        }
    }
}

void Conway::swap() {
    for (uint8_t j = 0; j < 128; j++) {
        for (uint8_t i = 0; i < 16; i++) {
            if (world[j][i] != worldTemp[j][i]) {
                world[j][i] ^= worldTemp[j][i];
                worldTemp[j][i] ^= world[j][i];
                world[j][i] ^= worldTemp[j][i];
            }
        }
    }
}

void Conway::initWorldTemp() {
    for (uint8_t j = 0; j < 128; j++) {
        for (uint8_t i = 0; i < 16; i++) {
            worldTemp[j][i] = 0x00;
        }
    }
}

void Conway::randomizeWorld(uint16_t seed) {
    srand(seed);
    
    for (uint8_t j = 0; j < 128; j++) {
        for (uint8_t i = 0; i < 16; i++) {
            world[j][i] = rand() ^ (rand() >> 4);
        }
    }
}

void Conway::randomizeWorld25(uint16_t seed) {
    srand(seed);
    
    for (uint8_t j = 0; j < 128; j++) {
        for (uint8_t i = 0; i < 16; i++) {
            world[j][i] = rand() & (rand() >> 4);
        }
    }
}

void Conway::randomizeWorld75(uint16_t seed) {
    srand(seed);
    
    for (uint8_t j = 0; j < 128; j++) {
        for (uint8_t i = 0; i < 16; i++) {
            world[j][i] = rand() | (rand() >> 4);
        }
    }
}