Ich versuche zufällig eine Karte von Räumen zu erstellen, die durch Türen verbunden sind, und es ist mir gelungen, eine mit diesem Code zu erstellen:
public void generate(GameContainer gc) {
rooms = new ArrayList<Room>();
startingRoom = new Room(0);
startingRoom.setPosition(viewport.getCenterX(), viewport.getCenterY());
lastRoom = startingRoom;
rooms.add(startingRoom);
int roomsize = 25;
for (int i = 0; i <= (1000 + Math.random() * 4000); i++) {
Room room = new Room(i + 1);
int direction = (int) (Math.random() * (4));
switch (direction) {
case 0:
room.setPosition(lastRoom.x, lastRoom.y - roomsize);
break;
case 1:
room.setPosition(lastRoom.x, lastRoom.y + roomsize);
break;
case 2:
room.setPosition(lastRoom.x + roomsize, lastRoom.y);
break;
case 3:
room.setPosition(lastRoom.x - roomsize, lastRoom.y);
break;
default:
room.setPosition(lastRoom.x, lastRoom.y - roomsize);
break;
}
rooms.add(room);
lastRoom = room;
}
}
Dies erlaubt mir jedoch nicht herauszufinden, welche Türen der gegebene Raum hat. Ich muss in der Lage sein, das herauszufinden, damit ich die Türen an den richtigen Stellen platzieren kann, damit sie für angrenzende Räume verwendet werden können. Ist diese Art von "Smart Map" mit meinem aktuellen Algorithmus möglich oder sollte ich von vorne beginnen? Welche Schritte kann ich unternehmen, um dies zum Laufen zu bringen?
Ich benutze dafür Slick2d und Java
Vielen Dank.
java
maps
random
procedural-generation
user1500452
quelle
quelle
Antworten:
Ich denke, dass diese Frage ziemlich offen ist, da Sie einige Codeteile benötigen, bevor Sie die Räume richtig verknüpfen können, und wie Sie das codieren, hängt stark davon ab, wie die Dinge für Sie sinnvoll sind.
Trotzdem kann ich Ihnen einige Empfehlungen geben, die Ihnen helfen, in die richtige Richtung zu gehen.
Wenn die Raumgrößen konstant sind, würde ich zunächst empfehlen, ein übergeordnetes Koordinatensystem für die Räume zu erstellen. Etwas, das so aussehen würde:
Die Idee ist, dass Sie beim Erstellen von Raum (0,0) die Räume (-1,0) (0, -1) (1,0) und (0,1) fragen, wo sich die angrenzenden Türen befinden. Wenn Sie Bildschirmkoordinaten benötigen, sollte es einfach genug sein, eine GetScreenCoords-Methode oder eine Transformationsmatrix hinzuzufügen, wenn Sie sich für diese interessieren.
Als nächstes möchten Sie die Liste der Räume abfragen können. Das Durchsuchen aller Zimmer in Ihrer Liste (bis zu 5000!), Um nur die benachbarten Zimmer zu finden, wird teuer. Für eine schnelle Möglichkeit, die Dinge zum Laufen zu bringen, würde ich empfehlen,
HashMap<coord, Room> rooms
stattdessen eine zu verwenden. Auf diese Weise fragen Sie beim Erstellen von Raum (0,0) nach vorhandenen benachbarten Räumen, nach denen Sie einfach fragenrooms.get((1,0))
usw., und fügen Ihren neu generierten Raum bei (0,0) hinzu,rooms.put((0,0), newroom)
wenn dies zu langsam wird, kann dies der Fall sein einen Blick auf sortierte Listen wert sein. Vielleicht eine sortierte Liste (x) von sortierten Listen (y).Schließlich müssen Sie eine Möglichkeit hinzufügen, um die Türposition von den benachbarten Räumen zu erhalten. Eine neue Methode wie
int GetSouthDoor()
sollte den Trick machen.Ich bin mir sicher, dass Sie noch viel mehr Arbeit haben werden, um eine vollständige Lösung zu programmieren. Ich hoffe, dies wird Ihnen beim Einstieg helfen.
quelle
Zwei Dinge:
1) In deinem Kommentar sagst du, du willst so etwas wie die Bindung von Isaac. Dieses Spiel hat Türen in der Mitte jedes Stücks, die garantieren, dass sie in einer Reihe stehen. Wenn Sie diesem Beispiel folgen, kommt es nur darauf an, zu entscheiden, mit welcher Art von Tür sie verbunden werden sollen (offen, verschlossen, Bowall usw.).
2) Ihr Code scheint an einer Stelle zu beginnen und prozedural neue Kacheln in eine Richtung zu generieren. In Ihrer Switch - Anweisung, jedoch sind Buchhaltung Sie nicht für die Richtung Sie kommen aus . Wenn Sie mit diesem Algorithmus fortfahren, sollten Sie auch die letzte Platzierung verfolgen, damit sich die Kacheln nicht gegenseitig überschreiben.
quelle
Verwenden Sie einen Labyrinth-Generierungsalgorithmus
Verwenden Sie eine modifizierte Form des Prim-Algorithmus , um ein grundlegendes Labyrinth von etwa 20 Räumen zu erstellen. Wählen Sie zwei Räume als Start- und Endräume aus, um sicherzustellen, dass das Ende immer erreichbar ist. Blockieren Sie zufällige Türen mit unterschiedlichen Türtypen und fügen Sie zufällig Türen hinzu, bei denen zwei benachbarte Räume nicht verbunden sind (mit geringer Wahrscheinlichkeit).
quelle