Continuing down the Flex Path, I built another really crappy version of Conway’s Game of Life. Version 2 forthcoming.
I’m still figuring out this whole Flex thing, so please, any help would be much appreciated!
<?xml version="1.0" encoding="utf-8"?>
<mx:Application
xmlns:mx = "http://www.adobe.com/2006/mxml"
layout = "vertical"
creationComplete = "init(gameArea);"
width = "425"
height = "425"
>
<mx:Script><![CDATA[
import model.*;
private var board:Board;
private function init(application:DisplayObjectContainer):void {
board = new Board(application, 10, 0, 0, 30, 30, 5);
}
]]></mx:Script>
<mx:Canvas id="gameArea"></mx:Canvas>
<mx:HBox>
<mx:Button label="Reset" click="board.reset();" />
<mx:Button label="Update" click="board.update();" />
</mx:HBox>
</mx:Application>
package model {
import flash.display.DisplayObjectContainer;
public class Board {
private var size:int;
private var startX:int;
private var startY:int;
private var tileWidth:int;
private var tileHeight:int;
private var tileBuffer:int;
private var board:Array;
private var container:DisplayObjectContainer;
public function Board(
container:DisplayObjectContainer,
size:int,
startX:int,
startY:int,
tileWidth:int,
tileHeight:int,
tileBuffer:int
) {
this.container = container;
this.size = size;
this.startX = startX;
this.startY = startY;
this.tileWidth = tileWidth;
this.tileHeight = tileHeight;
this.tileBuffer = tileBuffer;
reset();
}
public function reset():void {
this.board = new Array(this.size);
var x:int = startX;
var y:int = startY;
clear();
for(var i:int = 0; i < this.size; i++) {
this.board[i] = new Array(this.size);
x = startX;
for(var j:int = 0; j < this.size; j++) {
board[i][j] = new Cell(x, y, tileWidth, tileHeight);
x += this.tileWidth + this.tileBuffer;
this.container.addChild(board[i][j]);
}
y += this.tileHeight + this.tileBuffer;
}
}
public function update():void {
var next:Array = next();
for(var i:int = 0; i < this.size; i++) {
for(var j:int = 0; j < this.size; j++) {
board[i][j].update(next[i][j]);
}
}
}
public function clear():void {
while(this.container.numChildren) {
this.container.removeChildAt(0);
}
}
public function next():Array {
var total:int = 0;
var next:Array = new Array(this.size);
for(var i:int = 0; i < this.size; i++) {
next[i] = new Array(this.size);
for(var j:int = 0; j < this.size; j++) {
next[i][j] = board[i][j].next(countNeighbors(i,j));
}
}
return next;
}
public function isValid(position:int):Boolean {
return(position >= 0 && position < this.size);
}
public function stateAt(i:int, j:int):Boolean {
if(isValid(i) && isValid(j)) {
return board[i][j].state;
}
return false;
}
public function countNeighbors(x:int, y:int):int {
var count:int = 0;
for(var i:int = x - 1; i <= x + 1; i++) {
for(var j:int = y - 1; j <= y + 1; j++) {
if(!(i == x && j == y) && stateAt(i,j)) {
count += 1;
}
}
}
return count;
}
}
}
package model {
import flash.events.MouseEvent;
import mx.controls.Button;
public class Cell extends Button {
public var state:Boolean;
public function Cell(x:int, y:int, width:int, height:int) {
this.x = x;
this.y = y;
this.width = width;
this.height = height;
this.addEventListener(MouseEvent.CLICK,swap);
this.reset();
}
public function reset():void {
this.state = false;
}
public function next(neighborCount:int):Boolean {
return((this.state && neighborCount == 2) || neighborCount == 3);
}
public function update(state:Boolean):void {
this.state = state;
if(this.state) {
this.label = "0";
} else {
this.label = "";
}
}
public function swap(e:MouseEvent):void {
update(!this.state);
}
}
}