void Knight::calcTrajectory() { //Knights can only move in 3-long 2-short L shapes for(Position_t m : {Position_t( 1, -2) ,Position_t( 2, -1) ,Position_t( 2, 1) ,Position_t( 1, 2) ,Position_t(-1, 2) ,Position_t(-2, 1) ,Position_t(-2, -1) ,Position_t(-1, -2)}) { Position_t t = Position_t(pos).move(m.x, m.y); addTrajectory(t); addCapturing(t); } }
void King::calcTrajectory() { //Kings can move one space in all eight directions using Dir = util::Direction; for(Dir d : {Dir::North ,Dir::NorthEast ,Dir::East ,Dir::SouthEast ,Dir::South ,Dir::SouthWest ,Dir::West ,Dir::NorthWest}) { Position_t t = Position_t(pos).move(d); addTrajectory(t); addCapturing(t); } }
void Rook::calcTrajectory() { //Rooks can move infinitely in the four straight directions using Dir = util::Direction; for(Dir d : {Dir::North ,Dir::East ,Dir::South ,Dir::West}) { Position_t t; for(signed i = 1; board.valid(t = Position_t(pos).move(d, i)); ++i) { addCapturing(t); if(!board.occupied(t)) { addTrajectory(t); } else break; //can't jump over pieces } } }