function initGameOfLifeGui() {
$('select#gol-start-shape').change(function() {
var centerX = Math.floor(gridWidth / 2);
var centerY = Math.floor(gridHeight / 2);
clear();
switch (this.value) {
case '1': // glider
setDot(centerX, centerY - 1);
setDot(centerX + 1, centerY);
setDot(centerX - 1, centerY + 1);
setDot(centerX, centerY + 1);
setDot(centerX + 1, centerY + 1);
break;
case '2': // small exploder
setDot(centerX, centerY - 1);
setDot(centerX, centerY);
setDot(centerX - 1, centerY);
setDot(centerX + 1, centerY);
setDot(centerX - 1, centerY + 1);
setDot(centerX + 1, centerY + 1);
setDot(centerX, centerY + 2);
break;
case '3': // exploder
setDot(centerX, centerY - 2);
setDot(centerX, centerY + 2);
setDot(centerX - 2, centerY - 2);
setDot(centerX - 2, centerY - 1);
setDot(centerX - 2, centerY);
setDot(centerX - 2, centerY + 1);
setDot(centerX - 2, centerY + 2);
setDot(centerX + 2, centerY - 2);
setDot(centerX + 2, centerY - 1);
setDot(centerX + 2, centerY);
setDot(centerX + 2, centerY + 1);
setDot(centerX + 2, centerY + 2);
break;
case '4': // 10 cell row
setDot(centerX - 4, centerY);
setDot(centerX - 3, centerY);
setDot(centerX - 2, centerY);
setDot(centerX - 1, centerY);
setDot(centerX, centerY);
setDot(centerX + 1, centerY);
setDot(centerX + 2, centerY);
setDot(centerX + 3, centerY)
setDot(centerX + 4, centerY);
setDot(centerX + 5, centerY);
break;
case '5': // lightweight spaceship
setDot(centerX - 1, centerY - 2);
setDot(centerX, centerY - 2);
setDot(centerX + 1, centerY - 2);
setDot(centerX + 2, centerY - 2);
setDot(centerX + 2, centerY - 1);
setDot(centerX + 2, centerY);
setDot(centerX - 2, centerY - 1);
setDot(centerX - 2, centerY + 1);
setDot(centerX + 1, centerY + 1);
break;
case '6': // tumbler
setDot(centerX - 2, centerY - 2);
setDot(centerX - 2, centerY - 1);
setDot(centerX - 1, centerY - 2);
setDot(centerX - 1, centerY - 1);
setDot(centerX - 1, centerY);
setDot(centerX - 1, centerY + 1);
setDot(centerX - 1, centerY + 2);
setDot(centerX - 2, centerY + 3);
setDot(centerX - 3, centerY + 3);
setDot(centerX - 3, centerY + 2);
setDot(centerX - 3, centerY + 1);
setDot(centerX + 2, centerY - 2);
setDot(centerX + 2, centerY - 1);
setDot(centerX + 1, centerY - 2);
setDot(centerX + 1, centerY - 1);
setDot(centerX + 1, centerY);
setDot(centerX + 1, centerY + 1);
setDot(centerX + 1, centerY + 2);
setDot(centerX + 2, centerY + 3);
setDot(centerX + 3, centerY + 3);
setDot(centerX + 3, centerY + 2);
setDot(centerX + 3, centerY + 1);
break;
case '7': // gosper glider gun
setDot(centerX - 17, centerY - 4);
setDot(centerX - 17, centerY - 5);
setDot(centerX - 18, centerY - 4);
setDot(centerX - 18, centerY - 5);
setDot(centerX - 10, centerY - 4);
setDot(centerX - 10, centerY - 3);
setDot(centerX - 9, centerY - 3);
setDot(centerX - 9, centerY - 5);
setDot(centerX - 8, centerY - 5);
setDot(centerX - 8, centerY - 4);
setDot(centerX - 2, centerY - 3);
setDot(centerX - 2, centerY - 2);
setDot(centerX - 2, centerY - 1);
setDot(centerX - 1, centerY - 3);
setDot(centerX, centerY - 2);
setDot(centerX + 4, centerY - 5);
setDot(centerX + 4, centerY - 6);
setDot(centerX + 5, centerY - 5);
setDot(centerX + 5, centerY - 7);
setDot(centerX + 6, centerY - 7);
setDot(centerX + 6, centerY - 6);
setDot(centerX + 16, centerY - 7);
setDot(centerX + 17, centerY - 7);
setDot(centerX + 16, centerY - 6);
setDot(centerX + 17, centerY - 6);
setDot(centerX + 17, centerY + 0);
setDot(centerX + 17, centerY + 1);
setDot(centerX + 17, centerY + 2);
setDot(centerX + 18, centerY);
setDot(centerX + 19, centerY + 1);
setDot(centerX + 6, centerY + 5);
setDot(centerX + 7, centerY + 5);
setDot(centerX + 8, centerY + 5);
setDot(centerX + 6, centerY + 6);
setDot(centerX + 7, centerY + 7);
break;
default: // nop
}
});
$('#gol-next').click(function() {
$('#current-animation').html('Game Of Life');
initGameOfLifeAnimation();
drawGameOfLifeAnimation();
});
$('#gol-start').click(function() {
$('#current-animation').html('Game Of Life');
initGameOfLifeAnimation();
runAnimation(drawGameOfLifeAnimation);
});
$('#gol-reset').click(function() {
$('#current-animation').html('Game Of Life');
golInit = false;
stopAnimation();
clear();
});
}
var golGenerations = 0;
var golInit = false;
function initGameOfLifeAnimation() {
if (golInit == true) {
return;
}
golGenerations = 0;
golInit = true;
}
function drawGameOfLifeAnimation() {
newGrid = new Array(gridWidth);
for (var x = 0; x < gridWidth; x++) {
newGrid[x] = new Array(gridHeight);
for (var y = 0; y < gridHeight; y++) {
newGrid[x][y] = false;
}
}
for (var x = 0; x < gridWidth; x++) {
for (var y = 0; y < gridHeight; y++) {
var neighbors = getNeighborCount(x, y);
if (dots[x][y] == true) {
newGrid[x][y] = (neighbors == 2 || neighbors == 3);
}
else {
newGrid[x][y] = (neighbors == 3);
}
}
}
clear();
for (var x = 0; x < gridWidth; x++) {
for (var y = 0; y < gridHeight; y++) {
if (newGrid[x][y] == true) {
setDot(x, y);
}
}
}
$('#gol-generations').html(golGenerations.toString());
golGenerations++;
if (golGenerations > 10000)
stopAnimation();
}
function getNeighborCount(x, y) {
var count = 0;
if (isDot(x - 1, y - 1)) count++;
if (isDot(x, y - 1)) count++;
if (isDot(x + 1, y - 1)) count++;
if (isDot(x + 1, y)) count++;
if (isDot(x + 1, y + 1)) count++;
if (isDot(x, y + 1)) count++;
if (isDot(x - 1, y + 1)) count++;
if (isDot(x - 1, y)) count++;
return count;
}