Zurück   Flashforum > Flash > ActionScript > Spielkonzepte und Spieleprogrammierung

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 29-10-2004, 12:41   #1 (permalink)
[+]
 
Benutzerbild von André Michelle
 
Registriert seit: Dec 2002
Ort: cologne
Beiträge: 2.271
[stuff] Array2d

Was zum Sammeln oder schnell ein Tetris abreissen.
Mit dieser Klasse kann man bequem ein rechteckiges zweidimensionales Array verwalten. Ich habe versucht alle Array Methoden auf das Array2d zu übertragen. Es lassen sich also Zeilen oder Spalten löschen, verschieben, hinzufügen, dazwischenfügen. Das Array lässt sich spiegeln und/oder drehen.

Vielleicht hat noch jemand weitere Ideen ?

Beispiel:
Code:
import org.gamepackage.util.*;

var map: Array2d = new Array2d(
	[1,2,3,0],
	[4,5,6,0],
	[7,8,9,0]
);

trace( "UrsprungsMap" );
trace( map );
trace( "Ab Spalte 1, 2 Einträge löschen und zurückgeben. 2 Spalten hinzufügen( [ 1 , 2 , 3 ] , [ 4 , 5 , 6 ] )." );
trace( map.spliceCol( 1 , 2 , [ 1 , 2 , 3 ] , [ 4 , 5 , 6 ] ) );
trace( "Neue Map" );
trace( map );
trace( "Drehen um den Urzeigersinn" );
map.rotateClockwise();
trace( "Neue Map" );
trace( map );
trace( "Drehen gegen den Urzeigersinn" );
map.rotateAntiClockwise();
trace( "Neue Map" );
trace( map );
Ausgabe:
Zitat:
UrsprungsMap
1,2,3,0
4,5,6,0
7,8,9,0
Ab Spalte 1, 2 Einträge löschen und zurückgeben. 2 Spalten hinzufügen( [ 1 , 2 , 3 ] , [ 4 , 5 , 6 ] ).
2,3
5,6
8,9
Neue Map
1,1,4,0
4,2,5,0
7,3,6,0
Drehen um den Urzeigersinn
Neue Map
7,4,1
3,2,1
6,5,4
0,0,0
Drehen gegen den Urzeigersinn
Neue Map
1,1,4,0
4,2,5,0
7,3,6,0
Code:
/* class Array2d
* 
*  MODIFY RECTANGLE 2D MAPS
*/

class org.gamepackage.util.Array2d extends Array
{
	/*
	* CONSTRUCTOR
	*/
	function Array2d()
	{
		splice.apply( this , [ 0 , 0 ].concat( arguments ) );
	}
	
	/*
	* PUSHES A NEW ROW TO INSTANCE
	* RETURN NEW ROW LENGTH
	*/
	function pushRow( row: Array ): Number
	{
		if( row.length != this[0].length ) return null;
		
		return push( row );
	}
	
	/*
	* PUSHES A NEW COL TO INSTANCE
	* RETURN NEW COL LENGTH
	*/
	function pushCol( col: Array ): Number
	{
		if( col.length != this.length ) return null;
		
		var len: Number = length;
		
		while( --len > -1 )
		{
			this[ len ].push( col[ len ] );
		}
		
		return this[0].length;
	}
	
	/*
	* UNSHIFT A NEW ROW TO INSTANCE
	* RETURN NEW ROW LENGTH
	*/
	function unshiftRow( row: Array ): Number
	{
		if( row.length != this[0].length ) return null;
		
		return unshift( row );
	}
	
	/*
	* UNSHIFT A NEW COL TO INSTANCE
	* RETURN NEW COL LENGTH
	*/
	function unshiftCol( col: Array ): Number
	{
		if( col.length != this.length ) return null;
		
		var len: Number = length;
		
		while( --len > -1 )
		{
			this[ len ].unshift( col[ len ] );
		}
		
		return this[0].length;
	}
	
	/*
	* REMOVE LAST ROW FROM INSTANCE
	* RETURN REMOVED ROW
	*/
	function popRow( Void ): Array
	{
		return Array( pop() );
	}
	
	/*
	* REMOVE LAST COL FROM INSTANCE
	* RETURN REMOVED COL
	*/
	function popCol( Void ): Array
	{
		var col: Array = new Array;
		
		var len: Number = length;
		
		while( --len > -1 )
		{
			col.unshift( this[ len ].pop() );
		}
		
		return col;
	}
	
	/*
	* REMOVE FIRST ROW FROM INSTANCE
	* RETURN REMOVED ROW
	*/
	function shiftRow( Void ): Array
	{
		return Array( shift() );
	}
	
	/*
	* REMOVE FIRST COL FROM INSTANCE
	* RETURN REMOVED COL
	*/
	function shiftCol( Void ): Array
	{
		var col: Array = new Array;
		
		var len: Number = length;
		
		while( --len > -1 )
		{
			col.unshift( this[ len ].shift() );
		}
		
		return col;
	}
	
	/*
	* REMOVE ROWS FROM START TO END INDEX IN INSTANCE
	* RETURNS NEW ARRAY2D WITH REMOVED ROWS
	*/
	function sliceRow( start: Number, end: Number ): Array2d
	{
		start = start - 1 || 0;
		end   = end || length;
		
		var result: Array2d = new Array2d();
		
		while( --end > start )
		{
			result.unshift( this[ end ] );
		}
		
		return result;
	}
	
	/*
	* REMOVE COLS FROM START TO END INDEX IN INSTANCE
	* RETURNS NEW ARRAY2D WITH REMOVED COLS
	*/
	function sliceCol( start: Number, end: Number ): Array2d
	{
		start = start || 0;
		end   = end || length;
		
		var result: Array2d = new Array2d();
		
		var len: Number = length;
		
		while( --len > -1 )
		{
			result.unshift( this[len].slice( start, end ) );
		}
		
		return result;
	}
	
	/*
	* REMOVE 'deleteCount' ROWS FROM STARTINDEX AND INSERT PASSED ROWS ARRAYS
	* RETURNS REMOVED ROWS
	*/
	function spliceRow( start: Number, deleteCount: Number )	//@ TODO: FIX RETURN TYPE( Array2d )
	{
		return splice.apply( this , [ start , deleteCount ].concat( arguments.slice( 2 ) ) );
	}
	
	/*
	* REMOVE 'deleteCount' COLS FROM STARTINDEX AND INSERT PASSED COLS ARRAYS
	* RETURNS REMOVED COLS AS COPY(!) <<< NOT LIKE FLASH ARRAY
	*/
	function spliceCol( start: Number, deleteCount: Number ): Array2d
	{
		var len: Number = length;
		
		var result: Array2d = new Array2d();
		
		var newCols: Array = arguments.slice( 2 );
		
		while( --len > -1 )
		{
			result.unshift( this[len].splice( start , deleteCount ) );
			
			var cn: Number = newCols.length;
			
			while( --cn > -1 )
			{
				this[len].splice( start , 0 , newCols[ cn ][ len ] );
			}
		}
		
		return result;
	}
	
	/*
	* ROTATE ALL ARRAY2D ENTRIES AROUND CENTER
	*/
	
	function rotateClockwise( Void ): Void
	{
		var copy: Array2d = clone();
		
		var len: Number = this[0].length;
	
		splice( 0 );
		
		while( --len > -1 )
		{
			var o = copy.shiftCol();
			o.reverse();
			push( o );
		}
	}
	
	/*
	* ROTATE ALL ARRAY2D ENTRIES AROUND CENTER
	*/
	
	function rotateAntiClockwise( Void ): Void
	{
		var copy: Array2d = clone();
		
		var len: Number = this[0].length;
	
		splice( 0 );
		
		while( --len > -1 )
		{
			this[ len ] = copy.shiftCol();
		}
	}
	
	/*
	* FLIP ALL ARRAY2D ENTRIES HORIZONTAL
	*/
	
	function flipHorizontal( Void ): Void
	{
		var len: Number = length;
		
		while( --len > -1 )
		{
			this[ len ].reverse();
		}
	}
	
	/*
	* FLIP ALL ARRAY2D ENTRIES VERTICAL
	*/
	
	function flipVertical( Void ): Void
	{
		reverse();
	}
	
	/*
	* RETURN NUMBER OF COLS
	*/
	
	function getNumCols( Void ): Number
	{
		return this[0].length;
	}
	
	/*
	* RETURN NUMBER OF ROWS
	*/
	
	function getNumRows( Void ): Number
	{
		return length;
	}
	
	/*
	* RETURNS TRUE IF ARRAY2D IS RECTANGLE
	* AND FALSE IF NOT > INVAID
	*/
	
	function isRect( Void ): Boolean
	{
		var l0: Number = 0;
		var l1: Number = Number.POSITIVE_INFINITY;
		var len: Number = length;
		
		var min: Function = Math.min;
		var max: Function = Math.max;
		
		while( --len > -1 )
		{
			l0 = max( this[ len ].length , l0 );
			l1 = min( this[ len ].length , l1 );
		}
		
		return l0 == l1;
	}
	
	/*
	* RETURNS A CLONE OF THE INSTANCE
	*/
	
	function clone( Void ): Array2d
	{
		var copy: Array2d = new Array2d;
		
		var len: Number = length;
		
		while( --len > -1 )
		{
			copy[ len ] = this[ len ].slice();
		}
		
		return copy;
	}
	
	/*
	* RETURN FORMATTED STRING (EACH ROW A LINE)
	*/
	
	function toString( Void ): String
	{
		return join( newline );
	}
}
__________________
aM

blog | laboratory | tonfall | processing

Audiotool.com

Geändert von André Michelle (29-10-2004 um 12:49 Uhr)
André Michelle ist offline   Mit Zitat antworten
Alt 29-10-2004, 14:14   #2 (permalink)
flachzange
 
Benutzerbild von elias
 
Registriert seit: Jun 2003
Ort: berlin
Beiträge: 3.932
nette idee!
nur bastel ich experimenteller weise an einem tetris mit einem linearen array,
aber ganz durchsteigen tu ich da noch nicht


-) 1
rotateAntiClockwise() in rotateCounterClockwise() oder rotateCCW() umbenennen

-) 2
sumRow([row_id])
sumCol([col_id])
berechnet summe aus arrays mit nummern.

-) 3
countTypeOf([typ])
zählt die datentypen die in einer reihe/zeile existieren.

-) 4
getNextlIdCo([wert|typ], [toptobottom|bottomtotop] [, [offset] ])
getNextIdRow([wert|typ], [lefttoright|righttoleft] [, [offset] ])
sucht in reihe oder spalte von oben nach unten bzw von links nach rechts
nach bestimmten wert. offset und suchrichtung optional?!?

hab jetzt sicher etwas tetris gerichtet gedacht, so hätte man schon ne
menge methoden die man braucht.
__________________
elias ist offline   Mit Zitat antworten
Alt 30-10-2004, 00:04   #3 (permalink)
helpQLODhelp
 
Benutzerbild von bokel
 
Registriert seit: Feb 2002
Ort: Köln
Beiträge: 8.505
Nur weil ich gerade hier sehe, Void als Parameter für eine Funktion hat in Flash leider nicht den Effekt, dass der Compiler Parameter verbietet. Stattdessen wird eine sinnlose Variable angelegt.

ActionScript:
  1. class TestClass {
  2.    
  3.     function testMethod( Void): Void
  4.     {
  5.         trace( Void);
  6.     }
  7. }
  8.  
  9. // test auf root
  10. new TestClass().testMethod("hi bokel");
  11. // ausgabe hi bokel
  12.  

mfg r.

Geändert von bokel (30-10-2004 um 00:11 Uhr)
bokel ist offline   Mit Zitat antworten
Alt 01-11-2004, 22:11   #4 (permalink)
flachzange
 
Benutzerbild von elias
 
Registriert seit: Jun 2003
Ort: berlin
Beiträge: 3.932
hab jetzt einige der vorgeschlagenen funktionen hinzugefügt.
ausserdem habe ich noch eine ArrayUtil klasse gebaut die einige
funktionen bietet um (mehrdimensionale-)arrays zu generieren.

ArrayUtil Klasse:
ActionScript:
  1. class ArrayUtil
  2. {
  3.    
  4.     /*
  5.         returns array with numbers from 'start' to 'end', 'skip' increments
  6.         between each step.
  7.     */
  8.     static function range(start:Number, end:Number, skip:Number):Array
  9.     {
  10.         var a:Array = new Array();
  11.        
  12.         while( start <= end)
  13.         {
  14.             a.push(start);
  15.             start += skip;
  16.         }
  17.        
  18.         return a;
  19.     }
  20.    
  21.     /*
  22.         returns 2-dimensional array with numbers from 'start' to 'end', 'skip'
  23.         increments between each step.
  24.     */
  25.     static function range2d(s0:Number, e0:Number, sk0:Number, s1:Number, e1:Number, sk1:Number):Array
  26.     {
  27.         var r:Array = new Array();
  28.         var a:Array  = new Array();
  29.        
  30.         while( s0 <= e0)
  31.         {
  32.             r.push(s0);
  33.             s0 += sk0;
  34.         }
  35.        
  36.         while( s1 <= e1 )
  37.         {
  38.             a.push(r);
  39.             s1 += sk1;
  40.         }
  41.  
  42.         return a;
  43.     }
  44.    
  45.     /*
  46.         fills array with 'value' beginning at index 'start', to 'num' more indices.
  47.     */
  48.     static function fill(start:Number, num:Number, value):Array
  49.     {
  50.         var a:Array    = new Array();
  51.         var len:Number = start + num;
  52.        
  53.         while( start <= len)
  54.         {
  55.             a[start] = value;
  56.             start++;
  57.         }
  58.        
  59.         return a;
  60.     }
  61.    
  62.     /*
  63.         creates 2d-array ArrayUtil.fill like.
  64.     */
  65.     static function fill2d(xS:Number, xE:Number, yS:Number, yE:Number, value):Array
  66.     {
  67.         var r:Array    = new Array();
  68.         var len:Number = xS + xE;
  69.        
  70.         while( xS <= len)
  71.         {
  72.             r[xS] = value;
  73.             xS++;
  74.         }
  75.        
  76.         var a:Array    = new Array();
  77.         var len:Number = yS + yE;
  78.    
  79.         while( yS <= len)
  80.         {
  81.             a[yS] = r;
  82.             yS++;
  83.         }
  84.        
  85.         return a;
  86.     }
  87.    
  88.     /*
  89.         creates 2d-array
  90.     */
  91.     static function map(x, y, value)
  92.     {
  93.         var r:Array  = new Array();
  94.         var i:Number = -1;
  95.        
  96.         while( i++ < x) r.push(value);
  97.        
  98.         var a:Array  = new Array();
  99.         var i:Number = -1;
  100.        
  101.         while( i++ < y) a.push(r);
  102.        
  103.         return a;
  104.     }
  105.    
  106.     /*
  107.         creates 2d-array with an outline value of 'outer'
  108.     */
  109.     static function borderedMap(x, y, outer, inner)
  110.     {
  111.         var outerRow:Array = ArrayUtil.fill(0, x, outer);
  112.         var innerRow:Array = new Array();
  113.         var i:Number       = -1;
  114.        
  115.         while( i++ < x)
  116.         {
  117.             if (i == 0 || i == x)
  118.             {
  119.                 innerRow.push(outer);
  120.             }
  121.             else
  122.             {
  123.                 innerRow.push(inner);
  124.             }
  125.         }
  126.        
  127.         var a:Array  = new Array();
  128.         var i:Number = -1;
  129.        
  130.         while( i++ < y)
  131.         {
  132.             if (i == 0 || i == y)
  133.             {
  134.                 a.push(outerRow);
  135.             }
  136.             else
  137.             {
  138.                 a.push(innerRow);
  139.             }
  140.         }
  141.        
  142.         return a;
  143.     }
  144.    
  145. }

die ArrayUtil.fill|fill2d sind vermutlich nutzlos, denn wenn ein array nicht
bei 0 anfängt werden die vorlaufenden indizes auf undefined gesetzt.
ArrayUtil.range|range2d kann man wohl seltener gebrauchen.
die map methoden bieten schonmal eine nette grundlage für maps
mit einheitlich vordefinierten werten.

Array2d mit den hinzugefügten methoden:
ActionScript:
  1. /* class Array2d
  2. *
  3. *  MODIFY RECTANGLE 2D MAPS
  4. */
  5.  
  6. class Array2d extends Array
  7. {
  8.     /*
  9.     * CONSTRUCTOR
  10.     */
  11.     function Array2d()
  12.     {
  13.         splice.apply( this , [ 0 , 0 ].concat( arguments[0] ) );
  14.     }
  15.    
  16.     /*
  17.     * PUSHES A NEW ROW TO INSTANCE
  18.     * RETURN NEW ROW LENGTH
  19.     */
  20.     function pushRow( row: Array ): Number
  21.     {
  22.         if( row.length != this[0].length ) return null;
  23.        
  24.         return push( row );
  25.     }
  26.    
  27.     /*
  28.     * PUSHES A NEW COL TO INSTANCE
  29.     * RETURN NEW COL LENGTH
  30.     */
  31.     function pushCol( col: Array ): Number
  32.     {
  33.         if( col.length != this.length ) return null;
  34.        
  35.         var len: Number = length;
  36.        
  37.         while( --len > -1 )
  38.         {
  39.             this[ len ].push( col[ len ] );
  40.         }
  41.        
  42.         return this[0].length;
  43.     }
  44.    
  45.     /*
  46.     * UNSHIFT A NEW ROW TO INSTANCE
  47.     * RETURN NEW ROW LENGTH
  48.     */
  49.     function unshiftRow( row: Array ): Number
  50.     {
  51.         if( row.length != this[0].length ) return null;
  52.        
  53.         return unshift( row );
  54.     }
  55.    
  56.     /*
  57.     * UNSHIFT A NEW COL TO INSTANCE
  58.     * RETURN NEW COL LENGTH
  59.     */
  60.     function unshiftCol( col: Array ): Number
  61.     {
  62.         if( col.length != this.length ) return null;
  63.        
  64.         var len: Number = length;
  65.        
  66.         while( --len > -1 )
  67.         {
  68.             this[ len ].unshift( col[ len ] );
  69.         }
  70.        
  71.         return this[0].length;
  72.     }
  73.    
  74.     /*
  75.     * REMOVE LAST ROW FROM INSTANCE
  76.     * RETURN REMOVED ROW
  77.     */
  78.     function popRow( Void ): Array
  79.     {
  80.         return Array( pop() );
  81.     }
  82.    
  83.     /*
  84.     * REMOVE LAST COL FROM INSTANCE
  85.     * RETURN REMOVED COL
  86.     */
  87.     function popCol( Void ): Array
  88.     {
  89.         var col: Array = new Array;
  90.        
  91.         var len: Number = length;
  92.        
  93.         while( --len > -1 )
  94.         {
  95.             col.unshift( this[ len ].pop() );
  96.         }
  97.        
  98.         return col;
  99.     }
  100.    
  101.     /*
  102.     * REMOVE FIRST ROW FROM INSTANCE
  103.     * RETURN REMOVED ROW
  104.     */
  105.     function shiftRow( Void ): Array
  106.     {
  107.         return Array( shift() );
  108.     }
  109.    
  110.     /*
  111.     * REMOVE FIRST COL FROM INSTANCE
  112.     * RETURN REMOVED COL
  113.     */
  114.     function shiftCol( Void ): Array
  115.     {
  116.         var col: Array = new Array;
  117.        
  118.         var len: Number = length;
  119.        
  120.         while( --len > -1 )
  121.         {
  122.             col.unshift( this[ len ].shift() );
  123.         }
  124.        
  125.         return col;
  126.     }
  127.    
  128.     /*
  129.     * REMOVE ROWS FROM START TO END INDEX IN INSTANCE
  130.     * RETURNS NEW ARRAY2D WITH REMOVED ROWS
  131.     */
  132.     function sliceRow( start: Number, end: Number ): Array2d
  133.     {
  134.         start = start - 1 || 0;
  135.         end   = end || length;
  136.        
  137.         var result: Array2d = new Array2d();
  138.        
  139.         while( --end > start )
  140.         {
  141.             result.unshift( this[ end ] );
  142.         }
  143.        
  144.         return result;
  145.     }
  146.    
  147.     /*
  148.     * REMOVE COLS FROM START TO END INDEX IN INSTANCE
  149.     * RETURNS NEW ARRAY2D WITH REMOVED COLS
  150.     */
  151.     function sliceCol( start: Number, end: Number ): Array2d
  152.     {
  153.         start = start || 0;
  154.         end   = end || length;
  155.        
  156.         var result: Array2d = new Array2d();
  157.        
  158.         var len: Number = length;
  159.        
  160.         while( --len > -1 )
  161.         {
  162.             result.unshift( this[len].slice( start, end ) );
  163.         }
  164.        
  165.         return result;
  166.     }
  167.    
  168.     /*
  169.     * REMOVE 'deleteCount' ROWS FROM STARTINDEX AND INSERT PASSED ROWS ARRAYS
  170.     * RETURNS REMOVED ROWS
  171.     */
  172.     function spliceRow( start: Number, deleteCount: Number )    //@ TODO: FIX RETURN TYPE( Array2d )
  173.     {
  174.         return splice.apply( this , [ start , deleteCount ].concat( arguments.slice( 2 ) ) );
  175.     }
  176.    
  177.     /*
  178.     * REMOVE 'deleteCount' COLS FROM STARTINDEX AND INSERT PASSED COLS ARRAYS
  179.     * RETURNS REMOVED COLS AS COPY(!) <<< NOT LIKE FLASH ARRAY
  180.     */
  181.     function spliceCol( start: Number, deleteCount: Number ): Array2d
  182.     {
  183.         var len: Number = length;
  184.        
  185.         var result: Array2d = new Array2d();
  186.        
  187.         var newCols: Array = arguments.slice( 2 );
  188.        
  189.         while( --len > -1 )
  190.         {
  191.             result.unshift( this[len].splice( start , deleteCount ) );
  192.            
  193.             var cn: Number = newCols.length;
  194.            
  195.             while( --cn > -1 )
  196.             {
  197.                 this[len].splice( start , 0 , newCols[ cn ][ len ] );
  198.             }
  199.         }
  200.        
  201.         return result;
  202.     }
  203.    
  204.     /*
  205.     * ROTATE ALL ARRAY2D ENTRIES AROUND CENTER
  206.     */
  207.    
  208.     function rotateCW( Void ): Void
  209.     {
  210.         var copy: Array2d = clone();
  211.        
  212.         var len: Number = this[0].length;
  213.    
  214.         splice( 0 );
  215.        
  216.         while( --len > -1 )
  217.         {
  218.             var o = copy.shiftCol();
  219.             o.reverse();
  220.             push( o );
  221.         }
  222.     }
  223.    
  224.     /*
  225.     * ROTATE ALL ARRAY2D ENTRIES AROUND CENTER
  226.     */
  227.    
  228.     function rotateCCW( Void ): Void
  229.     {
  230.         var copy: Array2d = clone();
  231.        
  232.         var len: Number = this[0].length;
  233.    
  234.         splice( 0 );
  235.        
  236.         while( --len > -1 )
  237.         {
  238.             this[ len ] = copy.shiftCol();
  239.         }
  240.     }
  241.    
  242.     /*
  243.     * FLIP ALL ARRAY2D ENTRIES HORIZONTAL
  244.     */
  245.    
  246.     function flipHorizontal( Void ): Void
  247.     {
  248.         var len: Number = length;
  249.        
  250.         while( --len > -1 )
  251.         {
  252.             this[ len ].reverse();
  253.         }
  254.     }
  255.    
  256.     /*
  257.     * FLIP ALL ARRAY2D ENTRIES VERTICAL
  258.     */
  259.    
  260.     function flipVertical( Void ): Void
  261.     {
  262.         reverse();
  263.     }
  264.    
  265.     /*
  266.     * RETURN NUMBER OF COLS
  267.     */
  268.    
  269.     function getNumCols( Void ): Number
  270.     {
  271.         return this[0].length;
  272.     }
  273.    
  274.     /*
  275.     * RETURN NUMBER OF ROWS
  276.     */
  277.    
  278.     function getNumRows( Void ): Number
  279.     {
  280.         return length;
  281.     }
  282.    
  283.     /*
  284.     * RETURNS TRUE IF ARRAY2D IS RECTANGLE
  285.     * AND FALSE IF NOT > INVAID
  286.     */
  287.    
  288.     function isRect( Void ): Boolean
  289.     {
  290.         var l0: Number = 0;
  291.         var l1: Number = Number.POSITIVE_INFINITY;
  292.         var len: Number = length;
  293.        
  294.         var min: Function = Math.min;
  295.         var max: Function = Math.max;
  296.        
  297.         while( --len > -1 )
  298.         {
  299.             l0 = max( this[ len ].length , l0 );
  300.             l1 = min( this[ len ].length , l1 );
  301.         }
  302.        
  303.         return l0 == l1;
  304.     }
  305.    
  306.     /*
  307.     * RETURNS A CLONE OF THE INSTANCE
  308.     */
  309.    
  310.     function clone( Void ): Array2d
  311.     {
  312.         var copy: Array2d = new Array2d;
  313.        
  314.         var len: Number = length;
  315.        
  316.         while( --len > -1 )
  317.         {
  318.             copy[ len ] = this[ len ].slice();
  319.         }
  320.        
  321.         return copy;
  322.     }
  323.    
  324.     /*
  325.     * RETURN FORMATTED STRING (EACH ROW A LINE)
  326.     */
  327.    
  328.     function toString( Void ): String
  329.     {
  330.         return join( newline );
  331.     }
  332.    
  333.     function sumRow(id):Number
  334.     {
  335.         var sum: Number = 0;
  336.         var len: Number = this[id].length;
  337.        
  338.         while( --len > -1 )
  339.         {
  340.             sum += this[id][len];
  341.         }
  342.        
  343.         return sum;
  344.     }   
  345.    
  346.     function sumCol(id):Number
  347.     {
  348.         var sum: Number = 0;
  349.         var len: Number = length;
  350.        
  351.         while( --len > -1 )
  352.         {
  353.             sum += this[len][id];
  354.         }
  355.        
  356.         return sum;
  357.     }
  358.    
  359.     function countTypesRow(id, type)
  360.     {
  361.         var cnt: Number = 0;
  362.         var len: Number = this[id].length;
  363.        
  364.         while( --len > -1 )
  365.         {
  366.             if(typeof(this[id][len]) == type) cnt ++;
  367.         }
  368.        
  369.         return cnt;
  370.     }
  371.    
  372.     function countTypesCol(id, type):Number
  373.     {
  374.         var cnt: Number = 0;
  375.         var len: Number = length;
  376.        
  377.         while( --len > -1 )
  378.         {
  379.             if(typeof(this[len][id]) == type) cnt++;
  380.         }
  381.        
  382.         return cnt;
  383.     }
  384.    
  385.  
  386. }

countTypes* und sum* sind neu und könnten zb das finden von kompletten
reihen für tetris transparenter gestalten.

edit:
ganz wichtig. ich habe den konstruktor der Array2d klasse geändert.
jetzt wird ein einziges array erwartet und keine einzelnen reihen die
als argumente übergeben werden. so ist es auch möglich ein ganzes array
zu übergeben.

edit2:
ohgott! nächstes mal mach ich nen anhang
__________________

Geändert von elias (01-11-2004 um 22:14 Uhr)
elias ist offline   Mit Zitat antworten
Alt 02-11-2004, 10:03   #5 (permalink)
[+]
 
Benutzerbild von André Michelle
 
Registriert seit: Dec 2002
Ort: cologne
Beiträge: 2.271
Super. Ich habe gerade ein Isofeld damit aufgebaut und es erleichtert die Sache enorm (Mal eben drehen:).

Wofür braucht du das typeof ?
__________________
aM

blog | laboratory | tonfall | processing

Audiotool.com
André Michelle ist offline   Mit Zitat antworten
Alt 02-11-2004, 11:16   #6 (permalink)
flachzange
 
Benutzerbild von elias
 
Registriert seit: Jun 2003
Ort: berlin
Beiträge: 3.932
Zitat:
Zitat von André Michelle
Wofür braucht du das typeof ?
bei manchen spieldesigns hab ich gesehen das die mc's direkt in die map
gesteckt werden. wenn man das zb bei tetris machen würde könnte man
so komplette reihen einfach finden.
ich lasse mich da aber gerne über sinn und unsinn belehren.

ich habe jetzt einige änderungen vorgenommen:
ArrayUtil heißt jetzt ArrayGenerator und ist durch erhöhung der abhängigkeiten
ca um die hälfte geschrumpft und viel übersichtlicher. das geht wohl zur last
der performance, aber maps generiert man ja nicht jedes frame.

der Array2d klasse habe ich die searchValueInCol/searchValueInRow methoden
geschenkt. denke das ist ganz nützlich.

alles im anhang..
Angehängte Dateien
Dateityp: zip array2d.zip (2,4 KB, 31x aufgerufen)
__________________
elias ist offline   Mit Zitat antworten
Alt 02-11-2004, 12:42   #7 (permalink)
[+]
 
Benutzerbild von André Michelle
 
Registriert seit: Dec 2002
Ort: cologne
Beiträge: 2.271
Zitat:
bei manchen spieldesigns hab ich gesehen das die mc's direkt in die map gesteckt werden. wenn man das zb bei tetris machen würde könnte man
so komplette reihen einfach finden.
Ich versuche auch in Arrays typensicher zu arbeiten, ausserdem finde ich es wichtig Logik und Grafik strikt voneinander zu trennen.

Zum Tetris hätte ich noch eine Idee. Von wegen lineares Array (1D).
Schon überlegt mit Bytes zu arbeiten ?

Eine Zeile hat die Bits:
1 2 4 8 16 32 64 128 256 512

Wenn eine Reihe gefüllt ist, dann ist der Wert 1023. Schön einfach :o)

Kollisionsabfrage wäre auch simple mit dem & Operator.

Ich frage mich nur, ob es möglich ist, ein Block per Bitoperatoren zu drehen.
Möglich wird es sein, aber vielleicht gibt es eine besonders kurze und raffinierte Methode.
__________________
aM

blog | laboratory | tonfall | processing

Audiotool.com
André Michelle ist offline   Mit Zitat antworten
Alt 02-11-2004, 13:14   #8 (permalink)
[+]
 
Benutzerbild von André Michelle
 
Registriert seit: Dec 2002
Ort: cologne
Beiträge: 2.271
Das hat mich nicht losgelassen :o)

Code:
//-- T - Block ( 3x3 Matrix )

a = 1 + 2 + 4 + 0 + 16 + 0 + 0 + 128 + 0;


//-- Rotate Matrix
r = ( ( a & 0x001 ) << 2 ) + ( ( a & 0x002 ) << 4 ) + ( ( a & 0x004 ) << 6 )
   +( ( a & 0x008 ) >> 2 ) + ( ( a & 0x010 )      ) + ( ( a & 0x020 ) << 2 )
   +( ( a & 0x040 ) >> 6 ) + ( ( a & 0x080 ) >> 4 ) + ( ( a & 0x100 ) >> 2 )
   
   
printMatrix = function( byte: Number, mLen: Number )
{
	for( var y = 0 ; y < mLen ; y++ )
	{
		var row: String = new String( "" );
		
		for( var x = 0 ; x < mLen ; x++ )
		{
			row += ( byte & ( 1 << x ) << ( y * mLen ) ) ? "*" : " ";
		}
		
		trace( row );
	}
}


trace( "original:" );

printMatrix( a , 3 );

trace( "rotate:" );

printMatrix( r , 3 );
Ist doch klasse. Lust ein Tetris aus Bitoperatoren zu bauen ? Ist wahrscheinlich ganz dicht am Original. Der arme Kerl damals :o)
__________________
aM

blog | laboratory | tonfall | processing

Audiotool.com
André Michelle ist offline   Mit Zitat antworten
Alt 02-11-2004, 14:15   #9 (permalink)
flachzange
 
Benutzerbild von elias
 
Registriert seit: Jun 2003
Ort: berlin
Beiträge: 3.932
cool!
wäre schon ne gute herausforderung. allerdings für mich etwas mehr
weil bit schubsereien für mich nicht so alltäglich sind.

edit:
*grummel* zu magiemathisch. schaffs nichtmal ne 4x4 matrix auszugeben.
__________________

Geändert von elias (02-11-2004 um 14:50 Uhr)
elias ist offline   Mit Zitat antworten
Alt 02-11-2004, 18:05   #10 (permalink)
Flashaholic
 
Benutzerbild von atothek
 
Registriert seit: Feb 2003
Ort: Berlin
Beiträge: 1.459
OFFTOPIC
@andre du hast echt ein an der waffel .
schönes teil um zu verzweifeln bei bitverschiebungen. aber respekt

mfg
alex
__________________
TVNEXT Solutions
atothek ist offline   Mit Zitat antworten
Alt 02-11-2004, 23:17   #11 (permalink)
[+]
 
Benutzerbild von André Michelle
 
Registriert seit: Dec 2002
Ort: cologne
Beiträge: 2.271
Danke für die Blumen :o)

hier eine dynamische Lösung für eine n x n Matrix:
Code:
//-- Full Block

a = 1 + 2 + 4 + 8 + 16 + 32 + 64 + 128 + 256 + 512 + 1024 + 2048 + 4096 + 8192 + 16384 + 32768;

rotateMatrix = function( byte: Number, mLen: Number )
{
	var r: Number = 0;
	
	var l: Number = mLen * mLen;
	
	var mLenP = mLen + 1;
	var mLenM = mLen - 1;
	
	var pow: Function = Math.pow;
	
	while( --l > -1 )
	{
		var shift: Number = mLen * 2 - int( l / mLen ) * mLenP + ( l % mLen * mLenM - mLenP );
		
		if( shift > 0 )
		{
			
			r += ( byte & pow( 2 , l ) ) << shift;
		}
		else
		{
			r += ( byte & pow( 2 , l ) ) >> -shift;
		}
	}
	
	return r;
}

printMatrix = function( byte: Number, mLen: Number )
{
	for( var y = 0 ; y < mLen ; y++ )
	{
		var row: String = new String( "" );
		
		for( var x = 0 ; x < mLen ; x++ )
		{
			row += ( byte & ( 1 << x ) << ( y * mLen ) ) ? "*" : " ";
		}
		
		trace( row );
	}
}

r = rotateMatrix( a , 4 );
printMatrix( a , 4 );
printMatrix( r , 4 );
Ich habe noch nicht alle Fälle ausprobiert, aber es scheint zu funktionieren.
__________________
aM

blog | laboratory | tonfall | processing

Audiotool.com
André Michelle ist offline   Mit Zitat antworten
Alt 03-11-2004, 08:30   #12 (permalink)
[+]
 
Benutzerbild von André Michelle
 
Registriert seit: Dec 2002
Ort: cologne
Beiträge: 2.271
Noch etwas schöner:)

Code:
rotateMatrix = function( byte: Number, mLen: Number )
{
	var l: Number = mLen * mLen;
	
	var mLenP = mLen + 1;
	var mLenM = mLen - 1;
	
	var r: Number = 0;
	
	while( --l > -1 )
	{
		var shift: Number = mLen * 2 - int( l / mLen ) * mLenP + ( l % mLen * mLenM - mLenP );
		
		if( shift > 0 )
		{
			
			r += ( ( 1 << l ) & byte ) << shift;
		}
		else
		{
			r += ( ( 1 << l ) & byte ) >> -shift;
		}
	}
	
	return r;
}
__________________
aM

blog | laboratory | tonfall | processing

Audiotool.com
André Michelle ist offline   Mit Zitat antworten
Alt 03-11-2004, 10:00   #13 (permalink)
[+]
 
Benutzerbild von André Michelle
 
Registriert seit: Dec 2002
Ort: cologne
Beiträge: 2.271
Und letztendlich die Klasse mit Rechts- und Linksdrehung und beliebiger Ausdehnung.

Geht aber leider nur bis zu 6x6 grossen Feldern, da sonst die Integergrenze in Flash erreicht ist.

Code:
import org.gamepackage.util.*;

a = 1 + 2 + 0 + 0 + 16 + 0 + 0 + 0 + 256 + 0 + 1024 + 2048 + 4096 + 8192 + 16384 + 32768;

var matrix: BitMatrix = new BitMatrix( a , 4 );

trace( "ORG:" );
trace( matrix );

matrix.rotateCCW();

trace( "CCW:" );
trace( matrix );

matrix.rotateCW();

trace( "CW:" );
trace( matrix );

Code:
class org.gamepackage.util.BitMatrix
{
	private var dim: Number;
	private var byte: Number;
	
	private var dimP: Number;
	private var dimM: Number;
	private var dim2: Number;
	private var len: Number;
	
	function BitMatrix( byte: Number, dim: Number )
	{
		this.byte = byte;
		this.dim = dim;
		
		precompute();
	}
	
	private function precompute( Void ): Void
	{
		dimP = dim + 1;
		dimM = dim - 1;
		dim2 = dim * 2;
		
		len = dim * dim;
	}
	
	function rotateCW( Void ): Void
	{
		var shift: Number;
		
		var l: Number = len;
		var b: Number = 0;
		
		while( --l > -1 )
		{
			if( ( shift = dim2 - int( l / dim ) * dimP + ( l % dim * dimM - dimP ) ) > 0 )
			{
				b += ( ( 1 << l ) & byte ) <<  shift;
			}
			else
			{
				b += ( ( 1 << l ) & byte ) >> -shift;
			}
		}
		
		byte = b;
	}
	
	function rotateCCW( Void ): Void
	{
		var shift: Number;
		
		var l: Number = len;
		var b: Number = 0;
		
		while( --l > -1 )
		{
			if( ( shift = -( l % dim ) * dimP + dim * dimM - int( l / dim ) * dimM ) > 0 )
			{
				b += ( ( 1 << l ) & byte ) <<  shift;
			}
			else
			{
				b += ( ( 1 << l ) & byte ) >> -shift;
			}
		}
		
		byte = b;
	}
	
	function setByte( byte: Number ): Void
	{
		this.byte = byte;
	}
	
	function getByte( Void ): Number
	{
		return byte;
	}
	
	function toString( Void ): String
	{
		var o: String = new String( "" );
		
		for( var y = 0 ; y < dim ; y++ )
		{
			var row: String = new String( "" );
			
			for( var x = 0 ; x < dim ; x++ )
			{
				row += ( byte & ( 1 << x ) << ( y * dim ) ) ? "*" : " ";
			}
			
			o += row;
			
			if( y < dimM ) o += newline;
		}
		
		return o;
	}
}
__________________
aM

blog | laboratory | tonfall | processing

Audiotool.com

Geändert von André Michelle (03-11-2004 um 10:05 Uhr)
André Michelle ist offline   Mit Zitat antworten
Alt 03-11-2004, 10:58   #14 (permalink)
flachzange
 
Benutzerbild von elias
 
Registriert seit: Jun 2003
Ort: berlin
Beiträge: 3.932
mit der integer begrenzung kann man ja leider keine komplette map umsetzen,
zumindest nicht ohne eselsbrücken. aber das wird mir eh alles zu komplifiziert

mal ne grundlegende tetris frage:
benutzt du für die kleinen formen wie T,Z,S etc 3x3 maps und nur für das I
eine 4x4 map oder benutzt du für alles 4x4?
weil bei 4x4 maps ist die rotation (mit der Array2d klasse) der formen nicht
mehr korrekt.

baue nämlich ne methode mit der man maps mit presets versehen kann,
dh ich hab ein array mit vier werten:

var T = [4,5,6,9]; //T form

die 4x4 map sehe ich mit dem obigen preset als lineares array an und setze
so mit den presets die form in die matrix. so hab ich nur arrays mit 4 indizes,
das spart etwas platz. und normalsterbliche können es auch noch benutzen
__________________
elias ist offline   Mit Zitat antworten
Alt 03-11-2004, 12:19   #15 (permalink)
[+]
 
Benutzerbild von André Michelle
 
Registriert seit: Dec 2002
Ort: cologne
Beiträge: 2.271
Noch gibt es ja kein Tetris, aber ich würde verschiedene Größen nehmen (3x3,4x4). Das geht dann mit der Bitmatrix wunderbar. Aber du hast recht, dass es nicht wirklich notwendig ist, es so zu lösen. Trotzdem hat mir das geholfen, besser zu verstehen, wie man mit Bits rechnet.
__________________
aM

blog | laboratory | tonfall | processing

Audiotool.com
André Michelle ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 18:11 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele