/**
* This class is the controlling entity of Game Theory Matrix Solver
*
* Copyright (c) 2008 Gregory Sogorka.
*/
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.text.TextField;
import flash.text.TextFieldType;
import flash.utils.Dictionary;
public class Gametheory_Experiment extends Sprite
{
private var d : Dictionary;
private var columnAlert : TextField;
private var rowAlert : TextField;
private var saddlePointAlert : TextField;
private var totalColumns : int;
private var totalRows : int;
private var xPos : int = 100;
public function Gametheory_Experiment()
{
d = new Dictionary();
columnAlert = new TextField();
columnAlert.x = xPos;
columnAlert.y = 20;
columnAlert.width = 350;
addChild( columnAlert );
rowAlert = new TextField();
rowAlert.x = xPos;
rowAlert.y = 40;
rowAlert.width = 350;
addChild( rowAlert );
saddlePointAlert = new TextField();
saddlePointAlert.x = xPos;
saddlePointAlert.y = 60;
saddlePointAlert.width = 350;
addChild( saddlePointAlert );
for( var i : int = 0; i<4; i++ ){
for( var j : int = 0; j<4; j++ ){
var t : TextField = new TextField();
var num : Number = Math.floor( Math.random() * 10 );
t.text = ( Math.random() > .5 )?String(num):String(-1*num);
t.border = true;
t.borderColor = 0x00000000;
addChild( t );
t.x = j*20.5;
t.y = i*20.5;
t.width = 20;
t.height = 20;
t.type = TextFieldType.INPUT;
t.addEventListener( Event.CHANGE, textChange );
d[t]= { row : i, column : j };
}
}
totalColumns = j;
totalRows = i;
checkForSaddlePoints();
}
private function textChange( e : Event ) : void
{
checkForSaddlePoints();
}
private function getAllValuesInColumn( i : int ) : Array {
var a : Array= new Array();
for( var key : Object in d ) {
if( d[key]["column"] == i ) a.push( { column : d[key]["column"], row : d[key]["row"], value : TextField( key ).text } );
}
return a;
}
private function checkForSaddlePoints() : void {
columnAlert.htmlText = "Greatest Column Entry at : ";
rowAlert.htmlText = "Least Row Entry at : ";
saddlePointAlert.htmlText = "Saddle Points at : ";
resetTextFieldColors();
var aColumn : Array = new Array();
var aRow : Array = new Array();
var greatestColumns : Array = new Array();
var lowestRows : Array = new Array();
for( var key : Object in d )
{
//key is a textfield;
//c is TextField( key ) column index;
//r is TextField( key ) row index;
var c : Number = d[key]["column"];
var r : Number = d[key]["row"];
var t : TextField = TextField( key );
//If we've not encountered this column before lets decide what its greatest entry is an object holding that info to o
if( aColumn[c] != true )
{
var o : Object = findGreatestEntryInColumn( c, t );
//Change the color of the largest column entry
getTextFieldByCoordinate( o["row"], o["column"] ).textColor = 0xffff0000;
columnAlert.htmlText += " ["+o["row"]+" , "+o["column"] +"] "
//So further interations of our for() loop don't reevaluate this column
aColumn[c] = true;
greatestColumns.push( o );
}
//If we've not encountered this row before lets decide what its least entry is an object holding that info to or
if( aRow[r] != true )
{
var or : Object = findLowestEntryInRow( r, t );
//Change the color of the lowest row entry cell.
getTextFieldByCoordinate( or["row"], or["column"] ).textColor = 0xff0000ff;
rowAlert.htmlText += " ["+or["row"]+" , "+or["column"] +"] ";
aRow[r] = true;
lowestRows.push( or );
}
}
// Basically the dimensions of our MxN matrix
var cLength : int = greatestColumns.length;
var rLength : int = lowestRows.length;
for( var i : Number =0;i< cLength; i++ ){
var oCol : Object = greatestColumns[i];
for( var j : Number=0; j< lowestRows.length; j++ )
{
var oRow : Object = lowestRows[j];
//Check if the greatest column entry is the same as any of the least row entries
if( oCol["row"] == oRow["row"] && oCol["column"] == oRow["column"] )
{
//
saddlePointAlert.htmlText += " ["+oCol["row"]+" , "+oCol["column"]+"] ";
//Change the color of the saddle point cell to purple
getTextFieldByCoordinate( oCol["row"],oCol["column"]).textColor= 0xffA2627A;
}
}
}
}
private function findLowestEntryInRow( row : Number, changed : TextField ) : Object {
var o : Object = { column : d[changed]["column"], row : d[changed]["row"] };
var least : Number= Number( changed.text );
for( var key : Object in d ) {
if( d[key]["row"] == row ) {
var t : TextField = TextField( key );
var n : Number = Number( t.text );
if( n < least ){
least = n;
o= { row : d[key]["row"], column : d[key]["column"] };
}
}
}
return o;
}
private function findGreatestEntryInColumn( col : Number, changed : TextField ) : Object
{
var o : Object = { column : d[changed]["column"], row : d[changed]["row"] };
var greatest : Number = Number( changed.text );
for( var key : Object in d ) {
if( d[key]["column"] == col ) {
var t : TextField = TextField( key );
var n : Number = Number( t.text );
if( n > greatest ){
greatest = n;
o = { column : d[key]["column"], row : d[key]["row"] };
}
}
}
return o;
}
private function getTextFieldByCoordinate( row : int, column : int ) : TextField {
var t : TextField;
for( var key : Object in d ) {
if( d[key]["column"] == column && d[key]["row"] == row ) t= TextField( key );
}
return t;
}
private function resetTextFieldColors() : void {
for( var key : Object in d ) {
TextField( key ).textColor =0;
}
}
}
}