This Example is a life game for the Educational BoosterPack MKII.
TI LaunchPad
Educational BoosterPack MKII
None. This basic example just uses your LaunchPad and BoosterPack only.
///
/// @mainpage LifeGame
///
/// @details Description of the project
/// @n Based on Life_Game_Colour.pde Jul 12, 2012 (c) Rei VILO, 2010-2012
/// @n
/// @n @a Developed with [embedXcode+](http://embedXcode.weebly.com)
///
/// @author Rei Vilo
/// @author Rei Vilo
/// @date Dec 11, 2013 18:54
/// @version release 136
///
/// @copyright (c) Rei Vilo, 2013
/// @copyright CC = BY SA NC
///
/// @see
/// * Life_Game_Colour.pde Jul 12, 2012 (c) Rei VILO, 2010-2012
/// @n http://embeddedcomputing.weebly.com/life-game.html
/// * http://nathandumont.com/node/245 (c) Nathan, 11/04/2011 - 20:46
///
///
/// @file LifeGame.ino
/// @brief Main sketch
///
/// @details Description of the project
/// @n @a Developed with [embedXcode+](http://embedXcode.weebly.com)
///
/// @author Rei Vilo
/// @author Rei Vilo
/// @date Dec 11, 2013 18:54
/// @version 136
///
/// @copyright (c) Rei Vilo, 2013
/// @copyright CC = BY SA NC
///
/// @see ReadMe.txt for references
/// @n
///
// Core library for code-sense
#if defined(ENERGIA) // LaunchPad MSP430, Stellaris and Tiva, Experimeter Board FR5739 specific
#include "Energia.h"
#else // error
#error Platform not defined
#endif
// Prototypes
// Include application, user and local libraries
#include
// Screen selection
#define HX8353E
#include <LCD_screen.h>
#include <LCD_screen_font.h>
#include <LCD_utilities.h>
#include <Screen_HX8353E.h>
#include
#include
#include
Screen_HX8353E myScreen;
// Beware of RAM limitations
#if defined(HX8353E) // Educational BoosterPack MKII
#if defined(__MSP430F5529__)
#define ROWS 32 // max 80
#define COLS 32 // max 60
#elif defined(__LM4F120H5QR__) || defined(__TM4C123GH6PM__)
#define ROWS 64 // max 80
#define COLS 64 // max 60
#elif defined(__TM4C1294NCPDT__) || defined(__TM4C1294XNCZAD__)
#define ROWS 128 // max 128
#define COLS 128 // max 128
#else
#error Board not supported
#endif
#else // general case
#define ROWS 80 // max 80
#define COLS 60 // max 60
#endif
#define PERCENT 70 // % dead
// bits 7 . 6 . 5 . 4 . 3 . 2 . 1 . 0
// [3] = dead 0, alive 1
// [2..0] = age 0-7
#define ALIVE 0x08
#define DEAD 0x00
#define NMASK 0x08
#define AGEMASK 0x07
#define StopButton 33
#define NewGameButton 32
// Define variables and constants
uint8_t _screen[2][ROWS][COLS];
uint32_t chrono;
uint8_t page;
uint16_t colours[16];
uint16_t generation;
uint8_t rowSize, colSize;
uint8_t i, j;
void new_game() {
page = 0;
for (i=0; i < ROWS; i++) {
for (j=0; j < COLS; j++) {
if (random(100) > PERCENT) _screen[page^1][i][j] = ALIVE;
else _screen[page^1][i][j] = DEAD;
myScreen.dRectangle(i*rowSize, j*colSize, rowSize, colSize, colours[_screen[page^1][i][j]]);
}
}
page ^= 1;
generation = 0;
chrono = millis();
}
void setup() {
// No need for INPUT_PULLUP
pinMode(StopButton, INPUT);
pinMode(NewGameButton, INPUT);
myScreen.begin();
rowSize = myScreen.screenSizeX() / ROWS;
colSize = myScreen.screenSizeY() / COLS;
delay(10);
myScreen.setPenSolid(true);
// 0-7 dying: cold colours
// from green to blue to black
colours[ 0] = myScreen.calculateColour( 0, 255, 0);
colours[ 1] = myScreen.calculateColour( 0, 204, 51);
colours[ 2] = myScreen.calculateColour( 0, 153, 102);
colours[ 3] = myScreen.calculateColour( 0, 102, 153);
colours[ 4] = myScreen.calculateColour( 0, 51, 204);
colours[ 5] = myScreen.calculateColour( 0, 0, 255);
colours[ 6] = myScreen.calculateColour( 0, 0, 127);
colours[ 7] = myScreen.calculateColour( 0, 0, 0);
// 8-15 living: hot colours
// from red to orange to yellow
colours[ 8] = myScreen.calculateColour(255, 0, 0);
colours[ 9] = myScreen.calculateColour(255, 43, 0);
colours[10] = myScreen.calculateColour(255, 85, 0);
colours[11] = myScreen.calculateColour(255, 127, 0);
colours[12] = myScreen.calculateColour(255, 171, 0);
colours[13] = myScreen.calculateColour(255, 213, 0);
colours[14] = myScreen.calculateColour(255, 255, 0);
colours[15] = myScreen.calculateColour(255, 255, 255);
myScreen.setFontSolid(false);
myScreen.setFontSize(1);
myScreen.gText((myScreen.screenSizeX()-9*myScreen.fontSizeX())/2, 20, "Life Game");
j = myScreen.screenSizeX() / 16;
myScreen.setFontSize(0);
myScreen.gText(0, 60, "Death");
for (i=0; i<8; i++)
myScreen.dRectangle(j*(8-i), 40, j, j, colours[i]);
myScreen.gText(myScreen.screenSizeX()-4*myScreen.fontSizeX(), 60, "Life");
for (i=8; i<16; i++)
myScreen.dRectangle(j*i, 40, j, j, colours[i]);
myScreen.gText((myScreen.screenSizeX()-14*myScreen.fontSizeX())/2, 90, "Button 1: stop");
myScreen.gText((myScreen.screenSizeX()-14*myScreen.fontSizeX())/2, 100, "Button 2: new");
delay(4000);
myScreen.clear();
randomSeed(analogRead(0));
new_game();
}
void update_pixel(uint8_t i, uint8_t j, uint8_t neighbours) {
if (bitRead(_screen[page][i][j], 3)) {
// alive
if ((neighbours < 2) || (neighbours > 3)) {
_screen[page^1][i][j] = DEAD; // zero age dead pixel // 0 pass
} else {
_screen[page^1][i][j] = _screen[page][i][j] + 1; // 8-15 living
if (_screen[page^1][i][j] > 0x0f) {
_screen[page^1][i][j] = 0x0f;
}
}
} else {
// dead
if (neighbours == 3) {
_screen[page^1][i][j] = ALIVE; // zero age alive pixel // 8 born
} else {
_screen[page^1][i][j] = _screen[page][i][j] + 1; // 0-7 dying
if (_screen[page^1][i][j] > 0x07) _screen[page^1][i][j] = 0x07;
}
}
if (_screen[page][i][j]!=_screen[page^1][i][j])
myScreen.dRectangle(i*rowSize, j*colSize, rowSize, colSize, colours[_screen[page^1][i][j]]);
}
void loop() {
uint8_t neighbours;
generation++;
for (i=1; i < ROWS-1; i++) {
for (j=1; j<COLS-1; j++) {
neighbours = bitRead(_screen[page][i-1][j-1], 3);
neighbours += bitRead(_screen[page][i-1][j ], 3);
neighbours += bitRead(_screen[page][i-1][j+1], 3);
neighbours += bitRead(_screen[page][i ][j-1], 3);
neighbours += bitRead(_screen[page][i ][j+1], 3);
neighbours += bitRead(_screen[page][i+1][j-1], 3);
neighbours += bitRead(_screen[page][i+1][j ], 3);
neighbours += bitRead(_screen[page][i+1][j+1], 3);
update_pixel(i,j, neighbours);
}
}
for (i=1; i < COLS-1; i++) {
neighbours = bitRead(_screen[page][0 ][i-1], 3);
neighbours += bitRead(_screen[page][0 ][i+1], 3);
neighbours += bitRead(_screen[page][1 ][i-1], 3);
neighbours += bitRead(_screen[page][1 ][i ], 3);
neighbours += bitRead(_screen[page][1 ][i+1], 3);
neighbours += bitRead(_screen[page][ROWS-1][i-1], 3);
neighbours += bitRead(_screen[page][ROWS-1][i ], 3);
neighbours += bitRead(_screen[page][ROWS-1][i+1], 3);
update_pixel(0, i, neighbours);
neighbours = bitRead(_screen[page][ROWS-2][i-1], 3);
neighbours += bitRead(_screen[page][ROWS-2][i ], 3);
neighbours += bitRead(_screen[page][ROWS-2][i+1], 3);
neighbours += bitRead(_screen[page][ROWS-1][i-1], 3);
neighbours += bitRead(_screen[page][ROWS-1][i+1], 3);
neighbours += bitRead(_screen[page][0 ][i-1], 3);
neighbours += bitRead(_screen[page][0 ][i ], 3);
neighbours += bitRead(_screen[page][0 ][i+1], 3);
update_pixel(ROWS-1,i, neighbours);
}
for (i=1; i < ROWS-1; i++) {
neighbours = bitRead(_screen[page][i-1][0 ], 3);
neighbours += bitRead(_screen[page][i+1][0 ], 3);
neighbours += bitRead(_screen[page][i-1][1 ], 3);
neighbours += bitRead(_screen[page][i ][1 ], 3);
neighbours += bitRead(_screen[page][i+1][1 ], 3);
neighbours += bitRead(_screen[page][i-1][COLS-1], 3);
neighbours += bitRead(_screen[page][i ][COLS-1], 3);
neighbours += bitRead(_screen[page][i+1][COLS-1], 3);
update_pixel(i, 0, neighbours);
neighbours = bitRead(_screen[page][i-1][COLS-1], 3);
neighbours += bitRead(_screen[page][i+1][COLS-1], 3);
neighbours += bitRead(_screen[page][i-1][COLS-2], 3);
neighbours += bitRead(_screen[page][i ][COLS-2], 3);
neighbours += bitRead(_screen[page][i+1][COLS-2], 3);
neighbours += bitRead(_screen[page][i-1][0 ], 3);
neighbours += bitRead(_screen[page][i ][0 ], 3);
neighbours += bitRead(_screen[page][i+1][0 ], 3);
update_pixel(i,COLS-1, neighbours);
}
neighbours = bitRead(_screen[page][1 ][0 ], 3);
neighbours += bitRead(_screen[page][1 ][1 ], 3);
neighbours += bitRead(_screen[page][0 ][1 ], 3);
neighbours += bitRead(_screen[page][ROWS-1][0 ], 3);
neighbours += bitRead(_screen[page][ROWS-1][1 ], 3);
neighbours += bitRead(_screen[page][ROWS-1][COLS-1], 3);
neighbours += bitRead(_screen[page][0 ][COLS-1], 3);
neighbours += bitRead(_screen[page][1 ][COLS-1], 3);
update_pixel(0,0, neighbours);
neighbours = bitRead(_screen[page][1 ][0 ], 3);
neighbours += bitRead(_screen[page][0 ][0 ], 3);
neighbours += bitRead(_screen[page][0 ][COLS-2], 3);
neighbours += bitRead(_screen[page][1 ][COLS-2], 3);
neighbours += bitRead(_screen[page][1 ][COLS-1], 3);
neighbours += bitRead(_screen[page][ROWS-1][COLS-1], 3);
neighbours += bitRead(_screen[page][ROWS-1][COLS-2], 3);
neighbours += bitRead(_screen[page][ROWS-1][0 ], 3);
update_pixel(0,COLS-1, neighbours);
neighbours = bitRead(_screen[page][ROWS-1][1 ], 3);
neighbours += bitRead(_screen[page][ROWS-2][0 ], 3);
neighbours += bitRead(_screen[page][ROWS-2][1 ], 3);
neighbours += bitRead(_screen[page][ROWS-1][COLS-1], 3);
neighbours += bitRead(_screen[page][ROWS-2][COLS-1], 3);
neighbours += bitRead(_screen[page][0 ][COLS-1], 3);
neighbours += bitRead(_screen[page][0 ][0 ], 3);
neighbours += bitRead(_screen[page][0 ][1 ], 3);
update_pixel(ROWS-1,0, neighbours);
neighbours = bitRead(_screen[page][ROWS-1][COLS-2], 3);
neighbours += bitRead(_screen[page][ROWS-2][COLS-2], 3);
neighbours += bitRead(_screen[page][ROWS-2][COLS-1], 3);
neighbours += bitRead(_screen[page][ROWS-1][0 ], 3);
neighbours += bitRead(_screen[page][ROWS-2][0 ], 3);
neighbours += bitRead(_screen[page][0 ][0 ], 3);
neighbours += bitRead(_screen[page][0 ][COLS-1], 3);
neighbours += bitRead(_screen[page][1 ][COLS-2], 3);
update_pixel(ROWS-1,COLS-1, neighbours);
page ^= 1;
// generation
myScreen.setFontSolid(true);
myScreen.setFontSize(1);
myScreen.gText(0,
myScreen.screenSizeY()-myScreen.fontSizeY(),
i32toa(generation, 1, 0, 0));
// calculation time in seconds
myScreen.setFontSize(0);
myScreen.gText(myScreen.screenSizeX()-8*myScreen.fontSizeX(),
myScreen.screenSizeY()-myScreen.fontSizeY(),
ttoa((millis()-chrono), 8));
chrono = millis();
// // touch to stop
if (digitalRead(StopButton) == 0) {
myScreen.clear();
while (1);
}
if (digitalRead(NewGameButton) == 0) {
delay(333);
myScreen.clear();
delay(333);
new_game();
delay(333);
}
}