Как я могу преобразовать из класса с 2D вектором символов в 2D вектор другого объекта с переменной типа char?

Я все еще новичок в этом, поэтому заранее приношу свои извинения, если я предоставлю слишком много или недостаточно информации для своей проблемы.


Run Down

Этот вопрос не похож на мошеннический вопрос, связанный с игрой, но для понимания того, что делает моя программа … он должен быть похож на мошенническую игру.

Итак, у меня был класс, который имел двухмерный вектор-член (символами манипулировали, чтобы представить «подземелье»). Все работало без проблем. Я хотел расширить возможности моей программы, поэтому я решил создать новый класс для замены 2D-вектора символов, чтобы символ представлял собой лишь визуальное представление нового класса, а другие переменные можно хранить вместе с этим символом.

Для упрощения я попытался удалить то, что не нужно для этого вопроса. Этот новый класс называется Плитка — который представляет пространство, используемое для уровня подземелья. Плитка имеет:

  • переменная char с именем displayChar .. по умолчанию равна » изменениям для представления того, что она содержит

  • (другие переменные ..)


Проблемы / Мои плохие догадки

Я не совсем понимаю некоторые концепции программирования синтаксиса / реализации, поэтому, пожалуйста, не судите.

  • Как я заполнил вектор символов, я изменил его размер до ширины игрового поля и установил все в », так как все значения были символами
  • Я думаю, что мне нужно заполнить его новыми объектами Tile и отправить их в
    2D плитка вектор?

  • Мои другие методы, которые манипулировали значениями char, дают ошибки.

  • Я думаю, что я должен изменить методы, чтобы взять указатель на Плитка
    возражать и использовать setDisplayChar (») способ изменить его
    значение?

  • Мой метод at (int, int), используемый для возврата символа в этом месте

  • Я думал, что могу изменить его на «return m_vvTiles [y] [x] .getDisplayChar ()», но я получаю ошибку

Я плохо изменяю то, как что-то работает, и я обычно заканчиваю вносить беспорядок в свой код. Я выложу код, который имеет отношение к этому. Я был бы очень признателен за любую помощь, которую вы можете предложить. И, пожалуйста, дайте мне знать, если мне нужно добавить больше. (Я постараюсь свести код к минимуму только для связанных методов). Спасибо!


DungeonLevel.h

#include "Tile.h"#include <vector>
#include <random>

class DungeonLevel {
public:
DungeonLevel(int iWidth, int iHeight, std::mt19937 & mt);
~DungeonLevel(void);

void dump();
char at(int x, int y);

int getWidth();
int getHeight();

private:
std::vector<std::vector<Tile>> m_vvTiles; //Tile was char

};

DungeonLevel.cpp

#include <iostream>
#include <random>
#include "DungeonLevel.h"
using namespace std;DungeonLevel::DungeonLevel(int iWidth, int iHeight, std::mt19937 & mt){
// Initialize the blank vector
m_vvTiles.resize(iHeight);

for(auto it = m_vvTiles.begin(); it != m_vvTiles.end(); it++ ){
//      Tile tempTile = new;?
(*it).resize(iWidth,' ');
}

// divide the level into 4x2 chunks
int iChunkWidth = iWidth / 4;
int iChunkHeight = iHeight / 2;

// Taking the easy way out, and generating
// a loop of tunnels first to drop rooms on to
for( int x = (iChunkWidth/2); x <= ((3 * iChunkWidth) + (iChunkWidth/2)$
m_vvTiles[iChunkHeight/2][x] = '#';
m_vvTiles[iChunkHeight + (iChunkHeight/2)][x] = '#';
}

for( int y = (iChunkHeight/2); y <= (iChunkHeight + (iChunkHeight/2)); $
m_vvTiles[y][iChunkWidth/2] = '#';
m_vvTiles[y][(3 * iChunkWidth) + (iChunkWidth/2)] = '#';
}

void DungeonLevel::dump(){
for( auto itOuter = m_vvTiles.begin(); itOuter != m_vvTiles.end(); itOu$
for( auto itInner = (*itOuter).begin(); itInner != (*itOuter).e$
cout << *itInner.getDisplayChar(); ///Updated:: CAUSING ERROR//
}

cout << endl;
}
}//SEVERAL IRRELEVANT LINES FOR THIS PROBLEM..

}

char DungeonLevel::at(int x, int y){
return m_vvTiles[y][x].getDisplayChar();
//return m_vvTiles[y][x]; WORKED BEFORE
}

Tile.h

#include "Entity.h"#include <vector>

class Tile : public Entity {
public:
Tile(void);
virtual ~Tile(void);
//void setEntity(Entity * entityToSet); BOTH IRRELEVANT
//Entity * getEntity();
void setDisplayChar(char displayCharToSet);
char getDisplayChar();
//virtual void dumpObjectData(); IRRELEVANT AT THIS TIMEprivate:
char displayChar;
//Entity * theEntity; IRRELEVANT AT THIS TIME
};

Tile.cpp

#include "Tile.h"#include "Entity.h"
using namespace std;

Tile::Tile(void){
displayChar = '.';
//theEntity = NULL;
}Tile::~Tile(void){

}

void Tile::setDisplayChar(char displayCharToSet){
displayChar = displayCharToSet;
}

char Tile::getDisplayChar(){
return displayChar;
}

*Вот моя существующая ошибка: *

Для метода dump () в DungeonLevel.cpp,

1

Решение

Некоторые из твоих вопросов с моими ответами

Я думаю, что мне нужно заполнить его новыми объектами плитки и перенести их в вектор 2D плитки?

Нет, вам нужно изменить его размер и заполнить объектами Tile. Совсем как вы сделали, когда это был массив символов. новое не входит в это.

Я думаю, что я должен изменить методы, чтобы взять указатель на объект Tile и использовать метод setDisplayChar (»), чтобы изменить его значение?

Я бы использовал ссылку.

Я думал, что мог бы изменить это на return m_vvTiles[y][x].getDisplayChar() но я получаю ошибку.

Это звучит правильно для меня, какую ошибку вы получили?

Все в твоем редизайне звучит хорошо для меня. Хорошая идея сделать резервную копию, прежде чем идти на серьезную реорганизацию, однако.

1

Другие решения

Других решений пока нет …