void BaseObject::MoveManager::calcShortestPath(const Position& pos, const Position& topos, int mob, BaseObject* obj){ if(mob <= 0) return; Player* me_player = dynamic_cast<Player*>(obj); Enemy* me_enemy = dynamic_cast<Enemy*>(obj); Position checkpos; for(int i = 0; i < DIR_NUM; ++i){ checkpos = pos + dir[i]; if(Stage::isBrightened(checkpos) && (mob-1) >= 0){ //ジャンプ力の足りる位置から移動 int height = abs(Stage::getHeight(checkpos) - Stage::getHeight(pos)); if( (me_player != NULL && me_player->getJumpPow() >= height) || (me_enemy != NULL && me_enemy->getJumpPow() >= height) ){ current_path.push_back(i); if(checkpos == topos){ if(current_path.size() < shortest_path.size()){ shortest_path = current_path; } } calcShortestPath(checkpos, topos, mob-1, obj); current_path.pop_back(); } } } }
bool Graph::dijkstra(Vertex &v) { if(vs->size() < 1) return false; set<int> *S = new set<int>(); S->insert(v.getNodeId()); set<int> *candidate = new set<int>(); obtainCandidate(*S, *candidate); printS(*S); printCandidate(*candidate); vector<vector<int> > *dist = new vector<vector<int> >(); int u = v.getNodeId(); vector<int> *vec = new vector<int>(vs->size()); for(unsigned int i = 0; i < vs->size(); i++) vec->at(i) = INT_MAX; vec->at(retrieveVertexById(u)) = 0; calcShortestPath(vs->at(retrieveVertexById(u)), *vec, *vec); dist->push_back(*vec); printDist(*dist); for(unsigned int i = 0; i < vs->size() -1; i++) { vector<int> *vec = new vector<int>(); bool nextNode = calcShortestPath(vs->at(retrieveVertexById(u)), dist->at(i), *vec); if(false == nextNode) // no neighbour node, finish return true; dist->push_back(*vec); u = selectU(*candidate, *vec); S->insert(u); printS(*S); obtainCandidate(*S, *candidate); printDist(*dist); } return true; }
void BaseObject::MoveManager::trackMovement(const Position& pos, const Position& topos, int mob, BaseObject* obj){ initialize(); calcShortestPath(pos, topos, mob, obj); path = shortest_path; }