mittelkomplexe KI

Diskussion zum Thema Programmierung unter DOS (Intel x86)
Antworten
Benutzeravatar
zatzen
DOS-Guru
Beiträge: 518
Registriert: Di 17. Apr 2012, 05:10
Wohnort: bei Köln
Kontaktdaten:

mittelkomplexe KI

Beitrag von zatzen »

Ich hab so ein Gefühl, dass man eine KI, also künstliche Intelligenz,
auch erschaffen kann indem man einer (nicht vom User gesteuerten)
Spielfigur einfach nen Haufen Parameter gibt.
Eine KI, wenn auch nur eine ganz dumme, wäre
ja schon, wenn ein Monster immer umkehrt sobald
es vor ne Mauer läuft...

So in dem Prinzip, aber auch dass die Spielfiguren auch
gewisse einprogrammierte Tatigkeiten ausführen können,
über deren tatsächliche Ausführung dann Schwellenwerte
Entscheiden. In der Gehirnchemie ist es ähnlich, wir haben
allerlei Ideen im Kopf, und je mehr Dopamin im Hirn rumzirkuliert
desto eher schreiten wir zur Tat und führen diese Ideen aus.

Das wäre mal eine andere vielleicht auch sinnvolle herangehensweise
an diese Sache, eben mal nicht über neuronale Netze.

Lernfähig müssen die Viecher nicht sein, das sind viele
Menschen auch nicht ;-) Einfach nur: reagieren, und
eigene Interessen durchziehen, entsprechend der
Schwellenmechanik.
Schön wäre das auch wenn man das mit Sprache verbinden kann.
mov ax, 13h
int 10h

while vorne_frei do vor;
Brueggi

Re: mittelkomplexe KI

Beitrag von Brueggi »

Statt einer KI bietet sich auch eine Art von "Script-Engine" aus. So funktioniert das auch bei vielen moderen Games (meistens natürlich noch zusammen mit einer Basis-KI). Da wird zum Beispiel ein Rechteck gezogen auf der Map - betritt der Spieler das erste mal diesen Bereich, dann setzt das Script z. B. bestimmte Flags, die dann wiederum bestimmte Blöcke auslösen.

Ich weiss nicht mehr wie das Spiel hieß, bei dem ich das mal ein wenig probiert habe (C&C Generals?) - ich weiss nur noch, dass ich als "Timer" ein Auto verwendet habe, das ausserhalb der sichtbaren Karte um selbige herumfährt (im langsamen Tempo) und dabei bestimmte "Trigger-Bereiche" auslöst. Das war spannend - hat aber auch funktioniert :-)

So ähnlich reagiert dann der Computer auf bestimmte Einheiten die gebaut werden, oder aber er bescheisst - wie z. B. bei CIV 2. Da habe ich mal eine (flache) Welt (große Karte) gemalt, um meine Vorahnung, dass der Computer bescheisst, zu bestätigen. Links befand sich eine kleine Insel und rechts - auf der linken ich, auf der rechten der Computer - dazwischen nichts als Wasser - und plötzlich kommt der Rechner mit einer Trireme von rechts (CIV-Kenner wissen, dass ohne Leuchtturm die Dinger nach 2 Runden absaufen, wenn sie sich vom Ufer entfernen)...
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: mittelkomplexe KI

Beitrag von freecrac »

Brueggi hat geschrieben:Statt einer KI bietet sich auch eine Art von "Script-Engine" aus. So funktioniert das auch bei vielen moderen Games (meistens natürlich noch zusammen mit einer Basis-KI). Da wird zum Beispiel ein Rechteck gezogen auf der Map - betritt der Spieler das erste mal diesen Bereich, dann setzt das Script z. B. bestimmte Flags, die dann wiederum bestimmte Blöcke auslösen.
So kenne ich es auch, mit einem Script kann man auf Objekte und auch auf die KI zugreifen. Jedes Object, die KI und auch alle Mitspieler haben/bekommen eine Nummer. Mit bestimmten Abfragebefehlen kann überprüft werden ob die KI sich im Radius von einem anderen Objekt, oder KI, oder Mitspieler befindet, oder ob ein Objekt benutzt, oder betreten wurde. Es können Variable verwendet werden.

Hier ist so eine Script welches ich für eine Coop-Map für den Egoshooter Joint Operrations, bzw. für den AW-Mod den es dafür gibt, geschrieben habe:

Code: Alles auswählen

if elapse(15) then
 if ssnnearssn(67312,199282,60) then // Train1
  ssnhp(67312,32000)
 endif
 if ssnnearssn(67720,199281,60) then // Train1a
  ssnhp(67720,32000)
 endif
 if ssnnearssn(67313,199283,60) then // Train2
  ssnhp(67313,32000)
 endif
 if ssnnearssn(67724,199284,60) then // Train2a
  ssnhp(67724,32000)
 endif
endif

if elapse(9) then
 ssnwave(133097,"Station.wav",200)
endif

if ssnnearssn(67720,198793,10) then // Train1 go
 ssntowp(67312,1)
 ssnwave(67720,"Lok.wav",300)
endif
if ssnnearssn(67312,198793,10) then // Train1a go
 ssntowp(67720,1)
 ssnwave(67312,"Lok.wav",300)
endif
if ssnnearssn(67724,198794,10) then // Train2 go
 ssntowp(67313,2)
 ssnwave(67724,"Lok.wav",300)
endif
if ssnnearssn(67313,198794,10) then // Train2a go
 ssntowp(67724,2)
 ssnwave(67313,"Lok.wav",300)
endif

if ssnnearssn(67312,198730,50) then // Kill Train1
 ssntowp(67312,0)
 killssn(1978)
 killssn(67312)
endif
if ssnnearssn(67720,198730,50) then // Kill Train1a
 ssntowp(67720,0)
 killssn(2183)
 killssn(67720)
endif
if ssnnearssn(67313,198731,50) then // Kill Train2
 ssntowp(67313,0)
 killssn(1979)
 killssn(67313)
endif
if ssnnearssn(67724,198731,50) then // Kill Train2a
 ssntowp(67724,0)
 killssn(2187)
 killssn(67724)
endif

if ssnnearssn(67312,199282,60) and ssnnearssn(67720,199281,60) then // Train1 go (first match)
 ssntowp(67312,1)
endif
if ssnnearssn(67313,199283,60) and ssnnearssn(67724,199284,60) then // Train2 go (first match)
 ssntowp(67313,2)
endif

if ssnride(132874) or ssnride(132876) or ssnride(133015) or ssnride(133017) then // Bot fall down on railroad track
 GLOOP Civilian
  if ssnonssn(item,132874) or ssnonssn(item,132876) or ssnonssn(item,133015) or ssnonssn(item,133017) then
   killssn(item)
  endif
 END
endif

if ontick(5) then
 ssn2ssn(1978,67312) // Train1
 ssn2ssn(1979,67313) // Train2
 ssn2ssn(2183,67720) // Train1a
 ssn2ssn(2187,67724) // Train2a
 ssn2ssn(2750,68257) // Stryker1
 ssntowp(2750,124)
 ssn2ssn(2751,68256) // Tank1
 ssntowp(2751,124)
 ssn2ssn(2761,68256)
 ssntowp(2761,124)
 ssn2ssn(2752,68261) // 30cal1
 ssn2ssn(2753,68262) // 30cal2
 ssn2ssn(2855,68427) // 50cal1
 ssn2ssn(2923,68458) // 50cal2
 ssn2ssn(3006,68541) // 50cal3
 ssn2ssn(3008,68543) // 50cal4
 ssn2ssn(3010,68545) // 50cal5
 ssn2ssn(3017,68552) // 50cal6
 ssn2ssn(3019,68554) // 50cal7
 ssn2ssn(2928,68462) // Flak1
 ssn2ssn(2929,68463) // Flak2
 GLOOP Hide
  hidessn(item)
 END
 GLOOP WalkA
  ssntowp(item,3)
 END
 GLOOP WalkB
  ssntowp(item,4)
 END
 GLOOP WalkC
  ssntowp(item,5)
 END
 GLOOP WalkD
  ssntowp(item,6)
 END
 GLOOP WalkE
  ssntowp(item,7)
 END
 GLOOP WalkF
  ssntowp(item,8)
 END
endif

if never and ssndead(68295) then // Crate1
 removessn(133949) // Fence Gate1
endif

if never and ssndead(68296) then // Crate2
 removessn(133952) // Fence Gate2
endif

if never and (ssndead(133543) or ssndead(133544) or ssndead(133545) or ssndead(133546)) then // Garage Doos
 GLOOP WalkC
  ssntowp(item,9)
 END
 GLOOP WalkD
  ssntowp(item,10)
 END
endif

if never and (ssndead(2928) or ssndead(2929)) then // Flak Soldier
 GLOOP WalkC
  ssntowp(item,11)
 END
 GLOOP WalkD
  ssntowp(item,12)
 END
endif

if never and ssndead(2855) then // 50cal1 Soldier
 GLOOP WalkG
  unhidessn(item)
  ssntowp(item,13)
 END
 unhidessn(68631) // Jet1
 v99 = 1
endif

if v99 == 1 and ssnnearssn(2855,68427,3) then // 50cal1 Soldier
 if !ssndead(2855) and !ssndead(68631) then
  ssnrelease(2855)
  ssn2ssn(2855,68631)
  ssnuse(2855)
  ssntowp(68631,15)
 endif
endif

if never and ssndead(68256) then // Tank1
 GLOOP WalkH
  unhidessn(item)
  ssntowp(item,14)
 END
endif

if never and ssndead(68298) and ssndead(68299) then // Crate3 + Crate4
 removessn(134128) // Fence Gate
 removessn(134129) // Fence Gate
 removessn(133161) // Rebel Base Flag
endif

if never and ssndead(68295) and ssndead(68296) and ssndead(68298) and ssndead(68299) and ssndead(68300) and ssndead(68301) and ssndead(68302) and ssndead(68303) and ssndead(68304) and ssndead(68405) and ssndead(68406) and ssndead(68407) and ssndead(68408) and ssndead(68409) then
 win(1)
endif

if (V78 != humans) then
 if (humans < 3) then
  if (V78 > 1) then
   if (humans < V78) then
    consol("accuracy down")
   else
    consol("accuracy up")
   endif
  endif
  V78 = (humans * 2)
  accuracyspread = 32 - V78
 else
  accuracyspread = 1
  consol("accuracy up")
 endif
 V78 = humans
endif
Dort lasse ich die Ki in zwei Richtungen mehrer Züge fahren (zwei Züge je Richtung, bis zum Spielende wiederholt sich der Vorgang). Am Bahnhof stehen viele Reisende und es wird ein Bahnhofsgeräusch abgespielt vom dortigen Cola-Automat den ich da plaziert habe. (Das Geräusch habe ich im Internet gefunden und dann entsprechend gewandelt und zurecht geschnitten. Leider werden solche selber zugefügten wav.files nicht per Netzwerk übertragen und jeder Mitspieler braucht sie selber in seinen Spieleordner. Alle anderen Daten der Map werden vom Host übertragen und nur der Host braucht die Map-Daten als Dateien.)

Andere Gruppen von KI sollen vordefinierte Wege mit festen Wegpunkten zu Fuss ablaufen, oder stationäre Waffen benutzen. Wenn eine bestimmte Ki an an einer solchen stationären Waffe von uns erschossen wird und dann ein zweites Mal spawnen darf, dann wird diese KI zu einen Flugzeug teleportiert und fliegt dann eine bestimmte Flugroute. Von uns gesetzte Wegpunkte werden zu durchnummerierten Wegpunktlisten zusammengefasst in der Map gespeichert.

Zur Basis-KI:
Wenn ein Mitspieler sich in einer festgelgten Entfernung zu der KI befindet und die KI sieht den Spieler, dann bleibt die KI stehen und die KI fängt an den Spieler zu bechiessen. Dabei kann die KI auch selbständig in Deckung gehen und die ursprünglichen Weg verlassen. Wenn der Spieler nicht mehr da ist, dann versucht die KI wieder ihren Weg zu folgen. Manchmal klapt das nicht so ganz, wenn die KI festhängt und nicht wirklich den Weg zurück zur alten Route findet. Dann versucht die Ki immer den naheliegensten Wegpunkt zu erreichen und dann die Liste der Wegpunkte abzulaufen.

Das Bild zu der Map mit den Namen "Town AW2":
Bild

Dirk
Antworten