Ich werde Vater...

Auch Agenten können nicht davon ausgehen, ewig zu leben, und möchten sich natürlich auch möglichst oft fortpflanzen.

Wir erweitern unser Beispiel dahingehend, dass unser Agent nach der Nahrungsaufnahme (dann ist er am stärksten) ein Kind zur Welt bringt, und erst danach seinen Mittagsschlaf hält.
/**
 * lässt den agenten solange geradeaus laufen, bis er auf nahrung stösst
 * diese wird dann gegessen
 * nach der nahrungsaufnahme wird ein kind zur welt gebracht
 * danach wird nur noch geschlafen
 * falls er unterwegs auf eine mauer stösst, fängt er auch an zu schlafen
 * ebenso, wenn er auf das ende der welt trifft
 */
public Aktion makeItSo(Feld[][] felder, double energie) {
        Aktion aktion;
	Vektor vektor;			// vektor, der nach oben zeigt, einen agenten also nach oben laufen lässt
	vektor = new Vektor();
	vektor.x = 0;			// 0 bewegung in x richtung
	vektor.y = -1;			// einen schritt nach oben

        Feld position = felder[1][1];	// feld, auf dem agent steht
        Feld feldVor = felder[1][0];	// feld, vor dem agent steht, bezogen auf laufrichtung (nach oben)

	boolean gegessen = false;	// hat agent bereits gegessen?
	boolean geboren = false;	// hat agent bereits geboren? gebärt?
	boolean vorWand = false;	// steht agent vor wand?
	boolean vorEnde = false;	// steht agent vor dem Ende (der Welt)?
	
	// auf welcher art von feld steht agent?
	if (position instanceof FeldMitNahrung) {	// nahrungsfeld :-)
		aktion = new Essen(1);			// alles essen, was vorhanden ist
		gegessen = true;			// agent hat gegessen
	} else if (feldVor instanceof Wand) {		// agent steht vor Wand
		aktion = new Schlafen();		// mit schicksal abfinden, schlafen
	} else if (feldVor == null) {			// agent steht vor ende des levels
		aktion = new Schlafen();		// mit schicksal abfinden, schlafen
	} else if (!gegessen) {				// agent hat noch nichts gegessen, also weiterlaufen
	        aktion = new Laufen(vec);
	} else if (gegessen & !geboren) {		// agent hat gegessen, aber noch kein kind
		vektor.x = -1;				// kind wird links neben agenten gesetzt
		vektor.y = 0;
		Teilen teilen = new Teilen();
		// das kind bekommt die hälfte der energie des agenten, dh direkt nach geburt sind vater und kind gleichstark, vater verliert die hälfte seiner energie
		Geburt geburt = new Geburt(energie / 2, vektor);
		teilen.addKind(geburt);
		aktion = teilen;
	} else {					// agent hat gegessen und ein kind, also mittagsschlaf
		aktion = new Schlafen();
	}
        return aktion;
}
	

Damit haben wir einen Agenten, der bereits alle zur Verfügung stehenden Aktionen beherrscht.