After spending a few dozen hours playing The War of the Roosevelts, I realized that there was a wee bit of room for improvement.
Now, there's like cards and stuff.
Enjoy.
Here's the source, but I still won't waste my time looking up the svn link.
Tags: flex, game programming
I've been tinkering around with C# and Flex a lot this year, but I haven't been posting much.
So in the interest of posting *something* I give you...
*drumroll*
You, standing in the (uneven?) shoes of Franklin D. Roosevelt, finally get a posthumous chance to stand up to your bullying older cousin Teddy in a game of WAR...well, at least the game of war as I knew it growing up. Wikipedia's got it's own ideas.
I lost interest in it by the time I got to the gui, so that aspects (aka as the part people actually see) is a bit...rough. Just a bit. ENJOY!
Here's the source, but I won't waste my time looking up the svn link.
Tags: flex, game programming
Okay, so it's hardly an announcement, but I've been working on a flex app for determining your daily official xkcd meetup location via the geohashing method described in comic 426.
Much love to:
I'm still learning Flex and this is my first adventure with Google Map, so it's rough. And there's still a lot of work to do, like, validation, error checking, or testing for example. But hey, first pass!
Here's the code for the actual GeoHash class. I have "view source" disabled because it currently contains my API key, but you can download the key-less zip.
public class GeoHasher {
private var date:Date;
private var dow:Number;
private var latitude:Number;
private var longitude:Number;
private var dateHash:String;
private var dowHash:String;
private var ready:Boolean;
public function GeoHasher() {
this.ready = false;
}
public function reset(
date:Date,
dow:Number,
latitude:Number,
longitude:Number
):void {
this.date = date;
this.dow = dow;
this.latitude = latitude;
this.longitude = longitude;
this.ready = true;
setHashValues();
}
public function getDestination():Object {
if(ready) {
var hash:Object = getHashAsDecimal();
return {
latitude: toOrdinal(latitude, hash.date),
longitude: toOrdinal(longitude, hash.dow)
};
}
return { latitude: "", longitude: "" };
}
// privates
private function setHashValues():void {
var formattedDate:String = Utilities.dateFormat(date,"-");
var string:String = formattedDate + "-" + dow.toString();
var hash:String = MD5.encrypt(string);
dateHash = hash.slice(0,hash.length / 2);
dowHash = hash.slice(hash.length / 2,hash.length);
}
private function toOrdinal(pre:Number, post:Number):String {
return (Math.floor(pre) + post).toString();
}
private function getHash():Object {
return { date: dateHash, dow: dowHash };
}
private function getHashAsDecimal():Object {
var hash:Object = getHash();
return {
date: Utilities.fractionalHexToDecimal(hash.date),
dow: Utilities.fractionalHexToDecimal(hash.dow)
};
}
}
Tags: actionscript, flex, geohashflash, geohashing, xkcd
I made a few user interface updates to my crappy Flex version of Conway's Game of Life.
The board now wraps, and I added a Timer with an adjustable delay via the lovely HSlider control. I wanted to replace the cells with Sprites but it's giving me grief and I want to play The Sims.
I'm still making my mind up about Flex, but I have to admit that aside from the Sprite issue I've been pleasantly surprised at how easy everything's been coming together.
You can view source on the application, or you can download the zip.
Tags: actionscript, flex, game of life
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);
}
}
}
Tags: actionscript, flex, game of life