So Erzeugen Sie eine Karte, die in Java?
Ich versucht, um ein RPG-Spiel für ein Projekt, haben aber keine Ahnung, wie das Spiel anzeigen.
Es muss nicht grafisch, aber der code für die gesamte Karte, und jede Fliese muss korrekt sein.
So weit, dass ich dachte darum, eine nicht-Matrix-anzeigen (als Anfrage durch den professor), indem Sie eine ArrayList, die enthalten alle der verlinkten Fliesen.
public abstract class Casella {
/**
* @uml.property name="tabellone"
* @uml.associationEnd multiplicity="(1 1)" inverse="casella:Tabellone"
* @uml.association name="contains"
*/
private int id;
private boolean free = true;
private List adjacent;
private List items;
private Tabellone tabellone = null;
public void in(){
free = false;
}
public void out(){
free = true;
}
}
Dies war der code für eine einzelne Kachel (die hat 3 Klassen, das reicht). Ich habe immer noch keine Ahnung, wie die zusammen und generieren Sie eine Karte.
Vielen Dank für Ihre Zeit.
- Können Sie uns mehr details, was dieses Spiel ist und welche Art von Karte, die Sie sprechen? Eine Welt Karte mit interessanten Orten?
- Die Karte generiert wird, jedes Spiel. Es ist nur eine Ebene, und jede Zelle kann eine von 3 verschiedenen Art (Stadt, Hügel, Ebene). Jede Zelle kann auch enthalten ein Element (Klasse Item), die auch einen von 4 verschiedenen freundlichen. Charakter bewegt sich für 1 Plättchen pro Zug.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beginnen Sie nicht mit der Umsetzung, beginnen mit, wie Sie möchten, um die Karte zu benutzen. Geben Sie einige Einschränkungen, wie es zu implementieren. Zum Beispiel:
Beim zeichnen der Karte, wie Sie auf Sie zugreifen? Durch koordinieren? Oder von "go west von tile X"?
[EDIT] ich schlage vor, zu starten mit der main-Schleife von dem RPG Spiel. Sie müssen die Zeichen/token irgendwo (d.h. es muss irgendeine Art von Beziehung zu einer Kachel).
Dann brauchen Sie, um das Zeichen zu verschieben. Ein Charakter muss in der Lage sein, zu prüfen, die aktuelle Kachel (Gegner, items, Typ). Es muss ein Weg, zu wissen, wie es sich bewegen kann (z.B. gibt es eine Wand auf der rechten Seite?)
Dadurch erhalten Sie eine Oberfläche für Ihre Karte: Dienstleistungen, die er erbringt für andere Objekte im Spiel. Wenn Sie eine Idee haben, was das interface muss zu geben, das sollte Ihnen eine Idee geben, wie die Umsetzung der Karte (die Datenstruktur).
Als für die Erstellung einer Karte, verwenden einen Zufallszahlengenerator, sowie einige "common sense". Haben Sie einen Blick auf die angrenzenden Fliesen: Wenn Sie alle Stadt, diese Fliese ist wahrscheinlich die Stadt, zu. Selbe für Ebenen. Die Hügel sind einzigartige Elemente, und Sie sind am wenigsten Häufig.
Diesen code ausführen, drucken Sie die Karte als ASCII - ("C"E","P" gelegen, "H"ill), um zu sehen, ob es funktioniert.
Generieren einer Karte, wie dies ohne die Verwendung einer matrix, empfehle ich, beginnend mit einem center-Fliesen und füllen Sie die Karte nach außen durch die Verwendung modifizierter breadth first search-Algorithmus. Zuerst von allen, müssen wir etwas ein wenig besser als eine Liste der angrenzenden Fliesen. Man könnte einfach vier Variablen, eine für jede Richtung, in der der nächste Fliese, die als solche:
Sagen, wir beginnen mit der Mitte-die meisten Ziegel. Alles, was Sie jetzt tun müssen, ist herauszufinden, wie viele der Richtungen null sind, und erstellen Sie eine neue Tablellone Objekt für jede Richtung, machen Sie sicher, dass Sie die einzelnen Variablen in das aktuelle Objekt, und legen Sie die entsprechenden gegenüberliegenden variable in der das Objekt erstellt.
Sobald Sie gefüllt haben aus allen Richtungen auf dieses Plättchen, dann wählst du eine der anderen Kacheln aus, die Sie erstellt haben, und führen Sie den gleichen Vorgang. Dies ist, wo die Breite-zuerst-Suche-Algorithmus kommt. Sie können eine Warteschlange zu gehen, durch jede Fliese, die Sie erstellt haben, und füllen Sie die weiteren Anweisungen. Um den Algorithmus zu stoppen, setzt man einfach ein limit auf die Anzahl der Fliesen, die Sie erstellen möchten, und verwenden Sie einen Zähler, um zu verfolgen, wie viele erstellt wurden.
Hinweis: Dieser Algorithmus, wie es steht, erstellen Sie eine rautenförmige Karte, wenn Sie wollen, ein Quadrat, würden Sie brauchen, um eine variable für jede Diagonale Richtung als gut.
Natürlich, wenn das scheint ein wenig komplizierter, als Sie möchten, würde ich empfehlen, sich ein Koordinatensystem.
Den Wänden, baggs und-Gebiete sind spezielle Container, die halten alle Wände, baggs und Bereichen des Spiels.
Dies ist die Ebene des Spiels. Außer für den Raum, es sind fünf Zeichen. Die Raute (#) steht für eine Wand. Der dollar ($) repräsentiert das Feld zu bewegen. Der Punkt (.) Charakter repräsentiert den Ort, wo müssen wir das Feld verschieben. Das at-Zeichen (@) ist das sokoban. Und schließlich das neue-Zeile-Zeichen (\n) startet eine neue Reihe der Welt.
Ist-Geschwindigkeit oder Speicher-eine große Sorge für dieses Projekt? Wenn nicht, warum gehst du nicht mit einem 2d array?
Etwas wie
Von hier aus ist es einfach zu konzipieren, gerade vorzustellen, wie eine excel-Tabelle, wo jede Zelle eine Kachel auf der Karte.
Den Weg, den Sie gehen, ist gut, obwohl, nur ein wenig schwer zu konzeptualisieren manchmal. Sie haben eine Liste von benachbarten Fliesen. Also, wenn Sie erstellen Ihre anzeigen Sie beginnen irgendwo, vielleicht oben Links, und gehen von dort aus.
Könnten Sie verschachtelte for-Schleifen verwenden, um die Karte, und um zu bestimmen, die edge-Elemente.
Den Punkt für die Verwendung der Schlaufen und überprüfen Sie die Kanten, ist, dass Sie gehen zu müssen, zu verknüpfen, rückwärts und vorwärts, oben und unten für jede Kachel, außer an den Rändern, wo Sie entweder 2 oder 3 links statt 4.
Den code muss korrekt sein, ist wirklich nicht eine funktionale Anforderung, so ist es schwer genau zu sagen, was richtig ist, ohne zu wissen, mehr über Ihr Spiel/map.
Vorausgesetzt, Sie haben eine Karte, X-Fliesen und keine geordnete Nachbarschaft eine nicht-Matrix-Lösung ist am besten, eine gemeinsame Lösung zu einfach-Modell ist es wie ein graph mit entweder Nähe-Liste für nicht-symmetrische Nachbarschaft oder Inzidenz Liste für die symmetrische Nähe. Wenn youre mit einer Inzidenz Liste, die Sie müssen ein edge-Objekt, das die Ecken enthalten, die Kante verbindet, wenn Sie über angrenzens Liste ein multimap "cool" sein könnte, zu verwenden.
Wenn Sie möchten, eine nicht-Matrix-Lösung mit bestellten Nähe AlbertoPL hat die Lösung dafür.
Vorausgesetzt, Sie haben eine Karte, das ist X Fliesen breit und Y Kacheln groß und die Fliesen, die neben einander benachbart sind, so dass jede Fliese ist bei max 4 min 2 benachbarte Kacheln, Sie könnte verwenden Sie eine matrix, um den Zugriff auf die Fliesen und stellen auch angrenzens von Matrix-Nähe. Die Idee ist, dass map[Y][X] neben anzeigen[Y+1][X] und map[Y][X+1] und Umgekehrt.
Diese Lösung könnte auch passen max 6 und min 3 Kachel Nähe, wenn Kachel [Y+1][X+1] benachbart zur Kachel - [Y][X].
Vorteil dieser ist, dass Sie können leicht analysieren die Karte, und da hat es 2 Dimensionen seiner natürlichen Modell, wie diese.
Nachteil ist, dass sobald ein Stein gesetzt, Sie können nicht ändern seine Nähe ohne Veränderung der matrix. Wie das ist nicht, was Sie professor vorgeschlagen, die Sie vielleicht nicht wollen, es zu tun, aber wenn Sie haben die (statische) bestellt Nachbarschaft das könnte einfachste Weg, es zu tun.
Ich es geschafft, dies durch den Einsatz des angrenzens Listen.
Jeder Zelle wird eine ArrayList mit den Indizes der benachbarten Zellen. Diese Indizes sind diejenigen, die die besagte Zelle in der Karte ArrayList Zellen.
http://en.wikipedia.org/wiki/Adjacency_list
Wenn es ein Kachel-basierte Karte, dann jedes Zimmer hat eine Feste Beziehung mit dem angrenzenden Zimmer. Sie dürfen nicht brauchen, um über co-Ordinaten (obwohl es vielleicht einfacher sein, wenn die Kacheln quadratisch sind), aber Sie brauchen, um über Richtungen.
Wenn die Fliesen sind quadratisch, Himmelsrichtungen (n, s, e, w) kann alles, was Sie brauchen, zu kümmern. Wenn Sie hex-Fliesen, können Sie die Anzahl Ihrer Ausgänge 1-6 (vielleicht mit static final-Konstanten). Dann jedes benachbarte Fliesen verbunden sein können, um dieses zusammen mit dessen verlassen.
Wie gesagt von Aaron, müssen Sie zunächst entscheiden, wie das maping koordiniert werden.
Aber Sie sind nicht beschränkt durch eine X-Y-Z-Koordinatensystem. Zum Beispiel, jede Kachel könnte mit jedem anderen Fliese auf Ihrer Karte. Es hängt alles davon ab, wie Sie es bauen wollen.
Ihnen sagen, dass Sie ' re Gebäude ein RPG-Spiel, dann müssen Sie einen guten Blick auf das Gelände umgeben Sie Ihren Charakter. Ist es multi-level? Wie wirkt sich der Charakter bewegt sich von einer Kachel in die andere? Ist die Bewegung eine Möglichkeit?
Gibt es buchstäblich Dutzende von Frage, bei der Gestaltung einer Karte für ein Spiel.
Müssen Sie planen, es sehr gut, den ersten, bevor Sie Programmieren.