KI - Allgemeine Fragen
Übersicht

![]() |
Black SpiderBetreff: KI - Allgemeine Fragen |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also, ich wollte für mein Ego-Shooter ziemlich viele weniger Schlaue KI´s proggen (Kanonenfutter) und eine sehr schlaue.
Sie soll, wenn sie zu weit weg ist, auf einen zu Springen, wenn sie nahe genug dran ist Feuern, und sich danach wegteleportieren. Funktioniert einigermaßen gut, doch sie Feuert ununterbrochen wenn sie in meiner Nähe ist. Eigentlich sollte sie nur in bestimmten abständen einige Schüsse abfeuern, die mir dann Schaden machen, doch auch das funktioniert nicht. Sie taucht auf, feuert wenn ich in ihrer Nähe bin und springt dann irgendwohin, und wartet bis ich komme... Das Problem ist das ununterbrochene Schiessen, und dass die Schüsse keinen Schaden machen... Hat da einer ne Idee ? Code: Code: [AUSKLAPPEN] Function Update_SpiderKI(sp.spiderKI) TranslateEntity sp\obj,0,-.5,0 sp\time = sp\time + 1 EntityAlpha sp\obj,sp\alpha/100 TurnEntity sp\obj,0,DeltaYaw(sp\obj,sp\target),0 If EntityDistance(sp\obj,camera)>100 Then MoveEntity sp\obj,0,.5,1 If EntityDistance(sp\obj,camera)<50 And EntityVisible(sp\obj,camera) Then sp\att = 1 - sp\att If sp\att = 1 Then sp\weapon_laser = New laser sp\weapon_laser\spr = CreateSphere(2,sp\obj) FlipMesh sp\weapon_laser\spr ScaleEntity sp\weapon_laser\spr,.1,.1,1 EntityType sp\weapon_laser\spr,k_M EntityRadius sp\weapon_laser\spr,.3,.3 EntityColor sp\weapon_laser\spr,255,0,0 sp\weapon_laser\target = sp\target PointEntity sp\weapon_laser\spr,sp\weapon_laser\target sp\weapon_laser\rot = 1 sp\weapon_laser\time = 100 End If End If If EntityCollided(sp\obj,k_M) Then sp\hp = sp\hp-1 EntityColor sp\obj,255,0,0 Else EntityColor sp\obj,255,255,255 End If ;--- Teleportieren --- If sp\time >= 500 Then sp\time = 0:sp\port=1 If sp\port = 1 Then sp\alpha = sp\alpha-1 EntityAlpha sp\obj,sp\alpha/100 TurnEntity sp\obj,0,DeltaYaw(sp\obj,sp\port_target),0 MoveEntity sp\obj,0,1,0 If sp\alpha = 0 Then PositionEntity sp\obj,EntityX(sp\port_target),EntityY(sp\port_target)+1,EntityZ(sp\port_target) sp\port=0 i=Rnd(33) sp\port_target = haus(i) sp\alpha = 100 End If End If End Function Die Funktion für den Laser: Code: [AUSKLAPPEN] Function laserupdate(l.laser) MoveEntity l\spr,0,0,.1 l\time = l\time - 1 If EntityCollided(l\spr,k_Cam) Then DoHP(-1) If CountCollisions(l\spr)>1 Or l\time<0 Then FreeEntity l\spr Delete l End If End Function |
||
Coming soon:
http://img132.imageshack.us/im...im2ab6.gif |
![]() |
Christoph |
![]() Antworten mit Zitat ![]() |
---|---|---|
Lege VOR DER HAUPTSCHLEIFE eine Variable für Zeit an: (für jede KI eins)
Code: [AUSKLAPPEN] ki\zeit=millisecs()
IN DER HAUPTSCHLEIFE machst du das: Code: [AUSKLAPPEN] if millisecs()-ki\zeit>? and rand(0,?)=0 then
ki\zeit=millisecs() ;Schießen endif Für ? muss du halt ausprobieren was am besten ist (Regel:Umso dümmer der Gegner desto größer ist ?). Code: [AUSKLAPPEN] WENN die Zeit > ? ist UND eine Zufallszahl zwischen 0 und ? gleich null ist DANN Zeit AKTUALISIEREN Schießen ENDEWENN Für dumme Gegner empfehle ich dir eine schlechte Zielsicherheit. Vielleicht hilft dir das zum Thema: Zum Thema KI (Robsite) |
||
![]() |
Black Spider |
![]() Antworten mit Zitat ![]() |
---|---|---|
hey, cool, das ist geil ![]() und wie mache ich meine Gegner Zielunsicherer? Verändere ich einfach ein klein wenig (per Zufallszahlen) den Flug ihrer Geschosse, oder gibt´s noch ne andere Möglichkeit? |
||
Coming soon:
http://img132.imageshack.us/im...im2ab6.gif |
![]() |
Christoph |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mit rnd() kannst du Zielungenauigkeiten machen.
Wenn du das Ziel ausgerechnet hast machst du halt so was: Code: [AUSKLAPPEN] Zielx=Zielx+rnd(-?,?)
Zielz=Zielz+rnd(-?,?) ;Vielleicht auch noch bei y (Ziely=Ziely+rnd(-?,?)) Mit ? musst du halt rumprobieren. Schlaue Gegner bekommen ein kleines ? (wenig Zielungenauigkeit), >>dumme<< Gegner ein großes ?. Umso näher die rnd(-?,?) Zahl an 0 liegt desto besser trifft der Gegner. Das Gute daran ist, dass auch die dümmsten Gegner (mit großem ?) mal in die Nähe von 0 kommen und treffen. ![]() Zitat: ...Verändere ich einfach ein klein wenig (per Zufallszahlen) den Flug ihrer Geschosse,...
Nee, die dummen Gegner haben (davon gehe ich aus) die gleichen Waffen, sie können halt nich so gut zielen. Wenn du per Zufallszahlen den Flug simulieren willst, dann >>eiert<< das Geschoss so dahin. Ich würde einfach ungenau zielen und dafür gerade schießen und nicht genau zielen und den Schoss eiern ![]() |
||
![]() |
Seoman |
![]() Antworten mit Zitat ![]() |
---|---|---|
Christoph hat Folgendes geschrieben: Nee, die dummen Gegner haben (davon gehe ich aus) die gleichen Waffen, sie können halt nich so gut zielen. Wenn du per Zufallszahlen den Flug simulieren willst, dann >>eiert<< das Geschoss so dahin. Ich würde einfach ungenau zielen und dafür gerade schießen und nicht genau zielen und den Schoss eiern ![]() Nun ist die Frage, ob BlackSpieder wirklich während des Fluges die Bahn verändern wollte, oder vorher, so wie du... Denn wenn er mit rnd die FlugBahn durch Veränderung des Zielpunktes verändert, dann hat er genau gesagt, was du getan hast ![]() EDIT: Eine andere Möglichkeit wäre natürlich noch, dass man als Möglichkeiten erstmal nur "trifft" und "trifft nicht" definiert und das per rnd regelt. Der Unterschied wäre, dass "dumme" Gegner nur öfters verfehlen aber nicht unbedingt stärker. Da kommt es dann darauf an, was dir besser gefällt. |
||
In Australien...
Projekte sind zur Zeit wieder eingefroren und auf Designlevel zurueckgestuft... Generalueberholungen notwendig ![]() |
![]() |
Christoph |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Black Spider
Du musst den Gegnern KI einflößen, d.h. denke darüber nach. Wann ist ein Schuss höchstwahrscheinlich ungenau? ->Wenn der Gegner sprintet und versucht zu zielen ->Wenn die Distanz extrem hoch ist So musst du das Schritt für Schritt machen, irgendwann verhalten sich deine KI (fast) wie richtige Menschen. Baue möglichst viele Details in die Berechnung der Gegner ein aber lass es für den Spieler nicht zu einfach werden!!! Noch eine interessante Idee: ->Wind lenkt Flugbahnen etwas um (d.h. der Schoss wird aber etwas nach links/rechts(Seitenwind) verschoben, abgebremst(Gegenwind) oder beschleunigt(Rückenwind)). |
||
![]() |
Black Spider |
![]() Antworten mit Zitat ![]() |
---|---|---|
klar, richtig,
doch nicht alle KI´s sollen einigermaßen Menschlich handeln, da es nicht unbedingt Menschen sind. Eine der KI´s, Teleportiert sich zu einem Punkt, ohne das du es merkst, und fängt an zu feuern. Wenn du sie bemerkst und auf sie feuerst, feuert sie erst zurück, und Teleportiert sich dann wieder woanders hin. Wenn du zu weit weg bist, kommt sie näher, wenn du ausser sichtweite bist, wird sie unsichtbar, und wenn sie schon angeschlagen ist, Teleportiert sie sich öfters, um die Gefahr eines Treffers zu verhindern. Eine andere KI soll (sie gibt es nämlich nocht nicht) sich solange verstecken, bis du in reichweite bist, und dann erst angreifen; allerdings ohne rücksicht auf Verlust, denn sie ist eine MassenKI, nur ein Teil von was größerem. Je weniger von ihnen es allerdings gibt, desto mehr Selbstwertgefühl hat die einzelne KI (d.h. wenn es 100 von ihnen gibt, stürzen sie sich auf dich, egal ob sie dabei sterben, wenn es allerdings nur 3 gibt, verstecken sie sich, und feuern weniger aggressiv, und springen in deckung)... In dem Spiel wird es 3 (oder 4) Sorten von KI´s geben. 2 Sind schon fertig, und das: Zitat: Wann ist ein Schuss höchstwahrscheinlich ungenau?
->Wenn der Gegner sprintet und versucht zu zielen ->Wenn die Distanz extrem hoch ist kannste wie schon gesagt machen, wenn du den Winkel der Kugeln etwas veränderst. Am Anfang ist´s so: < doch wenn du den gang der Kugeln jetzt mal weiterführst, werden sie immer ungenauer, und beim rennen, könnte man den Winkel einfach größer einstellen, denn dann werden sie noch ungenauer... @all: Danke! |
||
Coming soon:
http://img132.imageshack.us/im...im2ab6.gif |
![]() |
ChristophBetreff: KI zu proggen ist spitze!!! |
![]() Antworten mit Zitat ![]() |
---|---|---|
Großes Lob!!!
So wie du nachdenkst, kann das was richtig Tolles werden!!! ![]() Du musst immer denken "Was würde JETZT IN DIESER SITUATION ein Mensch machen, der diesen Gegner steuern könnte?". Dann musst du versuchen es in die BBSprache zu übersetzten. ->Wenn er verletzt ist soll er vorsichtiger sein und sich mehr teleportieren ====================================================== Code: [AUSKLAPPEN] if Energie<50 then
;hohe Wahrscheinlichkeit für Teleportieren ;Deckung suchen ;... endif ->Wenn viele in der Nähe sind sollen sie wagemutiger sein ====================================================== Code: [AUSKLAPPEN] for i=0 to Gegneranzahl
if entitydistance(Selectedgegner, Gegner(i))<100 then Gegner_in_der_Naehe=Gegner_in_der_Naehe+1 endif next if Gegner_in_der_Naehe>5 then ;wagemutig schießen endif if Gegner_in_der_Naehe<=5 then ;Deckung suchen und von dort schießen endif |
||
![]() |
Black Spider |
![]() Antworten mit Zitat ![]() |
---|---|---|
danke ![]() ist meine erste richtige KI, und die sollte schon was werden. Sieht immoment so aus (deckung sucht sie noch nicht, dafür ist sie viel zu robust, aber sie fängt aggressiever an zu feuern, und sich öfters zu Teleportieren): Code: [AUSKLAPPEN] zeit = zeit + 1 ;schwerkraft, bla bla, suchen etc. If distance > 300 Then ;warten und unsichtbarwerden End If If zeit >= 500 Then zeit = 0 ;Teleportieren End If If Distance > 100 And distance < 300 Then ;hochspringen, lage überblicken und streufeuer End If If distance < 100 Then ; Variablen für Zeitabstand checken ;feuern ;status checken -> wenn zu schlecht: Teleportieren End iF If getroffen Then ;blut, etc ;status checken -> wenn zu schlecht: Teleportieren, und aggressiver werden End If ;___ Ich hab mir da noch sowas überlegt ___ ... ;status checken -> wenn schlecht: Teleportieren -> wenn zu schlecht: Teilen das mit dem Teilen sähe dann so aus, dass sich die KI in 2 KI´s teilt, und sich auch alle werte Teilen (HP, AP, Alpha, Zeit, geschw.) aber 2 KI´s sind schwerer zu besiegen... also, was hälste´ davon? |
||
Coming soon:
http://img132.imageshack.us/im...im2ab6.gif |
![]() |
Christoph |
![]() Antworten mit Zitat ![]() |
---|---|---|
Gute Idee, grafisch wirds (vielleicht ![]() Diese 2 KIs sollten am besten ein neuen Charakter (Andere Type-definition) erhalten. Sie sind (z.B.) nicht mehr so schwerfällig wie eine große und zudem noch in Überzahl (->aggresiv) Das mit dem Teilen ist ne Super-Idee, alle Achtung!!!! ich würde das Teilen aber nur bei den "schlauen" KIs machen, die anderen sind ja Zitat: ...Kanonenfutter... ![]() |
||
![]() |
Cat |
![]() Antworten mit Zitat ![]() |
---|---|---|
also das hört sich doch voll super an ich wünsche dir viel glück beim spiel.
für deine erste KI ist das echt klasse! |
||
Intel Core 2 Duo E6300 (2 x 1,86 Ghz)
2 x 1024 MB Arbeitsspeicher NVidia GeForce 8800 GT |
![]() |
Black Spider |
![]() Antworten mit Zitat ![]() |
---|---|---|
Danke ![]() aber im moment kann ich nix machen, denn ich bin im Urlaub (atm. Internet-Cafe), doch eine Frage haette ich da noch, und zwar: wie kann ich es machen, dass die KI Deckung sucht? Ich hab 34 Objekte im Spiel, wohinter sie Deckung suchen koennten, Code: [AUSKLAPPEN] Dim Haus(33)
... Theoretisch muesste sich die KI jetzt das naechstgelegenste Haus suchen (so weit, so gut), und gucken, das sie von ihm verdeckt wird (also pruefen, welche Position am Haus die naeheste ist, und von welcher sie verdeckt wird). Da hab ich wirklich keinen Plan wie das gehen sollte..., weiss einer von euch weiter? Also, wenn der Kasten das Haus ist und ich das o (KI koennte Position= ![]() Code: [AUSKLAPPEN] ;;; ;;;;[] o ;;; und dann dort hinbewegen... aber wie? |
||
Coming soon:
http://img132.imageshack.us/im...im2ab6.gif |
![]() |
Rone |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo,
ich hätte ne Idee ![]() ![]() Also, wenn der gegner neben der Deckung steht, checkst du in welchem Winkel der Spieler zur Deckung steht und speicherst den Winkel in form eines Vektors. Dann lässt du den Gegner solange die Deckung umkreisen wie sein Winkel zur Deckung ungleich der Umkehrung des abgespeicherten Winkels ist. Code: [AUSKLAPPEN] ... xOff = EntityX(haus)-EntityX(player) yOff = EntityZ(haus)-EntityZ(player) laenge = sqr( xOff*xOff + yOff*yOff ) xOff = xOff / laenge yOff = yOff / laenge ... ... xOff2 = EntityX(haus)-EntityX(gegner) yOff2 = EntityZ(haus)-EntityZ(gegner) laenge2= sqr( xOff2*xOf2f + yOff2*yOff2 ) xOff2 = (xOff2 / laenge2)*(-1) yOff2 = (yOff2 / laenge2)*(-1) if xOff2 <> xOff And yOff2 <> yOff then ;Gegner läuft um Haus end if ... Vieleicht ist die Winkelberechnung mit ATan2(...) in diesem fall auch praktischer wenn man den Spielraum der Winkel beim Vergleichen vergrößert... Und mit ENTITYINVIEW (Entity, Kamera) könnte man das ganze bestimmt noch verfeinern. mfg Rone |
||
![]() |
Fleamor |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich würd eine einfache variante nehmen:
Code: [AUSKLAPPEN] ;Position der Deckung ermitteln
;Pivot direkt vor der KI platzieren ;Pointentity verwenden damit KI auf den Pivot ausgerichtet ist ;Pivot auf die Position der Deckung bringen und schon ist die KI ausgerichtet. Um eine Drehung der KI zu erzeugen könnte man einen 2. Pivot verwenden mit dem man den 1. ausrichtet und der 1. sich dann (langsam) zu der Position bewegt. |
||
*schwupp* O.O |
![]() |
Christoph |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das klappt aber nicht immer...
...wenn die Deckung zw. dem Spieler und dem Gegner ist schon. Beispiel: Zitat: S <-Spieler 1 ---------------------- <-Hindernis G <-Gegner Aber so: Zitat: ---------------------- <-Hindernis G <-Gegner S <-Spieler 1 Läuft der Gegner an die Wand und kann währenddessen problemlos abgeschossen werden |
||
![]() |
Rone |
![]() Antworten mit Zitat ![]() |
---|---|---|
Moin,
um zu testen ob meine Methode funktioniert, habe ich das grad mal ausprobiert. Allerdings in einer 2d draufsicht... Funktioniert schon sehr gut, wenn man dem gegner zu nahe kommt sucht er sich eine Deckung und stellt sich so, dass die Deckung zwischen Player und gegner steht. ![]() Man müsste das ganze zwar noch in sofern verfeinern, dass wenn der Spieler die Deckung umkreist, der Gegner ihm nicht in die arme läuft, was aber aber kein problem sein sollte... ![]() Hier ist der Download(428Kb - source und .exe):http://www.sa-tec.net/ki_test.rar mfg Rone |
||
![]() |
Black Spider |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hey, das ist gut ![]() bin grad wieder in Deutschland und probier gleich mal n bischn rum ^^ [EDIT] Gut. Hab mich mal hingesetzt, und das mit dem ausweichen klappt einigermaßen gut. Ich arbeite mit den Codestücken und Ansätzen die ihr mir gegeben habt, und ich benutze zusätzlich EntityVisible, doch das Funktioniert nicht ganz, denn: Code: [AUSKLAPPEN] If EntityVisible(k\obj,camera) <> 0 Then ;deckung suchen, etc. End If Doch die KI ist noch zu sehen, auch wenn EntityVisible 0 zurückgibt. Es ist zwar nicht das ganze Objekt, doch ein recht großer Teil davon ![]() den man noch abschiessen könnte. Ich hab´ auch schon versucht ein größeres Objekt um das eigentliche zu erstellen (leicht Transparent zu sehen), und nach diesem zu Fragen, doch auch da habe ich das gleiche Problem. Weiss einer wie man das umgehen kann? Im Übrigen Vielen Dank an alle! Ohne euch würden die KI´s nicht ausweichen! |
||
Coming soon:
http://img132.imageshack.us/im...im2ab6.gif |
![]() |
Black Spider |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ha!
Ich glaub ich hab die endgültige Denkweise der KI, im schlausten Modus! ![]() Ich selber finde gerade keine logischen lücken, und möchte gerne Wissen, wie ihr diese Handlungsweise findet: Code: [AUSKLAPPEN] Im schlausten Status:
;Wenn die KI zu sehen ist, weicht sie aus If EntityVisible(KI, camera) <> 0 Then ausweichen = 1 ;wenn sie beim ausweichen gesehen wird, feuert sie und weicht weiter aus If EntityVisible(KI, camera) <> 0 And ausweichen = 1 Then feuern() ;wenn sie hinter der Deckung ist, und gerade ausgewichen ist, dann wartet sie hinter ;der Deckung und lädt ihre Waffe nach If EntityVisible(KI, camera) = 0 Then If ausweichen = 1 Then warten = 1 If warten = 1 Then reload() End If ;Wenn die KI in der nähe des Gegners ist, [und evtl auch zu sehen ist,] If (EntityVisible(KI, camera) = 1) [OR (EntityDistance(KI, camera) < 20)] Then ;hinter der Deckung steht und wartet, dann springt sie aus der Deckung und feuert If Warten = 1 Then ausderdeckungspringen() angreiffen = 1 warten = 0 End If If Angreiffen = 1 Then angreifftimer = angreifftimer - (90 - KI_Anzahl) feuern() End If ;bis es wieder an der Zeit wird Deckung zu suchen If Angreifftimer <= 0 Or attacked = 1 Then angreiffen = 0 ausweichen = 1 Angreifftimer = 500 warten = 0 reload() End If Else ;ist sie nicht zu sehen, und auch niemand in Sichtweite, dann If Warten = 1 Then ausweichen = 0 angreiffen = 0 ;tut sie nichts und wartet End If ;falls sie aber immernoch angreifft, und der Gegner deckung gesucht hat, ;dann feuert sie noch einmal und sucht selber auch wieder Deckung If Angreiffen = 1 Then feuern() ausweichen = 1 angreiffen = 0 warten = 0 End If If Angreifftimer <= 0 Then angreiffen = 0 ausweichen = 1 Angreifftimer = 500 warten = 0 reload() End If End If Wenn sie in Deckung steht, wartet sie. Wenn sie in Deckung steht, und jemand kommt, greifft sie an Wenn sie aus der Deckung springt, angreifft und angegriffen wird, sucht sie sich wieder die nächste Deckung, lädt nach, und es geht wieder von Vorne los. Sollte man selber Deckung suchen, während sie angreifft, dann geht sie selber wieder in Deckung und lädt ihre Waffe nach, und der "Ich warte auf dich"-Vorgang geht wieder von Vorne los. (Die obige möglichkeit wäre ziemlich schlecht geschrieben, denn ich hätte einige Sachen besser/anders zusammenfassen können, allerdings ist es so leichter zu durchschauen, und das was in [] steht, da bin ich mir noch unsicher ob ich es so machen soll) Also, wie isset ? ![]() |
||
Coming soon:
http://img132.imageshack.us/im...im2ab6.gif |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group