summaryrefslogtreecommitdiffstats
path: root/LoLShield/Examples/Life/Life.pde
diff options
context:
space:
mode:
Diffstat (limited to 'LoLShield/Examples/Life/Life.pde')
-rw-r--r--LoLShield/Examples/Life/Life.pde120
1 files changed, 120 insertions, 0 deletions
diff --git a/LoLShield/Examples/Life/Life.pde b/LoLShield/Examples/Life/Life.pde
new file mode 100644
index 0000000..02d4b7e
--- /dev/null
+++ b/LoLShield/Examples/Life/Life.pde
@@ -0,0 +1,120 @@
+/*
+ Conway's "Life"
+
+ Writen for the LoL Shield, designed by Jimmie Rodgers:
+ http://jimmieprodgers.com/kits/lolshield/
+
+ This needs the Charliplexing library, which you can get at the
+ LoL Shield project page: http://code.google.com/p/lolshield/
+
+ Created by Jimmie Rodgers on 12/30/2009.
+ Adapted from: http://www.arduino.cc/playground/Main/DirectDriveLEDMatrix
+
+ History:
+ December 30, 2009 - V1.0 first version written at 26C3/Berlin
+
+ This is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Version 3 General Public
+ License as published by the Free Software Foundation;
+ or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <Charliplexing.h> //Imports the library, which needs to be
+ //Initialized in setup.
+
+#define DELAY 150 //Sets the time each generation is shown
+#define RESEEDRATE 5000 //Sets the rate the world is re-seeded
+#define SIZEX 14 //Sets the X axis size
+#define SIZEY 9 //Sets the Y axis size
+byte world[SIZEX][SIZEY][2]; //Creates a double buffer world
+long density = 50; //Sets density % during seeding
+int geck = 0; //Counter for re-seeding
+
+void setup() {
+ LedSign::Init(); //Initilizes the LoL Shield
+ randomSeed(analogRead(5));
+ //Builds the world with an initial seed.
+ for (int i = 0; i < SIZEX; i++) {
+ for (int j = 0; j < SIZEY; j++) {
+ if (random(100) < density) {
+ world[i][j][0] = 1;
+ }
+ else {
+ world[i][j][0] = 0;
+ }
+ world[i][j][1] = 0;
+ }
+ }
+}
+
+void loop() {
+ // Birth and death cycle
+ for (int x = 0; x < SIZEX; x++) {
+ for (int y = 0; y < SIZEY; y++) {
+ // Default is for cell to stay the same
+ world[x][y][1] = world[x][y][0];
+ int count = neighbours(x, y);
+ geck++;
+ if (count == 3 && world[x][y][0] == 0) {
+ // A new cell is born
+ world[x][y][1] = 1;
+ LedSign::Set(x,y,1);
+ }
+ else if ((count < 2 || count > 3) && world[x][y][0] == 1) {
+ // Cell dies
+ world[x][y][1] = 0;
+ LedSign::Set(x,y,0);
+ }
+ }
+
+ }
+
+ //Counts and then checks for re-seeding
+ //Otherwise the display will die out at some point
+ geck++;
+ if (geck > RESEEDRATE){
+ seedWorld();
+ geck = 0;
+ }
+
+ // Copy next generation into place
+ for (int x = 0; x < SIZEX; x++) {
+ for (int y = 0; y < SIZEY; y++) {
+ world[x][y][0] = world[x][y][1];
+ }
+ }
+ delay(DELAY);
+}
+
+//Re-seeds based off of RESEEDRATE
+void seedWorld(){
+ randomSeed(analogRead(5));
+ for (int i = 0; i < SIZEX; i++) {
+ for (int j = 0; j < SIZEY; j++) {
+ if (random(100) < density) {
+ world[i][j][1] = 1;
+ }
+ }
+ }
+}
+
+//Runs the rule checks, including screen wrap
+int neighbours(int x, int y) {
+ return world[(x + 1) % SIZEX][y][0] +
+ world[x][(y + 1) % SIZEY][0] +
+ world[(x + SIZEX - 1) % SIZEX][y][0] +
+ world[x][(y + SIZEY - 1) % SIZEY][0] +
+ world[(x + 1) % SIZEX][(y + 1) % SIZEY][0] +
+ world[(x + SIZEX - 1) % SIZEX][(y + 1) % SIZEY][0] +
+ world[(x + SIZEX - 1) % SIZEX][(y + SIZEY - 1) % SIZEY][0] +
+ world[(x + 1) % SIZEX][(y + SIZEY - 1) % SIZEY][0];
+}