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

Schorsch

Supermoderator

  • »Schorsch« ist der Autor dieses Themas

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

1

31.12.2010, 14:10

Graphen zur Laufzeit bestimmen

Hey,
Ich möchte in meinem Spiel automatisch erstellte Graphen in meinen Levels haben. Wer das Buch Programming Game AI by Example kennt, kennt vielleicht auch dessen Ansatz. Mit Floodfill wird dort der Graph bestimmt. Mein Problem dabei ist aber das ich mir nicht sicher bin wie ich doppelte Knoten verhindern kann und dabei performant bleibe.
Als Veranschaulichung für das Problem:
Stell dir vor du willst Türme von Hanoi mit einem Graphen lösen. Der Graph wird Schritt für Schritt expandiert. Man möchte keine Knoten doppelt haben. Mein wirklich naiver Ansatz wäre bei jedem Neuerzeugen von einem Knoten zu gucken ob dieser Knoten schon irgendwo im Graph vorhanden ist. Ich vermute aber das geht auch mit schönerer Laufzeit;)
Hoffe ihr könnt mein Problem nachvollziehen.
Lieben Gruß und schonmal guten Rutsch.
Sören
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

2

31.12.2010, 14:47

Ich verstehe deine Frage nicht ganz, aber vielleicht hilft dir das: Es gibt STL-Container, die doppelte Einträge ignorieren, wie z.B. set und map.

Schorsch

Supermoderator

  • »Schorsch« ist der Autor dieses Themas

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

3

31.12.2010, 15:54

Die Knoten des Graphen sollen Koordinaten darstellen. Und beim erzeugen werden nun Knoten doppelt erstellt. Neue Knoten die aber an den gleichen Koordinaten stehen. Aber für den Graph ist es erstmal der selbe Knoten. Man könnte jetzt vor jedem einfügen überprüfen ob schon ein Knoten mit genau diesen Koordinaten vorhanden ist. Wobei ich halt vermute das das einfacher geht. Ich glaub auch weniger durch die Wahl der Container. Hoffe das hat dir weitergeholfen;)
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Oberon

Treue Seele

Beiträge: 181

Wohnort: Österreich

Beruf: Student

  • Private Nachricht senden

4

31.12.2010, 16:02

Ich verstehe die Frage zugegebenermaßen auch nicht, aber beim Stichwort Graph fällt mir spontan boost.Graph ein.

Schorsch

Supermoderator

  • »Schorsch« ist der Autor dieses Themas

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

5

31.12.2010, 16:33

Nein es soll ein ungerichteter Graph für Wegfindung etc über die Spielwelt gelegt werden. Und dieser Graph soll automatisch berechnet werden.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

6

31.12.2010, 17:32

FloodFill arbeitet doch auf Arrays, oder nicht? Wenn du die Datenstruktur pfiffig wählst, kannst du in konstanter Zeit (1 Array Zugriff) feststellen, ob du diesen Punkt schon hattest.
Lieber dumm fragen, als dumm bleiben!

Schorsch

Supermoderator

  • »Schorsch« ist der Autor dieses Themas

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

7

31.12.2010, 17:46

Ich möchte die Karte ungern Tilebasiert regeln. Die Idee ist, dass man eine Karte mit Objekten hat. Man setzt irgendwo in der Karte einen Knoten für den Graph fest. Und mit Floodfill vervollständigt man den Graphen. Man geht halt von diesem Knoten ein Netz von allen möglichen Nachfolgerknoten durch, bis die Map komplett gefüllt ist. Wenn ein Knoten einen mindestabstand zu Kollidierbaren objekten nicht einhalten kann, so wird dieser natürlich nicht gesetzt. Dadurch wird automatisch ein Bewegungsgraph erzeugt, auf dem alle möglichen Punkte der Karte erreichbar sind. Mir gehts jetzt um den Graphen und die erzeugung der Knoten. Die Knoten werden zwar durch indizes auseinandergehalten, die Indizes haben aber nichts mit den Koordinaten zutun.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Schorsch

Supermoderator

  • »Schorsch« ist der Autor dieses Themas

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

8

01.01.2011, 18:50

Frohes Neues erstmal;)
Also ich versuchs nochmal zu erklären.
Es geht um Graphentheorie wenn ich von Graph spreche. Es geht nicht um irgendwelche bestimmten Containerimplementationen, sondern allein um die Logik dahinter. Die Graphenklasse wird von mir selbst geschrieben. Ich möchte einen Graphen über meine Spielwelt spannen. Dies bringt halt Vorteile wie zb Wegfindung etc. Sollte klar sein;) Der Graph wird über Floodfill bestimmt. Floodfill ist ja ein Algorithmus, der nicht nur zum füllen von Farbflächen gedacht ist, auch wenn er meist dort eingesetzt wird;)
Stellt euch eine Zweidimensionale Welt vor. An der Stelle (5,5) wird nun fest der erste Knoten des Graphen gesetzt. Jetzt guckt der Algorithmus in einem bestimmten Abstand um diesen Knoten ob er neue Knoten erzeugen kann, oder ob Objekte im Weg sind.
Sagen wir Abstand ist 1. Also würden jetzt die Punkte (4,5),(5,4),(6,5),(5,6) überprüft und gegebenfalls als Knoten dem Graph hinzugefügt. Das geht dann rekursiv(oder von mir aus auch iterativ, je nach Umsetzung) für jeden weiteren Knoten so. Am Ende hat man einen Zusammenhängenden Graph in der Welt.

Soviel zum Hintergrund. Mein Problem ist einfach nur wenn ich Beispielsweise die Knoten (4,5) und (5,4) expandieren würde, würden beide Knoten zu einer neuen Koordinate (4,4) führen. Sagen wir (4,4) ist frei von Kollision und soll so als neuer Knoten dem Graph hinzugefügt werden. So würden zwei bzw. mehrere Versionen des Knotens hinzugefügt. einmal wenn (4,5) expandiert wird und einmal wenn (5,4) expandiert wird. Jetzt könnte man vor jedem einfügen in den Graphen checken, ob bereits ein Knoten mit genau den Koordinaten vorhanden ist, was ich aber für relativ umständlich halte. Vielleicht gibt es ja auch keine andere Lösung;) Das Problem hiermit trifft eigentlich fast jedes mal auf wenn ein Graph erst zur Laufzeit bestimmt wird. Gleiches Problem wäre bei der Graphenlösung vom Rubiks-Cube oder der Türme von Hanoi, da dort auch durch verschiedene Wege der gleiche Knoten erreicht werden kann. Ich denke für das Problem sollte es eine Lösung geben.
Hoffe das war diesmal verständlicher;)
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

9

01.01.2011, 21:49

Ja wie gesagt, du kannst z.B. die Knoten des Graphen in einem Array speichern und so in konstanter Zeit nachsehen, ob an dieser Stelle schon ein Knoten ist oder nicht.
Ob der Graph selbst als Array gespeichert wird, ist ja erstmal egal. Wichtig ist, dass man damit sehr schnell suchen kann.
Lieber dumm fragen, als dumm bleiben!

Schorsch

Supermoderator

  • »Schorsch« ist der Autor dieses Themas

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

10

02.01.2011, 15:45

Ich hätte vielleicht dazu sagen sollen das die Vektoren aus float Werten bestehen. Hatte auch erst über ein mapping mit Koordinaten als Indizes nachgedacht, wird aber mit float Werten relativ schwer. Würde sich da dann nicht vielleicht eine Hashtable anbieten?
Hmm naja bleibt dann nur die Frage wie man das Problem in anderen Fällen lösen sollte. Beispiel ein State Graph mit dem ein Rubiks Cube gelöst werden soll. Aus den Zuständen kann ich ja schlecht Indizes machen bzw nur unter großen Aufwand.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Werbeanzeige