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

Dependencies:   ColorLCDShield mbed

Committer:
kayekss
Date:
Sun Feb 22 17:18:04 2015 +0000
Revision:
1:eed4416d3359
Parent:
0:bc852e1d0b48
Initial release with swimming blinkership

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kayekss 0:bc852e1d0b48 1 #include <stdint.h>
kayekss 0:bc852e1d0b48 2 #include <stdlib.h>
kayekss 0:bc852e1d0b48 3 #include "Conway.h"
kayekss 0:bc852e1d0b48 4
kayekss 0:bc852e1d0b48 5 #define MOD_8(i) ((i) - (((i) >> 3) << 3))
kayekss 0:bc852e1d0b48 6 #define WORLD(x, y) ((world[(y)][(x) >> 3] & (1 << (7 - MOD_8(x)))) > 0 ? 1 : 0)
kayekss 0:bc852e1d0b48 7 #define WORLDT_ADDR(x, y) worldTemp[(y)][(x) >> 3]
kayekss 0:bc852e1d0b48 8
kayekss 0:bc852e1d0b48 9 void Conway::nextGeneration() {
kayekss 0:bc852e1d0b48 10 uint8_t left;
kayekss 0:bc852e1d0b48 11 uint8_t right;
kayekss 0:bc852e1d0b48 12 uint8_t up;
kayekss 0:bc852e1d0b48 13 uint8_t down;
kayekss 0:bc852e1d0b48 14 uint8_t numAlive;
kayekss 0:bc852e1d0b48 15
kayekss 0:bc852e1d0b48 16 initWorldTemp();
kayekss 0:bc852e1d0b48 17
kayekss 0:bc852e1d0b48 18 for (uint8_t j = 0; j < 128; j++) {
kayekss 0:bc852e1d0b48 19 up = j == 0 ? 127 : j - 1;
kayekss 0:bc852e1d0b48 20 down = j == 127 ? 0 : j + 1;
kayekss 0:bc852e1d0b48 21
kayekss 0:bc852e1d0b48 22 for (uint8_t i = 0; i < 128; i++) {
kayekss 0:bc852e1d0b48 23 left = i == 0 ? 127 : i - 1;
kayekss 0:bc852e1d0b48 24 right = i == 127 ? 0 : i + 1;
kayekss 0:bc852e1d0b48 25
kayekss 0:bc852e1d0b48 26 // Count alive cells
kayekss 0:bc852e1d0b48 27 numAlive = WORLD(left, up) + WORLD(i, up) + WORLD(right, up)
kayekss 0:bc852e1d0b48 28 + WORLD(left, j) + WORLD(right, j)
kayekss 0:bc852e1d0b48 29 + WORLD(left, down) + WORLD(i, down) + WORLD(right, down);
kayekss 0:bc852e1d0b48 30
kayekss 0:bc852e1d0b48 31 if (numAlive == 3) {
kayekss 0:bc852e1d0b48 32 WORLDT_ADDR(i, j) |= 1 << (7 - MOD_8(i));
kayekss 0:bc852e1d0b48 33 } else if (numAlive == 2) {
kayekss 0:bc852e1d0b48 34 WORLDT_ADDR(i, j) |= WORLD(i, j) << (7 - MOD_8(i));
kayekss 0:bc852e1d0b48 35 }
kayekss 0:bc852e1d0b48 36 }
kayekss 0:bc852e1d0b48 37 }
kayekss 0:bc852e1d0b48 38 }
kayekss 0:bc852e1d0b48 39
kayekss 0:bc852e1d0b48 40 void Conway::swap() {
kayekss 0:bc852e1d0b48 41 for (uint8_t j = 0; j < 128; j++) {
kayekss 0:bc852e1d0b48 42 for (uint8_t i = 0; i < 16; i++) {
kayekss 0:bc852e1d0b48 43 if (world[j][i] != worldTemp[j][i]) {
kayekss 0:bc852e1d0b48 44 world[j][i] ^= worldTemp[j][i];
kayekss 0:bc852e1d0b48 45 worldTemp[j][i] ^= world[j][i];
kayekss 0:bc852e1d0b48 46 world[j][i] ^= worldTemp[j][i];
kayekss 0:bc852e1d0b48 47 }
kayekss 0:bc852e1d0b48 48 }
kayekss 0:bc852e1d0b48 49 }
kayekss 0:bc852e1d0b48 50 }
kayekss 0:bc852e1d0b48 51
kayekss 0:bc852e1d0b48 52 void Conway::initWorldTemp() {
kayekss 0:bc852e1d0b48 53 for (uint8_t j = 0; j < 128; j++) {
kayekss 0:bc852e1d0b48 54 for (uint8_t i = 0; i < 16; i++) {
kayekss 0:bc852e1d0b48 55 worldTemp[j][i] = 0x00;
kayekss 0:bc852e1d0b48 56 }
kayekss 0:bc852e1d0b48 57 }
kayekss 0:bc852e1d0b48 58 }
kayekss 0:bc852e1d0b48 59
kayekss 0:bc852e1d0b48 60 void Conway::randomizeWorld(uint16_t seed) {
kayekss 0:bc852e1d0b48 61 srand(seed);
kayekss 0:bc852e1d0b48 62
kayekss 0:bc852e1d0b48 63 for (uint8_t j = 0; j < 128; j++) {
kayekss 0:bc852e1d0b48 64 for (uint8_t i = 0; i < 16; i++) {
kayekss 0:bc852e1d0b48 65 world[j][i] = rand() ^ (rand() >> 4);
kayekss 0:bc852e1d0b48 66 }
kayekss 0:bc852e1d0b48 67 }
kayekss 0:bc852e1d0b48 68 }
kayekss 0:bc852e1d0b48 69
kayekss 0:bc852e1d0b48 70 void Conway::randomizeWorld25(uint16_t seed) {
kayekss 0:bc852e1d0b48 71 srand(seed);
kayekss 0:bc852e1d0b48 72
kayekss 0:bc852e1d0b48 73 for (uint8_t j = 0; j < 128; j++) {
kayekss 0:bc852e1d0b48 74 for (uint8_t i = 0; i < 16; i++) {
kayekss 0:bc852e1d0b48 75 world[j][i] = rand() & (rand() >> 4);
kayekss 0:bc852e1d0b48 76 }
kayekss 0:bc852e1d0b48 77 }
kayekss 0:bc852e1d0b48 78 }
kayekss 0:bc852e1d0b48 79
kayekss 0:bc852e1d0b48 80 void Conway::randomizeWorld75(uint16_t seed) {
kayekss 0:bc852e1d0b48 81 srand(seed);
kayekss 0:bc852e1d0b48 82
kayekss 0:bc852e1d0b48 83 for (uint8_t j = 0; j < 128; j++) {
kayekss 0:bc852e1d0b48 84 for (uint8_t i = 0; i < 16; i++) {
kayekss 0:bc852e1d0b48 85 world[j][i] = rand() | (rand() >> 4);
kayekss 0:bc852e1d0b48 86 }
kayekss 0:bc852e1d0b48 87 }
kayekss 0:bc852e1d0b48 88 }