KI - Allgemeine Fragen

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

Black Spider

Betreff: KI - Allgemeine Fragen

BeitragFr, Jun 23, 2006 13:29
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Jun 23, 2006 14:27
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Jun 23, 2006 19:14
Antworten mit Zitat
Benutzer-Profile anzeigen
hey, cool, das ist geil Very Happy ,
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

BeitragSo, Jun 25, 2006 12:52
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Wink

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 Smile lassen.

Seoman

BeitragSo, Jun 25, 2006 19:24
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile lassen.


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 Razz

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 Wink

Christoph

BeitragDi, Jun 27, 2006 13:50
Antworten mit Zitat
Benutzer-Profile anzeigen
@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

BeitragDi, Jun 27, 2006 15:33
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Christoph

Betreff: KI zu proggen ist spitze!!!

BeitragDi, Jun 27, 2006 17:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Großes Lob!!!
So wie du nachdenkst, kann das was richtig Tolles werden!!! Wink
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

BeitragMi, Jun 28, 2006 17:56
Antworten mit Zitat
Benutzer-Profile anzeigen
danke Very Happy
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

BeitragDo, Jun 29, 2006 16:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Gute Idee, grafisch wirds (vielleicht Wink ) nen bissl schwierig.
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...
Wink

Cat

BeitragSa, Jul 01, 2006 14:34
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Jul 06, 2006 19:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke Very Happy ,
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=Wink, erstmal pruefen von wo aus die KI gedeckt ist:
Code: [AUSKLAPPEN]

;;;
;;;;[]   o
;;;


und dann dort hinbewegen... aber wie?
Coming soon:
http://img132.imageshack.us/im...im2ab6.gif

Rone

BeitragDo, Jul 06, 2006 20:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
ich hätte ne Idee Smile , hab zwar sowas auch noch nicht gemacht , müsste aber eigendlich gehen... Wink

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

BeitragSo, Jul 09, 2006 13:42
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jul 09, 2006 13:52
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jul 09, 2006 23:45
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Smile
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... Wink

Hier ist der Download(428Kb - source und .exe):http://www.sa-tec.net/ki_test.rar

mfg
Rone

Black Spider

BeitragDo, Jul 13, 2006 16:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey, das ist gut Very Happy ,
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

user posted image

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

BeitragFr, Jul 14, 2006 12:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Ha!
Ich glaub ich hab die endgültige Denkweise der KI,
im schlausten Modus! Very Happy

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 ? Surprised
Coming soon:
http://img132.imageshack.us/im...im2ab6.gif

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group