void PieceManager::randomMove(PieceID p, Board* b) { pieces[p].displace(b); std::vector<sf::Vector2i> movePossibilities; for(auto it = pieces[p].myType->moveAttackOffsets.begin(); it != pieces[p].myType->moveAttackOffsets.end(); ++it) { sf::Vector2i newPosition = pieces[p].position + *it; if(onMap(newPosition)) movePossibilities.push_back(newPosition); } for(auto it = pieces[p].myType->moveOffsets.begin(); it != pieces[p].myType->moveOffsets.end(); ++it) { sf::Vector2i newPosition = pieces[p].position + *it; if(onMap(newPosition)) movePossibilities.push_back(newPosition); } sf::Vector2i chosenPosition = vectorRandomChoice(movePossibilities,pieces[p].position); killPiece(b->occupants[chosenPosition.x][chosenPosition.y],b); pieces[p].place(b,chosenPosition); }
void MapKnowledge::discover(const Position& i_Pos, const RangeOfSight& i_ROS) { m_LastTile = toSCoord(i_Pos.tileCoord()); m_LastDir = i_Pos.facingDir(); m_LastROS = &i_ROS; SCoord ulCorner(i_ROS.getWindowULCorner(m_LastDir)); SCoord lrCorner(i_ROS.getWindowLRCorner(m_LastDir)); SCoord centered; for ( centered.y = ulCorner.y; centered.y < lrCorner.y; ++centered.y) { for (centered.x = ulCorner.x; centered.x < lrCorner.x; ++centered.x) { Coord onMap(toCoord(m_LastTile + centered)); if (!(onMap < m_Dim)) { continue; } std::vector<bool>::reference curr(operator()(onMap)); curr = curr || i_ROS.isVisible(centered, m_LastDir); } } }
void PieceManager::AIMove(PieceID p, Board* b) { Behaviour* bh = pieces[p].isBlack ? pieces[p].myType->behaviourBlack : pieces[p].myType->behaviourWhite; pieces[p].displace(b); movePossibilities.clear(); //std::vector<std::tuple<int,int,sf::Vector2i> > movePossibilities; for(auto it = pieces[p].myType->moveAttackOffsets.begin(); it != pieces[p].myType->moveAttackOffsets.end(); ++it) { sf::Vector2i newPosition = pieces[p].position + *it; if(onMap(newPosition)) { PieceID pp = b->occupants[newPosition.x][newPosition.y]; if(!nullPiece(pp)) if(pieces[pp].isBlack == pieces[p].isBlack) continue; int value = valuePosition(newPosition,p,b,bh,!nullPiece(pp)); movePossibilities.push_back(std::make_tuple(value,rand(),newPosition)); } } for(auto it = pieces[p].myType->moveOffsets.begin(); it != pieces[p].myType->moveOffsets.end(); ++it) { sf::Vector2i newPosition = pieces[p].position + *it; if(onMap(newPosition)) { if(nullPiece (b->occupants[newPosition.x][newPosition.y])) { int value = valuePosition(newPosition,p,b,bh,false); movePossibilities.push_back(std::make_tuple(value,rand(),newPosition)); } } } for(auto it = pieces[p].myType->attackOffsets.begin(); it != pieces[p].myType->attackOffsets.end(); ++it) { sf::Vector2i newPosition = pieces[p].position + *it; if(onMap(newPosition)) { PieceID pp = b->occupants[newPosition.x][newPosition.y]; if(!nullPiece(pp)) { if(pieces[pp].isBlack != pieces[p].isBlack) { int value = valuePosition(newPosition,p,b,bh,true); movePossibilities.push_back(std::make_tuple(value,rand(),newPosition)); } } } } std::sort(movePossibilities.begin(),movePossibilities.end(), [] (const std::tuple<int,int,sf::Vector2i>& left, const std::tuple<int,int,sf::Vector2i>& right) -> bool { if(std::get<0>(left) != std::get<0>(right)) return std::get<0>(left) < std::get<0>(right); return std::get<1>(left) < std::get<1>(right); } ); sf::Vector2i chosenPosition = pieces[p].position; bool successfulKill; if(movePossibilities.size() > 0) { chosenPosition = std::get<2>(movePossibilities.back()); successfulKill = killPiece(b->occupants[chosenPosition.x][chosenPosition.y],b); } if(successfulKill) pieces[p].place(b,chosenPosition); else pieces[p].place(b,pieces[p].position); }