Mauern und andere Fallen

2 Fragen bleiben bisher aber noch unberücksichtigt, und zwar:

Beide Fälle wird der Agent nicht erkennen, und auch nicht drauf reagieren. Bei einer Mauer wird er auch weiterhin geradeaus laufen wollen (es sei denn, die Nahrung liegt vor der Mauer). Die Spielwelt erkennt aber, das dies nicht möglich ist, und wird ihn nicht weiterlaufen lassen. Unser Agent wird also solange versuchen, mit dem Kopf durch die Wand zu rennen, bis ihm die Puste ausgeht, er also verhungert. Da die Welt bekanntlich nur eine Scheibe ist, sollte man auch aufpassen, dass man von dieser nicht herunterfällt. Genau dies wird unser Agent tun, falls auf seinem Weg keine Nahrung vorhanden ist. Er erkennt das Ende der Welt nicht, und fällt einfach in ein schwarzes Loch namens null :-).

Wir erweitern unser Beispiel:
/**
 * lässt den agenten solange geradeaus laufen, bis er auf nahrung stösst
 * diese wird dann gegessen
 * 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 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 {					// agent hat gegessen, also mittagsschlaf
		aktion = new Schlafen();
	}
        return aktion;
}
	

Damit ist gewährleistet, dass unser Agent keinen unfreiwilligen Selbstmord mehr begeht, und nicht mit dem Kopf durch die Wand möchte.

Zum Schluss fehlt uns noch die wichtigste Aktion für einen Agenten, und zwar die Fortpflanzung.