Frage

ich versuche, ein RPG-Spiel für ein Projekt zu vervollständigen, habe aber keine Ahnung, wie man das Spiel Karte zu machen. Es braucht keine grafische zu sein, aber der Code für die gesamte Karte und jede Kachel muss korrekt sein.

Bisher dachte ich über eine nicht-matrix Karte machen (als Antrag des Professors) durch eine Arraylist verwendet, die alle verknüpften Kacheln enthalten.

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 drei Klassen hat, die sie erweitert). Ich habe noch keine Ahnung, wie man zusammen stellen und eine Karte erzeugen.

Vielen Dank für Ihre Zeit.

War es hilfreich?

Lösung 6

ich es geschafft, diese durch Adjazenzlisten verwenden. Jede Zelle wird eine Arraylist haben die Indizes der benachbarten Zellen enthält. Diese Indizes sind die, dass die Zelle in der Karte Arraylist mit Zellen haben.

http://en.wikipedia.org/wiki/Adjacency_list

Andere Tipps

Sie nicht mit der Umsetzung beginnen, beginnen Sie mit, wie Sie die Karte nutzen möchten. Das gibt Ihnen einige Einschränkungen, wie sie umzusetzen. Zum Beispiel:

Wenn die Karte zeichnen, wie greifen Sie es? Durch koordinieren? Oder von "go west von Kachel X"?

[EDIT] Ich schlage vor, mit der Hauptschleife des RPG-Spiel zu starten. Sie müssen den Charakter platzieren / Token irgendwo (das heißt es irgendeine Art von Beziehung zu einer Kachel benötigt).

Dann müssen Sie den Charakter bewegen. Ein Charakter muss in der Lage sein, die aktuelle Kachel zu untersuchen (Gegner, Gegenstände, Typ). Es muss einen Weg wissen, wie sie sich bewegen kann (das heißt es gibt eine Wand rechts?)

Das gibt Ihnen eine Schnittstelle für die Karte: Dienstleistungen, die es auch für andere Objekte im Spiel macht. Wenn Sie eine Vorstellung davon haben, was die Schnittstelle bereitstellen muss, das sollte Ihnen eine Idee geben, wie die Karte zu implementieren (die Datenstruktur).

Wie für eine Karte zu erzeugen, verwenden Sie einen Zufallszahlengenerator sowie einige „gesunden Menschenverstand“. Werfen Sie einen Blick auf die benachbarten Fliesen: Als sie alle Stadt sind, diese Fliese wahrscheinlich Stadt ist, auch. Das Gleiche gilt für Ebene. Hills sind getrennte Elemente, und sie sind am wenigsten häufig.

diesen Code ausführen, drucken Sie die Karte als ASCII ( "C" ity, "P" gelegen, "H" krank), um zu sehen, ob es funktioniert.

Um eine Karte wie diese zu erzeugen, ohne eine Matrix zu verwenden, empfehle ich mit einem Mittel Kachel beginnen und dann die Karte nach außen Bevölkern durch einen modifizierte Breitensuche-Algorithmus. Zunächst einmal werden wir etwas ein wenig besser als eine Liste von benachbarten Fliesen müssen. Sie könnten einfach vier Variablen, eine für jede Richtung, die die nächste Kachel speichert, wie zum Beispiel:

private Tabellone up = null;
private Tabellone down = null;
private Tabellone left = null;
private Tabellone right = null;

Sagen wir mit der Mitte-die meisten Fliesen beginnen. Alles, was Sie jetzt tun müssen, ist herauszufinden, wie viele der Richtungen null sind, und für jede Richtung ein neues Tablellone-Objekt erstellen, um sicherzustellen, jede der Variablen in diesem aktuellen Objekt zu setzen und die entsprechende entgegengesetzte Variable in dem Objekt setzen erstellt .

Tabellone adj = new Tabellone();
up = adj;
adj.setDown(this);

Wenn Sie ausgefüllt haben auf diese Fliese alle Richtungen aus, Sie dann wählen Sie eine der anderen Fliesen, die Sie erstellt haben und den gleichen Vorgang. Hier wird die Breitensuche Algorithmus kommt in. Sie eine Warteschlange durch jede Fliese gehen verwenden können, die Sie erstellt haben und die Anweisungen ausfüllen. Um den Algorithmus Stopp zu machen, einfach eine Obergrenze für die Anzahl der Kacheln einstellen Sie erstellen möchten und einen Zähler zu verwenden, um zu verfolgen, wie viele erstellt wurde.

int count = 0;
ArrayList<Tabellone> queue = new ArrayList<Tabellone>()
queue.add(/*center tile*/);
while (count < 100) { //if we want 100 tiles
  //take out the center tile from the beginning of the array list, create a tile for each direction and add those tiles to the array list, then increment count by 1.
}

. Hinweis: Dieser Algorithmus, da es eine rautenförmige Karte wird schaffen steht, wenn Sie einen Platz wollen, dann würden Sie auch eine Variable für jede diagonale Richtung haben müssen

Natürlich, wenn dies ein wenig komplizierter scheint als Sie möchten, würde ich ein Koordinatensystem empfehlen.

Die Wände, Buggies und Bereiche sind spezielle Behälter, die alle Wände, Buggies und Bereiche des Spiels halten.

private String level =
          "    ######\n"
        + "    ##   #\n"
        + "    ##$  #\n"
        + "  ####  $##\n"
        + "  ##  $ $ #\n"
        + "#### # ## #   ######\n"
        + "##   # ## #####  ..#\n"
        + "## $  $          ..#\n"
        + "###### ### #@##  ..#\n"
        + "    ##     #########\n"
        + "    ########\n";

Dies ist die Ebene des Spiels. Mit Ausnahme des Raumes gibt es fünf Zeichen. Die Raute (#) steht für eine Wand. Der Dollar ($) steht für die Box zu bewegen. Der Punkt (.) Zeichen repräsentiert den Ort, an dem wir die Box bewegen müssen. Das an Zeichen (@) ist die Sokoban. Und schließlich die 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 Sie nicht über einen 2D-Array verwenden?

So etwas wie

Casella map [][] = new Casella[xSize][ySize];

Von hier aus ist es leicht zu konzeptionieren, stellte es einfach als eine Excel-Tabelle, wobei jede Zelle eine Kachel auf der Karte ist.

Die Art und Weise Sie gehen ist zwar in Ordnung, nur manchmal ein wenig schwer zu konzipieren. Sie haben eine Liste von benachbarten Fliesen. Also, wenn Sie Ihre Karte Erstellen Sie irgendwo beginnen, möglicherweise oben links, und gehen von dort aus.

Sie könnten verschachtelt verwenden für Schleifen, um die Karte einzurichten und zu helfen, die Ränder Elemente zu bestimmen.

for(int i = 0; i < XSIZE ; ++i)
    for(int j = 0; j < YSIZE ; ++j)
        if(j==0) //found left edge (i.e. no adjacent ones to the left)
        if(j==(YSIZE)) //found right edge (you get the picture) 

Der Punkt, um die Schleifen zu verwenden, und die Kanten überprüfen, ist, dass Sie für jede Kachel verbinden rückwärts und vorwärts, nach oben und unten gehen zu müssen, außer an den Rand, wo man entweder 2 oder 3 Links haben wird statt 4.

Der Code muss korrekt wirklich sein ist keine funktionale Anforderung, so ist es schwer, genau zu sagen, was ohne mehr über Ihr Spiel / Karte zu wissen, korrekt ist.

Angenommen, Sie eine Karte, die X-Fliesen und keine geordnete adjacency hat eine nicht-matrix Lösung ist am besten, eine gemeinsame Lösung ist es einfach wie ein Diagramm-Modell entweder Adjazenzliste für nicht-symmetrische adjacency oder Häufigkeit Liste für symmetrische adjacency . Wenn youre eine Inzidenz Liste verwenden, müssen Sie eine Kante Objekt, das die Eckpunkte der Kante enthalten ist, verbindet, wenn youre Adjazenzliste mit a multimap könnte cool sein zu verwenden.

Wenn Sie eine nicht-matrix Lösung mit geordneten adjacency wollen AlbertoPL hat die Lösung dafür.

Angenommen, Sie haben eine Karte das ist X Fliesen breit und Y Fliesen hoch und die Fliesen, die nebeneinander liegen benachbart sind, so dass jede Platte bei max 4 hat und mindestens 2 benachbarte Kacheln Sie eine Matrix verwenden, könnten die Fliesen für den Zugriff auf und auch adjacency von matrix adjacency darstellen. Die Idee ist, dass map [Y] [X] benachbart zu kartieren [Y + 1] [X] und Map [Y] [X + 1], und umgekehrt. Diese Lösung könnte fit 6 und max min 3 tile adjacency auch wenn Fliese [Y + 1] [X + 1] ist neben tile [Y] [X]. Upside dabei ist, dass Sie die Karte leicht analysieren können, und da es zwei Dimensionen hat sein natürliches es so zu modellieren. Nachteil ist, dass, sobald eine Kachel gesetzt ist, wird seine adjacency ohne Änderung der Matrix nicht ändern können. Da dies nicht ist, was Sie Professor vorgeschlagen, dass Sie es nicht tun mögen, aber wenn man (statisch) hat bestellt adjacency könnte dies einfachste Weg, es zu tun.

Wenn es sich um eine Kachel-basierte Karte ist, dann hat jedes Zimmer eine feste Beziehung mit seinen angrenzenden Räumen. Sie können nicht über Koordinaten kümmern müssen (obwohl es einfacher sein könnte, wenn die Fliesen quadratisch sind), aber Sie werden über Richtungen kümmern.

Wenn die Fliesen sind quadratisch, Himmelsrichtungen (n, s, e, w) kann alles, was Sie brauchen, um kümmern uns um. Wenn sie hex Fliesen sind, können Sie Ihre Ausgänge 1-6 (vielleicht mit static final Konstanten) nummerieren. Dann wird jede benachbarte Platte auf dies kann man zusammen mit seinem Ausgang verbunden werden.

Wie gesagt von Aaron , müssen Sie zunächst entscheiden, wie die maping Koordinaten sein wird.

Aber Sie werden nicht von einem X-Y-Z-Koordinatensystem eingeschränkt. Zum Beispiel könnte jede Fliese zu jeder anderen Kachel auf der Karte verknüpft werden. Es hängt alles davon ab, wie Sie wollen, es zu bauen.

Sie sagen, dass Sie ein RPG Spiel Gebäude sind, dann brauchen Sie einen guten Blick auf das Gelände haben umgeben Ihr Charakter. Ist es Multi-Level? Wie wirkt sich die Zeichen aus einer Fliese zu einem anderen verschieben? Ist die Bewegung einen Weg?

Es gibt buchstäblich Dutzende von Fragen gestellt werden, wenn eine Karte für ein Spiel zu entwerfen.

Sie müssen sie planen sehr gut zuerst, vor dem Start Codierung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top