Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

28.12.2007, 19:24

kleine KI mit C

hi ho und frohe Weihnachten erstmal,

als praktische Übung meiner UNI sollen wir eine kleine KI für eine client/server Anwendung schreiben.

Die Regeln sind folgende:
Man startet mit einem sogenannten Viech auf einem quadratisch großem in Felder unterteiltem Spielfeld und kann sich bewegen, Nahrung sammeln, gegen andere Viecher kämpfen etc. Ziel des Spiels ist es, möglichst lange zu überleben (bzw. den Tutor-client auszulöschen, aber das ist ja jetzt erstmal egal xD)

Man bekommt also pro Viech vom Server eine Nachricht über Position, Lebensenergie und den Zustand der Umgebung (für alle umliegenden Fehler) und muss darauf reagieren, indem man sein Viech klont oder sich bewegt.

Ich hatte jetzt also vor, meine Viecher solange in eine Richtung laufen zu lassen, bis sie durch ein besonderes Ereignis (Nahrung, Feind, Wand) wechseln müssen. Dazu brauche ich aber für jedes Viech eine Variable, die die aktuelle Richtung speichert. In C++ wäre das kein Problem, weils da ja Vektoren gibt, aber wie mach ich das in C?
Die rabiate Lösung wäre einfach, ein array mit der Spielfeldgröße zu reservieren, aber in Anbetracht des Sachverhalts, dass bei nur einem Viech auf dem Feld 99% Speicher verschwendet wird doch eher uncool.
Also muss wohl malloc herhalten, aber dann muss ich ja immer wenn ein Viech sich klont oder stirbt einen neuen größeren Bereich anlegen und den alten da reinkopieren.
Oder weiß jemand, wie man das am besten lösen kann?

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

2

28.12.2007, 20:28

Erstmal zu dem 'C++ kein Problem wegen Vector' - da wird im Grunde nicht viel anderes gemacht, als immer wieder nen größerer Speicherbereich allokiert und der alte da rein kopiert (nur eben, dass auch mal auf Vorrat reserviert wird, damit man nicht ganz so oft von vorn anfangen muss)

Die Frage wär hier:

- wie groß ist das Spielfeld?
- wieviel Spielfeld wird anteilmäßig erkundet, wenn die KI halbwegs funktioniert.

Wenn das Feld klein ist, oder am Ende vom Spiel sowieso 90% erkundet sind dann kann man auch gleich nen Array für das gesamte Feld machen, wenn hingegen immer nur ein kleiner Teil erkundet wird dann ist eine bedarfsorientierte Lösung (wie auch immer sie letztendlich aussieht) vorzuziehen.

Bugger

Frischling

Beiträge: 66

Wohnort: Bezirk Freistadt

Beruf: EDVO HTL Schüler

  • Private Nachricht senden

3

28.12.2007, 20:36

Ich würde das Feld in nem Byte- Array speichern und dann mit Zahlen festlegen ob 0 - das Feld leer ist, 1- ein Heilitem drauf ist, 2- Ein Viech mit Richtung links, 3- ... rechts, usw...
(mit nem enum)
Das mag zwar nicht unbedingt einwandfrei sauber sein ist aber speichermäßig, denk ich mal, die beste Lösung(und spart dir jede Menge Arbeit ;) )

PS.: für Speicherexpasionen könntest du realloc verwenden :idea: - spart dir die Plackerei ;)
Hältst du nicht den Bug in Ehren, wird er dich noch manches Lehren.

Ein Gespräch setzt voraus, dass der andere Recht haben könnte.

4

28.12.2007, 23:07

Zitat von »"grek40"«


Die Frage wär hier:

- wie groß ist das Spielfeld?
- wieviel Spielfeld wird anteilmäßig erkundet, wenn die KI halbwegs funktioniert.


Genau das ist das Problem, das wird per Parameter festgelegt und dann in der init-message vom server geschickt. Und ich bin mir sicher, dass die Tutoren da sehr viel mit experimentieren werden -.-

In der Std-Einstellung mit 30x30 Feldern und Nahrungsgenerierung von 1% für jedes Feld, hat die Tutor-Version, wenn sich alles halbwegs eingependelt hat, zwischen 40-50 Viecher auf dem Spielfeld. Zwischendrin sind es aber mal kurzzeitig über 200.

@Bugger: Das verbraucht aber glaube ich auch nicht weniger Speicher. Ich kenne auch den globalen Status des Feldes nicht, sondern nur die 9 Felder "Sichtweite" meiner Viecher.

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

5

29.12.2007, 02:30

Also ich würd glaub ich echt ein array fürs ganze Spielfeld nehmen... alles andere wird sehr kompliziert im Sinne einer vernetzten KI.
Wenn man, wie Bugger sagte, ein Bytearray nimmt dann bringt selbst ein 1000*1000 Feld gerademal 1mb auf die Waage -> wenn die Tutoren noch krasser an den Werten rumspielen ham se halt Pech^^

für Felder, deren Status du nicht kennst nimmste halt auch nen Wert (z.b. 0 oder 255)
Dein Viehzeug sollteste dann allerdings nochma extra irgendwo vermerken, es wär nich so ideal, wenn die im Spielfeld integriert werden (dazu brauchste also doch wieder ne Art Liste).

Bleibt noch zu klären, wie komplex die KI werden soll (@Tutor-KI auslöschen :) ) man kann ja wenn ich das recht verstehe aus dem Parameter Nahrungsgenerierung schließen, ob in den letzten Runden ein Viehzeug auf einem Feld war (und wenn man entsprechend viel Speichert kann man auch feststellen, ob es vielleicht einfach ein eigenes war...)
Aber da haste nen bisschen wenig Infos über den genauen Funktionsrahmen in dem du dich bewegst gebracht :lol:

Werbeanzeige