Simulation einer KI in Flash

Thema:
Simulation einer KI in Flash
Description:
Ein Tier soll sich selbst in einer gegebenen Umgebung bewegen.
Keywords:
Flash, KI, Intelligenz, Roboter, Simulation
Author:
Joa Ebert
Date:
30.12.2001
Doc-ID:
51-005
URL:
http://www.flashworker.de/tutorial/51/005.html
Version:
1.0
Änderungen:
keine
Anforderungen:
Flash 5
Vorkenntnisse:
Flash Grundkentnisse
Gesunder Menschenverstand
Download:
PC: "flash_ki.zip", 25 kB

Inhalt
  Vorwort
  Vorbereitungen treffen...
  Variablen und eine Funktion zur Bewegung
  Die KI
  Feinschliff



Feinschliff

Als letztes widmen wir uns einer Kollisions-Abfrage. Hierführ brauchen wir zwei Dinge. Und zwar erstens eine Kollisions-Abfrage die guckt ob unser Tier gegen etwas gegenläuft und zweitens einen Alghorythmus der unser Tier rückwärts laufen lässt. Zuerst kümmern wir uns um das Rückwertslaufen. Dazu benutzen wir wieder eine If-Anweisung. Wenn das Tier gegen etwas gegengelaufen ist läuft es nicht mehr normal weiter, sondern Rückwärts. Also schreiben wir vor ran = random(5); das hier: if (collision != 1) {
Wenn collision nichts 1 ist beweget sich unser Tier normal weiter. Aber was wenn nicht? Jetzt kommt unter alles einfach dies hier drunter:

} else { 
  for (i=1; i<=5; i++) { 
    current_x = getProperty("/tier", _x); 
    current_y = getProperty("/tier", _y);
    new_x = speed*-1*Math.cos(Math.PI/180*current_r); 
    new_y = speed*-1*Math.sin(Math.PI/180*current_r); 
    setProperty ("/tier", _x, current_x+new_x); 
    setProperty ("/tier", _y, current_y+new_y); 
    updateAfterEvent; 
  } 
  collision = 0;
} 

Fünf mal (s. for-Anweisung) bewegt sich unser Tier nun rückwärts. Nämlich so viele X- und Y-Koordinaten wie es sich normalerweise nach vorne bewegen würde. Deswegen multiplizieren wir speed diesmal einfach mit -1. Die Funktion bewegen() können wir hierfür nicht nehmen, denn dann würde speed nicht mit -1 multipliziert werden. updateAfterEvent sorgt dafür, dass das Tier an der Position angezeigt wird, die wir berechnet haben. Zum Schluss noch collision auf 0 setzten und fertig. Unser Tier bewegt sich rückwärts, sobald collision auf 1 steht. Und dazu kommen wir jetzt. Wann soll collision auf 1 stehen?
Dazu benötigen wir drei neue Variablen. Diese habe ich einfach zwischen if(speed == null..... geschrieben. Undzwar width, die Breite unseres Films (bei mir wär width = 600), height, die Höhe unseres Films (bei mir wieder 600) und dann noch lookfwd. Hiermit geben wir dem Tier einen gewissen vorausschauenden "Verstand". Denn niemand würde erst vor eine Wand laufen und sich dann umdrehen und weiter gehen.
Ich habe lookfwd auf 10 gesetzt. Schon können wir zur eigentlichen Funktion schreiten.

tx = getProperty("/tier", _x);
ty = getProperty("/tier", _y); 
if (tx+lookfwd>=width || tx-lookfwd<=0 || ty+lookfwd>=height || ty-lookfwd<=0)    { 
  collision = 1;
} else { 
  collision = 0; 
} 

tx und ty halten die x- bzw. y-Position des Tieres fest. tx und ty dürfen auf keinen Fall zwischen if(speed == null... denn dann würden beide Variablen nur ein einziges mal definiert, aber sie müssen immer wieder aktualisiert werden. Da das Tier 10 Koordinaten vorrausschaut läuft es nie direkt gegen eine Wand. Das ganze kann man auch mit einer sog. Collision-Map machen. Aber die werde ich in einem Weiteren Tutorial zur Simulation einer KI erläutern, in dem dann auch Befehle u. Ä. behandelt werden. Um Feedback wird gebeten...!


Hier sieht man nun das Ergebnis dieses Tutorials:






Zurück