Game of life code card
This commit is contained in:
		@@ -19,7 +19,13 @@ Here are some fun programs for your @boardname@!
 | 
			
		||||
  "name": "Rando",
 | 
			
		||||
  "description": "Randomly blinking LEDs",
 | 
			
		||||
  "url":"/examples/rando"
 | 
			
		||||
}]
 | 
			
		||||
},
 | 
			
		||||
{
 | 
			
		||||
  "name": "Game of Life",
 | 
			
		||||
  "description": "Simulation in LEDs (javascript)",
 | 
			
		||||
  "url":"/examples/gameofLife"
 | 
			
		||||
}
 | 
			
		||||
]
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Sensors
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										124
									
								
								docs/examples/gameofLife.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										124
									
								
								docs/examples/gameofLife.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,124 @@
 | 
			
		||||
# Game of Life simulation in LEDs
 | 
			
		||||
 | 
			
		||||
```blocks
 | 
			
		||||
//https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life
 | 
			
		||||
let lifeChart: Image = null
 | 
			
		||||
 | 
			
		||||
//Use button A for the next iteration of game of life
 | 
			
		||||
input.onButtonPressed(Button.A, () => {
 | 
			
		||||
    gameOfLife();
 | 
			
		||||
    show();
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
//Use button B for reseting to random initial seed state
 | 
			
		||||
input.onButtonPressed(Button.B, () => {
 | 
			
		||||
    reset();
 | 
			
		||||
    show();
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
lifeChart = images.createImage(`
 | 
			
		||||
    . . . . .
 | 
			
		||||
    . . . . .
 | 
			
		||||
    . . . . .
 | 
			
		||||
    . . . . .
 | 
			
		||||
    . . . . .
 | 
			
		||||
    `)
 | 
			
		||||
 | 
			
		||||
//State holds the information about pixel is live or dead
 | 
			
		||||
//false means dead, true means live.
 | 
			
		||||
let state = [false, false, false, false, false,
 | 
			
		||||
    false, false, false, false, false,
 | 
			
		||||
    false, false, false, false, false,
 | 
			
		||||
    false, false, false, false, false,
 | 
			
		||||
    false, false, false, false, false]
 | 
			
		||||
 | 
			
		||||
//get & set on any array
 | 
			
		||||
function getState(arr: boolean[], x: number, y: number): boolean {
 | 
			
		||||
    return arr[x * 5 + y];
 | 
			
		||||
}
 | 
			
		||||
function setState(arr: boolean[], x: number, y: number, value: boolean): void {
 | 
			
		||||
    arr[x * 5 + y] = value;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//Generate random initial state.
 | 
			
		||||
function reset() {
 | 
			
		||||
    for (let x = 0; x < 5; x++) {
 | 
			
		||||
        for (let y = 0; y < 5; y++) {
 | 
			
		||||
            setState(state, x, y, Math.randomBoolean());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//Show the lifeChart based on the state
 | 
			
		||||
function show() {
 | 
			
		||||
    for (let x = 0; x < 5; x++) {
 | 
			
		||||
        for (let y = 0; y < 5; y++) {
 | 
			
		||||
            lifeChart.setPixel(x, y, getState(state, x, y));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    lifeChart.plotImage(0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//Core function
 | 
			
		||||
function gameOfLife() {
 | 
			
		||||
    let result: boolean[] = [];
 | 
			
		||||
 | 
			
		||||
    for (let x = 0; x < 5; x++) {
 | 
			
		||||
        for (let y = 0; y < 5; y++) {
 | 
			
		||||
            let count = 0;
 | 
			
		||||
 | 
			
		||||
            //Count the live cells in the next row
 | 
			
		||||
            if ((x + 1) < 5) {
 | 
			
		||||
                if (getState(state, x + 1, y)) {
 | 
			
		||||
                    count++;
 | 
			
		||||
                }
 | 
			
		||||
                if ((y + 1 < 5) && getState(state, x + 1, y + 1)) {
 | 
			
		||||
                    count++;
 | 
			
		||||
                }
 | 
			
		||||
                if ((y - 1 >= 0) && getState(state, x + 1, y - 1)) {
 | 
			
		||||
                    count++;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            //Count the live cells in the previous row
 | 
			
		||||
            if ((x - 1) >= 0) {
 | 
			
		||||
                if (getState(state, x - 1, y)) {
 | 
			
		||||
                    count++;
 | 
			
		||||
                }
 | 
			
		||||
                if ((y + 1 < 5) && getState(state, x - 1, y + 1)) {
 | 
			
		||||
                    count++;
 | 
			
		||||
                }
 | 
			
		||||
                if ((y - 1 >= 0) && getState(state, x - 1, y - 1)) {
 | 
			
		||||
                    count++;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            //Count the live cells in the current row exlcuding the current position.
 | 
			
		||||
            if ((y - 1 >= 0) && getState(state, x, y - 1)) {
 | 
			
		||||
                count++;
 | 
			
		||||
            }
 | 
			
		||||
            if ((y + 1 < 5) && getState(state, x, y + 1)) {
 | 
			
		||||
                count++;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Toggle live\dead cells based on the count.
 | 
			
		||||
            // Any live cell with fewer than two live neighbours dies, as if caused by underpopulation.
 | 
			
		||||
            // Any live cell with two or three live neighbours lives on to the next generation.
 | 
			
		||||
            // Any dead cell with exactly three live neighbours becomes a live cell, as if by reproduction            
 | 
			
		||||
            // Any live cell with more than three live neighbours dies, as if by overpopulation.
 | 
			
		||||
            switch (count) {
 | 
			
		||||
                case 0: setState(result, x, y, false); break;
 | 
			
		||||
                case 1: setState(result, x, y, false); break;
 | 
			
		||||
                case 2: setState(result, x, y, getState(state, x, y)); break;
 | 
			
		||||
                case 3: setState(result, x, y, true); break;
 | 
			
		||||
                default: setState(result, x, y, false); break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    //Update the state
 | 
			
		||||
    state = result;
 | 
			
		||||
}
 | 
			
		||||
//Initial reset & show
 | 
			
		||||
reset();
 | 
			
		||||
show();
 | 
			
		||||
```
 | 
			
		||||
@@ -68,6 +68,6 @@ closed = 175
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### ~button /projects/milk-jar-robot/connect
 | 
			
		||||
### ~button /projects/milk-carton-robot/connect
 | 
			
		||||
NEXT: Connect
 | 
			
		||||
### ~
 | 
			
		||||
		Reference in New Issue
	
	Block a user