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

25.01.2016, 00:14

Alternativer Pfad

Ich bin gerade dabei ein Tower Defense zu programmieren. Das Spielfeld ist in Tiles aufgeteilt (15 x 7). Dabei sind die Wände nicht statisch, d.h. im Verlauf des Spiels können die Spieler neue Wände bauen oder alte abreißen. Jeder Spieler hat einen Core, welcher zerstört werden soll. Die Bedingung ist, dass es mindestens einen validen Pfad zum Gegner Core gegeben muss, damit eine Wand gebaut werden kann. Das ist soweit ja auch recht einfach herauszufinden, allerdings wird es etwas komplexer, wenn man dem Spieler eine Art Buildable Overlay anzeigen möchte. D.h. im Baumodus alle bebaubaren Tiles hervorheben (einfärben o.Ä.). Hier müsste ich also direkt für alle Tiles wissen, ob es einen alternativen Pfad gibt.
Da die beiden Cores fest sind und ich deshalb prinzipiell immer zu ein und dem selben Ziel die Berechnung durchführe, gibt es hier vll sogar relativ gute Alternativen zum üblichen A* Algorithmus. Das hier fand ich prinzipiell eigentlich ganz interessant. In der Wahl des Algorithmus bin ich also sehr variabel. Hat hier jemand eventuell schonmal etwas Erfahrung gesammelt oder eine Idee?

mfg

Superwayne

Treue Seele

Beiträge: 242

Beruf: Student & App Entwickler (Xamarin)

  • Private Nachricht senden

2

25.01.2016, 01:02

Wie wäre es denn mit diesem Ansatz:
Du berechnest einmal den schnellsten Weg von Core zu Core mit dem A*. Alle Felder, die nicht auf dem Weg liegen, dürfen bebaut werden, da der schnellste Weg erhalten bleibt. Für alle Felder auf dem Weg, kannst du entweder nochmal den A* vom Vorgänger bis zum Ziel anwenden, nur diesmal mit entsprechenden Feld blockiert. Gibt es trotzdem einen Weg, darf das Feld ebenfalls bebaut werden.
Man könnte sogar abfragen, ob die 8 Felder um das Feld auf dem Weg leer sind. In dem Fall gibt es immer einen alternativen Weg, da man komplett um das Feld herumbauen kann. Oder wenn man das vorherige und nächste Feld betrachtet, könnte man sogar noch genauer sagen, wann um das Feld herumgebaut werden kann. Beispielsweise so (X = blockiert, O = frei, B = betrachtetes Feld, W = Weg):

Auf jeden Fall möglich:

C-/C++-Quelltext

1
2
3
X W O       O W X
W B O       W B X
O O O       X X X


Alternativer Weg nötig (A* verwenden):

C-/C++-Quelltext

1
2
3
X W O
W B X
O O O


Ob sich das Berechnen mit den ganzen Fallunterscheidungen dann noch lohnt, oder ob man direkt den A* nimmt, muss man vermutlich einfach ausprobieren.

Das habe ich mir zumindest jetzt so überlegt, dass das so funktioniert, kann ich nicht garantieren :D

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

25.01.2016, 06:37

Ich schätze mal, dass der Sinn des Spiels (wie so oft) darin liegt den Weg so lang wie möglich zu machen und daher ist die Forderung den kürzesten Weg erhalten zu müssen eher nicht so prall.
Die Idee mit der Anzeige des Bebauungsplans stelle ich mir kompliziert vor. Ich sehe spontan zumindest keine Echtzeitlösung, um für jedes Feld zu bestimmen, ob es bebaut werden darf. Ich kenne es von anderen Tower-Defence-Games, dass man einfach erlaubt irgendwo zu bauen. Finden die Creeps keinen Pfad, nehmen sie den direkten Weg zum Ziel und zerstören solange Tower, bis wieder ein valider Pfad vorliegt, bzw. laufen sie soweit es möglich ist zum Ziel und zerstören dann Tower, um neue Pfade zu ermöglichen. Wahlweise könnte man nach jedem Tower prüfen, ob es noch einen Pfad gibt und falls nicht, diesen dann von den Creeps zerstören lassen.
Willst Du unbedingt eine Vorschau, bietet sich eventuell noch die Möglichkeit nicht von vornherein für jedes Feld anzuzeigen, ob Bebauung möglich ist, sondern beim Platzieren des Towers eine Vorschau für dieses spezielle Feld zu machen oder das Bauen an diesem Feld erst dann zu prüfen, wenn der Spieler es anordnet.

Andererseits ist 15x7 jetzt keine Killer-Größe. Hast Du mal getestet, wie lange es dauert für jedes Feld einen A* laufen zu lassen, bei einem großen Labyrinth? Du musst ja ohnehin "nur" die freien Felder checken.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »BlueCobold« (25.01.2016, 06:46)


4

25.01.2016, 08:09

Andererseits ist 15x7 jetzt keine Killer-Größe. Hast Du mal getestet, wie lange es dauert für jedes Feld einen A* laufen zu lassen, bei einem großen Labyrinth? Du musst ja ohnehin "nur" die freien Felder checken.

Notfalls muss ich es wohl wirklich so machen (hab da noch ein paar Optimierungsmöglichkeiten, aber die Fallen auch nicht so sehr ins Gewicht). Da das Ganze ein Browser Game ist und letztendlich viele Spiele auf einen Root gehandled werden sollen, wäre das vll ein wenig zu viel Overkill für ein so kleines Feature.
Ich muss hier noch anmerken, dass es hier auch nur 4 Bewegungsrichtungen gibt, das hatte ich vergessen.

Ich schätze mal, dass der Sinn des Spiels (wie so oft) darin liegt den Weg so lang wie möglich zu machen und daher ist die Forderung den kürzesten Weg erhalten zu müssen eher nicht so prall.

Richtig. Es kann die Strategie sein, den kürzesten Erhalten zu wollen, aber das liegt im Ermessen der beiden Spieler. Das Game sollte da keine Vorschriften machen.

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

5

25.01.2016, 10:22

Es geht ja nur darum, zu erkennen, ob die Bebauung eines Feldes den Gesamtweg blockiert. Und da sollte sich was machen lassen. Den finalen Test, ob der Spieler soeben die letztmögliche Durchgangsposition zubauen will, kann tatsächlich nur der A* liefern. Aber Du kannst ja drastisch vorselektieren, welche Felder für eine solche Blockade in Frage kommen.

Für die Horizontale gibt es neun minimal blockierende Muster:

Quellcode

1
2
3
X-- -X- --X X-- -X- --X X-- -X- --X 
-0- -0- -0- -0- -0- -0- -0- -0- -0-
X-- X-- X-- -X- -X- -X- --X --X --X


Für die vertikale ebenso neun, abzüglich der Eckmuster, die in der Horizontalen auch schon vorkamen. Wobei mir gerade auffällt, dass man das ja nichtmal über Mustererkennung machen muss, sondern ganz banal in den gegenüberliegenden Zeilen (oder halt Spalten) Anwesenheiten zählen muss. Sobald in der Zeile darüber und darunter in der Dreier-Umgebung mindestens ein Block auftaucht, kann das Feld den Pfad blockieren. Das selbe gilt für die Vertikale dann für die Spalte links und rechts. Ob die Bebauung dann auch zu einer totalen Blockade führt, kriegst Du dann aber doch nur mit nem spekulativen A* raus.

Wenn Du das wirklich schnell haben willst, packst Du Deine Begehbar-Karte in ein Bitmuster und benutzt x86-Intrinsics wie das SSE4-popcnt. Das ist allerdings eine recht moderne Instruktion, also wird evtl. nicht jeder Server das unterstützen.

Aber ganz ehrlich: bei dieser Kartengröße und den üblichen Erfolgsquoten von Indie-Spielen ist das verschwendete Lebenszeit. Bau erstmal die direkte Lösung und schau, wie weit sie Dich trägt.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Schrompf« (25.01.2016, 10:28)


6

01.02.2016, 00:06

So, danke für das Feedback.
Bin nun endlich mal dazu gekommen, das ein wenig auszuprobieren.
Die möglichen Tiles lassen sich wirklich drastisch reduzieren, dennoch läuft das am Ende auf eine relativ stattliche Anzahl an Suchen hinaus.
Es ist häufig so, dass alle Tiles bebaut sind und tatsächlich nur noch ein weg vom Core zum anderen Core existiert. Das ist der schlechteste Fall, der durch die Muster Idee von Schrompf nicht abzufangen ist. Hat hierzu noch jemand eine Idee?

mfg

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

01.02.2016, 06:53

Die Idee von Schrompf ist lediglich als Filter zu verstehen, um die Anzahl Prüfungen zu reduzieren. Hast Du mal einen Benchmark gemacht, ob angesichts des doch sehr kleinen Feldes, denn überhaupt Performance-Probleme zu erwarten sind?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

8

01.02.2016, 17:19

Hab das Ganze jetzt mal getestet. Rein performance mäßig bin ich bei unter 0,1 msec für die map. Reicht absolut ;)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

01.02.2016, 17:28

Na dann Thema erledigt ;)
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige