使用C++类递归创建链接列表

Jon*_*ant 2 c++ linked-list hexagonal-tiles

我正在使用C++递归地制作一个六边形网格(使用多重链接列表样式).我已经将它设置为轻松创建相邻的图块,但因为我正在递归地执行它,所以我只能为给定的图块创建所有6个邻居.显然,这会导致重复的瓷砖被创建,我试图以某种方式摆脱它们.因为我正在使用类,检查空指针似乎不起作用.它要么无法从我的Tile类转换为int,要么以某种方式转换它但没有正确地执行它.我在创建时明确地将所有指针设置为NULL,当我检查它是否仍然存在时,它表示即使我从未触及它,因为初始化.有没有一种特定的方式我应该这样做?没有某种类型的NULL,我甚至无法遍历网格

这是我的一些相关代码.是的,我知道这很令人尴尬.

Tile类头:

class Tile
{
public:
    Tile(void);
    Tile(char *Filename);
    ~Tile(void);

    void show(void);
    bool LoadGLTextures();
    void makeDisplayList();
    void BindTexture();
    void setFilename(char *newName);

    char Filename[100];
    GLuint texture[2];
    GLuint displayList;
    Tile *neighbor[6];
    float xPos, yPos,zPos;
};`
Run Code Online (Sandbox Code Playgroud)

平铺初始化:

Tile::Tile(void)
{
    xPos=0.0f;
    yPos=0.0f;
    zPos=0.0f;
    glEnable(GL_DEPTH_TEST);
    strcpy(Filename, strcpy(Filename, "Data/BlueTile.bmp"));
    if(!BuildTexture(Filename, texture[0]))
        MessageBox(NULL,"Texture failed to load!","Crap!",MB_OK|MB_ICONASTERISK);

    for(int x=0;x<6;x++)
    {
        neighbor[x]=NULL;
    }
}
Run Code Online (Sandbox Code Playgroud)

创建相邻的瓷砖:

void MakeNeighbors(Tile *InputTile, int stacks)
{
    for(int x=0;x<6;x++)
    {
        InputTile->neighbor[x]=new Tile();
        InputTile->neighbor[x]->xPos=0.0f;
        InputTile->neighbor[x]->yPos=0.0f;
        InputTile->zPos=float(stacks);
    }
    if(stacks)
    {
        for(int x=0;x<6;x++)
            MakeNeighbors(InputTile->neighbor[x],stacks-1);
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,遍历网格:

void TraverseGrid(Tile *inputTile)
{
    Tile *temp;
    for(int x=0;x<6;x++)
        if(inputTile->neighbor[x])
        {
            temp=inputTile->neighbor[x];
            temp->xPos=0.0f;
            TraverseGrid(temp);
            //MessageBox(NULL,"Not Null!","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
        }

}
Run Code Online (Sandbox Code Playgroud)

关键是"if(inputTile-> neighbor [x])"以及我是否"if(inputTile-> neighbor [x] == NULL)"或我做的任何事情,它只是没有正确处理它.哦,我也知道我没有完全设置清单.现在只有一个方向.

Kor*_*icz 10

如果你想创建一个六边形网格,你应该记住它可以使用普通网格轻松模拟!

    __    __    __
\__/2 \__/4 \__/6 \
/1 \__/3 \__/5 \__/
\__/8 \__/10\__/12\
/7 \__/9 \__/11\__/
\__/  \__/  \__/  \
Run Code Online (Sandbox Code Playgroud)

这将使生活更简单:)

因此最简单的方法是

  1. 设置临时方格 m*n
  2. 用瓷砖填充它
  3. 遍历网格并正确连接

现在连接,基于上图:

A) Connect to previous and next [x-1,y], [x+1,y]
B) Connect to row above and row below [x,y-1], [x,y+1]
C) Connect to row above previous and next [x-1,y-1], [x+1,y-1]
Run Code Online (Sandbox Code Playgroud)

...并且你有所有想要的连接(只记得检查边界以决定是否在边缘上) - 如果你以另一种方式拿着瓷砖,你甚至可以删除网格:).