【发布时间】:2010-05-25 01:04:20
【问题描述】:
我正在使用 C++ 递归地制作六边形网格(使用多重链表样式)。我已经将其设置为可以轻松创建相邻的图块,但是因为我是递归地执行此操作,所以我只能为给定的图块真正创建所有 6 个邻居。显然,这会导致创建重复的瓷砖,我正试图以某种方式摆脱它们。因为我正在使用一个类,所以检查空指针似乎不起作用。它要么无法从我的 Tile 类转换为 int,要么以某种方式转换它但没有正确执行。我在创建时明确将所有指针设置为 NULL,当我检查它是否仍然存在时,它说它不是即使我自初始化以来从未接触过它。有没有我应该这样做的特定方式?如果没有某种 NULL,我什至无法遍历网格
这是我的一些相关代码。是的,我知道这很尴尬。
平铺类头:
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;
};`
瓷砖初始化:
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;
}
}
相邻图块的创建:
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);
}
}
最后,遍历网格:
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);
}
}
关键行是“if(inputTile->neighbor[x])”,无论我是“if(inputTile->neighbor[x]==NULL)”还是我做的任何事情,它都不能处理它正确。哦,我也知道我还没有完全设置列表。现在只有一个方向。
【问题讨论】:
-
您还可以指定“未正确处理”的含义。
-
这并不是一个真正适合递归的候选者。如果无法通过某种形式的坐标定位您的邻居,您就没有合理的方法将它们拼接在一起(显然是您遇到的问题)。您可以在创建它们之后将它们缝合在一起(newWestCell.northEastCell = this.northWestCell),但这很快就会变成一个非常麻烦的问题——并且仍然不是递归友好的。
标签: c++ linked-list hexagonal-tiles