1

我还是新手,所以如果我为我的问题提供太多或不够的信息,我提前道歉。


破败不堪

这个问题不是与流氓游戏相关的问题,但对于我的程序所做的一些背景知识..类似于流氓游戏。

好的,所以我有一个具有成员 2D 字符向量的类(这些字符被操纵以表示“地牢”)。一切都无缝地工作。我想扩展我的程序可以做的事情,所以我决定创建一个新类来替换 chars 的 2D 向量,以便 char 只是新类的视觉表示,其他变量可以与该 char 一起存储。

为了简单起见,我试图删除这个问题不需要的内容。这个新类称为Tile - 表示用于地牢关卡的空间。瓷砖有:

  • 一个名为 displayChar.. 的 char 变量默认为 ' ' 更改以表示它包含的内容

  • (其他变量..)


问题/我可怜的猜测

我不是最擅长完全理解编程语法/实现的一些概念,所以请不要判断。

  • 我填充字符向量的方式,我将其调整为游戏板的宽度,并将所有内容设置为'',因为所有值都是字符
  • 我想我需要用新的 Tile 对象填充它并将它们推送到 2D Tile 矢量?

  • 我操纵 char 值的其他方法正在出错。

  • 我想我应该更改方法以获取指向Tile 对象的指针并使用setDisplayChar(' ')方法来更改其值?

  • 我的 at(int, int) 方法用于返回该位置的字符

  • 我以为我可以将其更改为“返回 m_vvTiles[y][x].getDisplayChar()”,但出现错误

我不擅长改变某些东西的工作方式,而且我通常最终会把我的代码弄得一团糟。我将发布与此相关的代码。我非常感谢您提供的任何帮助。如果我需要添加更多内容,请告诉我。(我会尽量将代码最小化为仅相关的方法)。谢谢!


地牢等级.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

};

地牢关卡.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
}

瓷砖.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 TIME


private:
    char displayChar;
    //Entity * theEntity; IRRELEVANT AT THIS TIME
};

瓷砖.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;
}

*继承人我现有的错误:*

对于 DungeonLevel.cpp 中的方法 dump(),

4

1 回答 1

1

你的一些问题与我的回答

我想我需要用新的 Tile 对象填充它并将它们推送到 2D Tile 矢量?

不,您需要调整它的大小并用 Tile 对象填充它。就像你在它是一个 char 数组时所做的一样。新的没有进入它。

我想我应该更改方法以获取指向 Tile 对象的指针并使用 setDisplayChar(' ') 方法来更改其值?

我会使用参考。

我以为我可以将其更改为,return m_vvTiles[y][x].getDisplayChar()但出现错误。

这听起来对我来说,你得到了什么错误?

关于你重新设计的一切听起来对我来说很有动力。但是,在进行重大重组之前进行备份是个好主意。

于 2013-04-08T21:23:54.830 回答