私は数人の友人とダンジョン ゲームに取り組んでおり、経路探索に取り組んでいます。ゲームはタイルベースで、実装を計画している経路探索は次のとおりです。
クラス PathMapper は、指定されたタイルからすべてのタイルまでの距離のグリッドを生成します
クラス モンスターは、このグリッドを使用して、特定のタイルに向かって移動します (現在、常にプレイヤーです)。
4 人のプレーヤーを計画していますが、スクリプトで動的な数をサポートしたいと考えています。各プレイヤーは整数形式の ID を持っています。
各プレイヤーには PathMapper によって生成された 1 つのグリッドが必要であり、すべてのモンスターがそれらを共有できます (グリッドの生成と同じくらい遅く、プレイヤーごとに、すべてのモンスターに対して 1 回だけ実行するだけで、経路探索の適切な解決策のように思えます)。
開始タイルからタイルまでの距離のグリッドを生成する「PathMapper」というクラスがあります。理論的には、これらのうちの 4 つが作成されます (各プレイヤーに 1 つ)。敵がプレイヤーに経路探索を行う場合、敵はプレイヤーの ID を要求し、次に経路探索に使用する対応するタイルのグリッドを要求します。サーバーはこれらのグリッドを「createMap(playerID, playerXPosition, playerYPosition)」で更新します。
したがって、各グリッドは、プライベート マップ「pathMap」内のプレーヤーの ID にマップされるベクトルのベクトルであり、モンスターが「getLocalPath()」でアクセスする値です。
問題は、「createMap」は正常にコンパイルされますが、最初の壁をコピーしようとすると (「pathMap[ID][x].push_back(9000);」)、「EXE_BAD_ACCESS」が表示されることです。「9000」を挿入しようとする (そして失敗する) 前に、約 12 回の反復を経ることに注意してくださいID の「正しさ」は、コードのアクセサに影響を与えるべきではありませんよね?
私は少し困惑しています。b/c 私がしていると思うのは、スペースを予約し、それをループし、予約したばかりのメモリにアクセスしようとしていることです。
reserve(20)
for(i=0; i<20; i++)
reserve(20)
for(j=0; j<20; j++)
access(i,j) // error!?
コードは次のとおりです。
class PathMapper{
public:
PathMapper(Dungeon* d);
void createMap(int ID, int x, int y);
// returns values of the surrounding tiles (up, right, down, left)
std::vector<int> getLocalPath(int ID, int x, int y);
private:
Dungeon* dungeon;
std::vector< std::vector<bool> > wallBitmap;
std::map<int, std::vector< std::vector<int> > > pathMap;
}
PathMapper::PathMapper(Dungeon* d) {
dungeon = d;
wallBitmap = dungeon->getWalls(); // bools tell if there is a wall on a tile
}
void PathMapper::createMap(int ID, int x, int y) {
pathMap[ID].reserve(dungeon->width());
for(int x=0; x<dungeon->width(); x++) {
pathMap[ID][x] = std::vector<int>();
pathMap[ID][x].reserve(dungeon->height());
for(int y=0; y<dungeon->height(); y++) {
if(wallBitmap[x][y]) {
pathMap[ID][x].push_back(9000); // error is here
}
else {
pathMap[ID][x][y] = -1;
}
}
}
// code to calculate values here; shouldn't affect the code above
}