Extend en klasse - del 2: Returner en tilfældig

Kategori: Tips og tricks | Kommentarer (2)
Gemt: 2008-02-14 17:38


Med basen på plads er det nu tid til at lave den egentlige funktionalitet, nemlig en funktion som kan returnere et tilfældigt element fra vores SuperArray.

For at kunne få returneret et tilfældigt element, så skal vi have lidt hjælp af Math.random() funktionen.
Det er en funktion som returnerer et tilfældigt tal fra 0 til 1, og hvis vi kombinerer det med at vi ved hjælp af length kender antallet af elementer i vores SuperArray, så er det såre simpelt at vælge et tilfældigt:

Og det skal vi så have bygget ind i en funktion som på baggrund af tallet returnerer et element:


public function random():* {
	var _random:Number = Math.floor(Math.random() * this.length);
	var _obj:* = this[_random];
	return _obj;
}

Og koden som man så ville bruge i Flash, eller et andet sted, for at bruge den nye funktion i vores SuperArray kunne se sådan her ud:


import SuperArray;
var Super_arr:SuperArray = new SuperArray("kat","hest","hund");
trace(Super_arr.random()); //Viser tilfældigt kat, hest eller hund

Ingen gentagelser
Men men men, hvad nu hvis der er tale om unikke værdier og at hver værdi kun måtte eksistere én gang?

Tag for eksempel et spil kort, her skal man helst ikke kunne få returneret “Spar es” hver gang man kalder funktionen, da der kun må være en “Spar es” i spil ad gangen.
Men, det er jo ikke trods alt ikke altid at værdierne er unikke, så lad os udvide funktionen med en valgfri variabel kaldet _delete:


public function random(_delete:Boolean = false):* {
	var _random:Number = Math.floor(Math.random() * this.length);
	var _obj:*;
	if(_delete) { //hvis true fjernes elementet
		_obj = this.splice(_random, 1);
	} else { //Ellers returneres det bare
		_obj = this[_random];
	}
	return _obj;
}

Og nu kan vi så bruge klassen på følgende måde, hvor hvert dyrt kun vil blive returneret én gang:


import SuperArray;
var Super_arr:SuperArray = new SuperArray("kat","hest","hund");
trace(Super_arr.random(true));
trace(Super_arr.random(true));
trace(Super_arr.random(true));

Samlet klasse
Så, nu ser den komplette SuperArray klasse sådan her ud:


package {
	dynamic public class SuperArray extends Array {

		public function SuperArray(... optionalArgs) {
			for each (var value:* in optionalArgs){
				this.push(value);
			}
			//trace(length);
		}

		public function random(_delete:Boolean = false):* {
			var _random:Number = Math.floor(Math.random() * this.length);
			var _obj:*;
			if(_delete) { //hvis true fjernes elementet
				_obj = this.splice(_random, 1);
			} else { //Ellers returneres det bare
				_obj = this[_random];
			}
			return _obj;
		}
	}
}

I næste artikel bygger vi endnu en smule på, nemlig en funktion som også er kritisk for et spil kort.

Har du i øvrigt en ide til en funktion som du også mener vores SuperArray bør indeholde, så smid endelig en kommentar.

Update: Arg, dammit, så fik jeg trykket udgiv allerede nu så i fik to indlæg i dag, men well, så garanterer jeg ikke for at der også kommer et i morgen ;-)