2017-01-27 5 views
0

Ich versuche, C++ zu lernen, also entschuldige ich mich, wenn mein Code chaotisch oder ineffizient ist.Kann nicht herausfinden, warum dem Vektor falsche Werte zugewiesen werden?

Ich habe versucht, Vektoren zu lernen, und ich versuche, eine "Karte" in einem zu speichern. Bis jetzt kann ich den Vektor generieren, aber ich habe Probleme mit der Zuweisung von Werten. Dies ist die Funktion, die ich eingerichtet haben, um Werte zu meiner „Karte“ Vektor zuordnen:

void generateMap(mapSize size, vector<vector<vector<int>>>& map) { 
int xSize, ySize; 
//Resize Vector Based on Map Size Choice 
if (size == tiny) { xSize = 10; ySize = 10; } 
if (size == medium) { xSize = 30; ySize = 30; } 
if (size == large) { xSize = 50; ySize = 50; } 
map.resize(xSize, vector<vector<int>>(ySize, vector<int>(2))); 
//Generate Map 
for (int x = 0; x < xSize; x++) { 
    for (int y = 0; y < ySize; y++) { 
     if (x == 0 || x == xSize) map[x][y][0] = wallTile; 
     else if (y == 0 || y == ySize) map[x][y][0] = wallTile; 
     else map[x][y][0] = tileType::floorTile; 
    } 
} } 

Mit dem Vektor „Karte“ definiert in Haupt als:

vector<vector<vector<int>>> map; 

Und meinen „MAPSIZE“ und Fliesen Aufzählungen als solche definiert:

enum tileType { emptyTile, floorTile, wallTile }; 
enum mapSize { tiny, medium, large }; //10x10, 30x30, 50x50 tiles, respectively 

(In meinem Kopf, der Vektor hält x- und y-Koordinaten auf eine „Zelle“ und jede „Zelle“ (nicht sicher, was sie tatsächlich aufgerufen) zwei Einträge, tileType , und Anwesenheit eines Monsters/einer Falle/etwas el se) Um zu testen, habe ich versucht, in Haupt als solche die „Karte“ angezeigt werden:

for (int y = 0; y < ySize; y++) { 
    for (int x = 0; x < xSize; x++) { 
     cout << map[x][y][0]; 
    } 
    cout << endl; 
} 

Nun, was ich erwartet hatte eine Box, mit der Außenseite 4 „Wänden“ wird produziert wurde, das aus wallTiles (oder in diesem Fall 2s), und das Innere mit floorTiles (1s) gefüllt. Was tatsächlich angezeigt wurde, ist jedoch, dass die oberen und linken Wände aus 2s bestehen und der Rest aus 1s besteht. Ich bin mir nicht ganz sicher, was schief läuft, denn für mich hätten die if-Anweisungen dafür gesorgt. Ich ging auch mit dem Debug-Modus durch und beobachtete, wie sich die Werte änderten, und ich kann immer noch nicht herausfinden, wo es die falschen "Kacheln" auf 1s setzt. Es könnte auch sein, dass ich dem Vektor falsche Werte zuweiße; Ich bin gerade von der C++ - Referenz und von hier ausgegangen.

An diesem Punkt brauche ich nur einen anderen Satz (erfahrener) Augen. Danke!

(Dies ist der vollständige Code, wenn es hilft: http://pastebin.com/i2mwEm0M)

+1

Sie sollten versuchen, das Problem ein wenig weiter einzugrenzen. –

+0

Mit ein paar Zeilenumbrüchen, um den Code lesbar zu machen, tut es nicht weh ... –

+0

Es ist keine gute Idee, 'map' als den Namen Ihres' vector' von 'vector's zu verwenden , weil es mit "std :: map" container verwechselt werden könnte – Rama

Antwort

0

Ihre for Schleifen geschrieben als:

for (int x = 0; x < xSize; x++) 

Doch wenn Sie sich entscheiden, was eine Wand schreiben Sie:

if (x == 0 || x == xSize) map[x][y][0] = wallTile; 

x wird nie xSize sein, höchstens wird es xSize - 1 sein.

+0

Wow. Ja, das war es. Ich dachte, ich hätte das schon einmal ausprobiert, aber ich merke, dass es ein anderes Problem gab, das die Änderung irrelevant machte. Überprüfen, überprüfen und erneut prüfen, nehme ich an. Danke und danke für die schnelle Antwort! – Jtpetch

Verwandte Themen