C++ を使用して、再帰的に六角形のグリッドを作成しています (乗算リンク リスト スタイルを使用)。隣接するタイルを簡単に作成できるように設定しましたが、再帰的に行っているため、特定のタイルに対して 6 つの隣接タイルすべてを実際に作成することしかできません。明らかに、これにより重複したタイルが作成されており、何らかの方法でそれらを取り除こうとしています. クラスを使用しているため、null ポインターのチェックが機能していないようです。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)」にするか、何をするにしても、適切に処理されません。ああ、リストを完全に設定していないことも承知しています。今は一方向だけです。