Ich mache ein 2D Tower Defense Spiel. Bisher habe ich ein 2D-Array, das als Raster für mein Spiel dient. Ich kann Türme darauf platzieren, Feinde und einige schleppende und turmschießende Sachen laufen lassen.
Jetzt stehe ich vor einem Problem in der Turmplatzierungslogik. Ich möchte, dass es für Feinde immer einen begehbaren Weg gibt, was bedeutet, dass der Benutzer den Weg nicht vollständig blockieren kann, indem er Türme platziert. Z.B. Wenn der Benutzer Türme vertikal auf einer Karte platziert, muss der Algorithmus die Platzierung eines Turms verhindern, der die vertikale Linie vervollständigt. Oder auf andere Weise muss mindestens ein freier (begehbarer) Platz vorhanden sein, damit der Feind entkommen kann.
Meine aktuelle Logik prüft in alle Richtungen, wann immer der Turm platziert wurde. Wenn sich ein Turm nach oben befindet, wird dieselbe Funktion an diesem oberen Turm erneut aufgerufen, bis er gegen eine Wand stößt. Es gibt 1 für die Aufwärtswand und 5 für die Abwärtswand zurück und gibt die Funktion (Auf- / Ab-Turm) zurück, wenn es einen Turm gibt. Hier ist der Code:
int checkCollision(tower)
{
if( there is a tower up)
return checkCollision(up tower);
if(there is a tower down)
return checkCollision(down tower);
......all directions.....
if( there is a wall on UP )
return 1;
if( there is a wall DOWN )
return 5;
....all walls......
return 0;
}
Was ich jetzt möchte, ist, gleichzeitig zu prüfen, ob es eine Nordwand und eine Südwand gibt, oder andere Richtungen mit einer anderen Möglichkeit (wie Auf-Ab, Auf-Diagonale, Ab-Diagonale usw.) zu prüfen, um den Benutzer nicht zuzulassen Platziere einen Turm, da noch ein Platz für den Feind übrig sein sollte.
Ich bin im Moment mit meinem Code unzufrieden. Ich meine, mein Code sagt mir, dass eine Wand gefunden wurde, aber wie kann ich überprüfen, ob eine Wand in einer Richtung und eine Wand auch in einer anderen Richtung gefunden wird? Ich möchte nicht auf Möglichkeiten eingehen wie:
if(checkCollision(tower) == 1 && checkCollision(tower) == 5)
"You cannot place"
Ich möchte so etwas wie:
if( any combination of more than 2 wall found and there is entry/exit point in between) //so it is wall to wall
"You cant place"
Ich habe auch versucht, Flaggen vorab zu berechnen, wenn es Wände auf zwei Seiten gibt (wie oben-unten, oben-diagonal usw.), dann lasse ich den Benutzer den Turm nicht platzieren, aber das funktioniert immer noch nicht.