PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : vector klasse für spielfeld



Brujah
10-10-2006, 23:27
Hallo Leute,

ich verwende die vector klasse für das Spielfeld meines Spiels.
Es ist so definiert:

vector < vector<int> > labyrinth_level(200, vector<int>(200));

Damit kann ich also nur Integer speichern.
Ich möchte aber gerne beliebig viele Objekte pro Feld ablegen können.
Dazu müsste ich also einen Zeiger auf einen dynamischen array pro feld haben. Und jedes Feld dieses arrays muss seinerseits wieder auf eine Instanz zeigen.

Ich bin noch neu in C++ und damit überfordert!
Könnte mir hier jemand einen Tip geben wie man sowas realisiert?

peschmae
11-10-2006, 07:55
Also du meinst einen dreidimensionalen Vektor quasi? Da musst du eigentlich nur weiterfahren wie du angefangen hast.

Falls es nicht all zu viele Objekte gibt insgesamt wärs aber eventuell effiziennter und einfacher einfach alle Objekte in einer Liste (seis ein Vektor oder eine Map oder so) zu speichern, mit den jeweiligen Koordinaten.

MfG Peschmä

Brujah
11-10-2006, 10:14
Ich denke mein Problem ist das ich die Syntax dieses vectors schon nicht verstehe. Ist das abgefahrenste was ich bisher gesehen habe (verglichen mit anderen Programmiersprachen die ich kenne).
Die ganzen Pfeile in unterschiedliche Richtungen verwirren mich...

Wenn ich jetzt erstmal 150 Level des oben definierten feldes haben möchte, wie definiere ich dieses in C++?

anda_skoa
11-10-2006, 10:56
Wenn du in einem Feld mehrere Sachen ablegen willst, ist es in erster Näherung schon mal eine gute Idee, eine Klasse für so ein Feld zu implementieren.

Wenn du dann ein Spielfeld mit einer zweidimensionalen Anordnung solcher Felder hast, kannst du in jedem Feld unabhängig von der Anordnung arbeiten.

Wenn die Sache mit den Containertemplates anfangs noch ein bischen ungewohnt ist, kann es helfen, sich mit typedef daraus eigene Typen zu definieren und diese dann zu verwenden, zB:


typedef vector<int> IntArray;
typedef vector<IntArray> IntMatrix;


Ciao,
_

Brujah
11-10-2006, 11:22
Ich glaube ich bin zu blöd.
Ich weiss nicht was ich mit den Typedef's machen soll.

Vielleicht nehme ich doch lieber ein
int labyrinth[200][200];

Das verstehe ich wenigstens...

Mein momentaner Sourcecode liegt hier:
http://www.lostlabyrinth.com/new_lostlabyrinth.tar.gz

Ist noch winzig, weil ich einfach mit ALLEM Probleme habe.

Joghurt
11-10-2006, 11:31
Bei "vector<int> L" ist L eine Liste von Integern. z.B. [1,2,3,4,5,6]
Bei "vector<vector<int> > L" ist L eine Liste von Listen von Integern [ [1,2,3,4,5,6] , [7,8,9] , [1,5,4] , [1,6] ]
Wie du siehst, muss nicht jede Liste gleich viele Elemente enthalten, da der "äußere" Vector nur beliebige Listen von Integern zusammenfasst.

Wenn du nun (im obigen Beispiel) L[2] schreibst, bekommst du [1,5,4] zurück, das ist ja das dritte Element. Da dies auch eine Liste ist, kannst du ebenfalls indizieren, z.B. käme bei L[2][1] eine 5 heraus.

Nichts anderes machst du bei "int L[200][200]". L ist eine Liste von 200 Listen von 200 Integern. Der einzige Unterschied ist, dass jede Liste wirklich genau 200 Elemente enthält. L[60][20] sucht sich nun die 61. Liste und davon das 21. Element raus.

vector<vector<vector<int> > > is nun eine Liste von Listen von Listen. etc pp.

Für deine Anwendung macht ein normales Array aber wahrscheinlich mehr Sinn, da du ja wirklich jedes Feld beschrieben willst. Vectoren nutzt man, wenn man eine Liste von irgendwas haben will, von dem man nicht weiss oder wissen will, wieviele Elemente da nun reinkommen.

Brujah
11-10-2006, 12:07
Okay, werde das Spielfeld wieder zu einem Array machen. Und dann den Gegenständen und Monstern x,y Koordinaten und Level als Attribute geben.
Sollte das Problem genauso erschlagen.

7.e.Q
16-10-2006, 14:52
Mir stieß die Sache mit den Pfeilen auf.

< und > sind in diesem Fall keine Pfeile, wie sie zum Beispiel beim Zugriff auf Member einer Instanz über einen Zeiger verwendet werden (->), sondern einfach nur ein fester Bestandteil der Deklaration einer Instanz einer Template-Klasse.

Bevor du dich an ein Spiel wagst, solltest du dich allgemein mehr mit solch grundlegenden C++ Eigenheiten vertraut machen.

Brujah
17-10-2006, 11:54
Wir kommen ganz gut voran. Haben das Spielfeld jetzt zu einem dreidimenionalen Array gemacht. Templates werden wir einfach nicht benutzen.