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-004
URL:
http://www.flashworker.de/tutorial/51/004.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



Die KI

In Schritt Nummer 3 haben wir eine Funktion geschrieben die es uns ermöglicht unser Tier zu bewegen. Und das wollen wir jetzt auch entlich ansteuern. Zuerst brauchen wir irgendeine Zahl. Diese gibt dann wieder ob sich unsern Tierchen überhaupt bewegen will. Dazu geben wir im Aktions-Fenster das hier ein: ran = random(5); So. Jetzt haben wir irgendeine Zahl deren maximaler Wert 5 ist. Mit der Zahl können wir einiges anfangen. Wenn unser Tier grad Lust hat latscht es irgendwo hin. Dazu schreiben wir den folgenden Text ins Aktions-Fenster:

if (ran >= 2) {
   
} 

Mit einer großen Wahrscheinlichkeit rennt unser Tier jetzt rum. Doch wie soll es rennen? In welche Richtung? Zwischen die geschweiften Klammern beim if-Tag kommt jetzt dieser Code:

ran2 = random(5);
if (sametimer == 10) {
  sametimer  = 0; 
  ran2 = 1;
}    

if (ran2>3 || sametimer>0) { sametimer++; bewegen(lastr); } if (ran2 == 2) { ran2 = random(7); if(ran2>=6) { rind = 15; } if(ran2 == 5) { rind = -15; } if(ran2 == 4) { rind = 10; } if (ran2 == 3) { rind = -10;
} if (ran2 == 2) { rind = 20; } if (ran2<=1) { rind = -20; } }
if (ran2<=1) { ran2 = random(3); if (lastr<0) { zind = -1; } else {
zind = 1; } if (ran2 == 3) { rind = 10*zind; } if (ran2 == 2) { rind = 20*zind; } if (ran2<=1) { rind = 20*zind; } } if (sametimer == 0) { lastr = current_r+rind; bewegen(lastr); }

Zuerst lassen wir uns eine Zahl errechnen deren maximaler Wert 5 sein soll.
Dann gucken wir ob sametimer auf 10 steht. Wenn dies der Fall ist wird sametimer auf 0 zurückgestellt und ran2 bekommt den Wert 1.
Nun gucken wir ob ran2 größer als 3 oder sametimer größer als 0 ist. Sobald dies zutrifft wird sametimer um 1 erhöt und unser Tier
wird mit in die selbe Richtung bewegt wie letztes mal. Wenn ran2 genau 2 entspricht so wird zuerst eine neue Zahl berrechnet. Deren maximaler Wert soll 7 sein. Nun beginnt eine Art einschachtelung.
Egal wie der Wert von ran2 ist, der Variable rind wird ein Wert zugewiesen. Jetzt gucken wir noch ob ran2 kleiner oder gleich 1 ist. Sollte dies der Fall sein wird wieder eine Zahl, deren Maximalwert 3 ist, errechnet. Wenn der Wert des letzten Winkels kleiner als 0 ist so wird zind auf -1 gestellt, andernfalls auf 1. Nun weisen wir rind einen Wert zu. Das sieht genauso aus wie ein paar zeilen höher und es ist eigentlich auch das selbe. Und wenn sametimer jetzt noch 0 ist wird lastr mit dem Winkel definiert den wir jetzt gerade benutzen und schließlich alles bewegt. Man sollte darauf achten das wir hier drei Fälle haben.

1.) Unser Tier soll zehn mal in die selbe Richtung laufen (hierfür ist der sametimer verantwortlich).
2.) Das Tier läuft in irgend eine Richtung. D.h. zu dem derzeitigen Winkel (current_r) wird ein Wert zwischen 20 und -20 addiert.
3:) Es bewegt sich zwar nicht genau gleich aber in die selbe Richtung. Bzw. wenn es sich vorher nach Links bewegt hat, beweget es sich jetzt auch nach links.

Jetzt fragt man sich natürlich "Wieso habe ich nicht einfach bewegen(random(360)) benutzt? Das hätte doch viel weniger Aufwand gemacht." Die Antwort ist ganz leicht. Wir diesen Aufwand nur gemacht, damit sich das Tier auch vom Fleck bewegt. Denn sonst geht es aufeinmal in diese Richtung und dann weider in die andere usw. Außerdem soll es ja wenigstens ein bisschen intelligent werden. Wenn man das ganze jetzt in Flash exportiert bewegt sich unser Tier auch schon eigentlich recht toll. Manchmal macht es zwar noch rukartige Bewegungen, doch diese sind nur noch sehr gering, dank vielen Variationen die den Bewegungsradius einschränken.





Zurück     Weiter