/** * 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; } } } }