テストテストテストテストテストテストテストテストテストテストテストテスト
* Implemented in TypeScript
* To learn more about TypeScript, please visit http://www.typescriptlang.org/
constructor(row: number, col: number, live: boolean) {
export class GameOfLife {
private gridSize: number;
private canvasSize: number;
private lineColor: string;
private liveColor: string;
private deadColor: string;
private initialLifeProbability: number;
private animationRate: number;
private cellSize: number;
private context: CanvasRenderingContext2D;
this.lineColor = '#cdcdcd';
this.initialLifeProbability = 0.5;
this.world = this.createWorld();
return this.travelWorld( (cell : Cell) => {
cell.live = Math.random() < this.initialLifeProbability;
public circleOfLife() : void {
this.world = this.travelWorld( (cell: Cell) => {
cell = this.world[cell.row][cell.col];
return this.resolveNextGeneration(cell);
setTimeout( () => {this.circleOfLife()}, this.animationRate);
public resolveNextGeneration(cell : Cell) {
var count = this.countNeighbors(cell);
var newCell = new Cell(cell.row, cell.col, cell.live);
if(count < 2 || count > 3) newCell.live = false;
else if(count == 3) newCell.live = true;
public countNeighbors(cell : Cell) {
for(var row = -1; row <=1; row++) {
for(var col = -1; col <= 1; col++) {
if(row == 0 && col == 0) continue;
if(this.isAlive(cell.row + row, cell.col + col)) {
public isAlive(row : number, col : number) {
if(row < 0 || col < 0 || row >= this.gridSize || col >= this.gridSize) return false;
return this.world[row][col].live;
public travelWorld(callback) {
for(var row = 0; row < this.gridSize; row++) {
for(var col = 0; col < this.gridSize; col++) {
rowData.push(callback(new Cell(row, col, false)));
public draw(cell : Cell) {
if(this.context == null) this.context = this.createDrawingContext();
if(this.cellSize == 0) this.cellSize = this.canvasSize/this.gridSize;
this.context.strokeStyle = this.lineColor;
this.context.strokeRect(cell.row * this.cellSize, cell.col*this.cellSize, this.cellSize, this.cellSize);
this.context.fillStyle = cell.live ? this.liveColor : this.deadColor;
this.context.fillRect(cell.row * this.cellSize, cell.col*this.cellSize, this.cellSize, this.cellSize);
public createDrawingContext() {
var canvas = <HTMLCanvasElement> document.getElementById('conway-canvas');
canvas = document.createElement('canvas');
canvas.id = 'conway-canvas';
canvas.width = this.canvasSize;
canvas.height = this.canvasSize;
document.body.appendChild(canvas);
return canvas.getContext('2d');
var game = new Conway.GameOfLife();