internal override IList <Move> GetMoves(Hex start, Board board) { Beetle beetle = (Beetle)top; var validMoves = new List <Move>(); beetle.GetClimbingMoves(start, board, validMoves); // empty spaces around are valid moves for a beetle stack var hivailability = Hivailability.GetHivailability(board, start); foreach (Hex hex in hivailability.EmptyNeighborHexes(start)) { validMoves.Add(Move.GetMove(this.top, hex)); } return(validMoves); }
internal void GetClimbingMoves(Hex start, Board board, List <Move> validMoves) { // TODO check climbing gates var hivailability = Hivailability.GetHivailability(board, start); for (int i = 1; i < 7; i++) { Hex neighborHex = Neighborhood.GetNeighborHex(start, (Position)i); if (hivailability.NeighborStatusArray[i] != Hivailability.NeighborStatus.Empty) { if (!IsDirectionClimbingBlocked(start, board, (Position)i)) { validMoves.Add(Move.GetMove(this, neighborHex)); } } } }
protected void GetSlideMovesRecursive(Hex current, Board board, int stopAtDepth, int depth, IList <Hex> visited, Dictionary <int, HashSet <Hex> > results) { Hivailability hivailableCenter = Hivailability.GetHivailability(board, current); IList <Hex> blockedNeighbors = hivailableCenter.BlockedNeighborHexes(current); IList <Hex> emptyNeighbors = hivailableCenter.EmptyNeighborHexes(current); IList <Hex> nonEmptyNeighbors = hivailableCenter.NonEmptyNeighborHexes(current); IList <Hex> emptyNeighborNeighbors = new List <Hex>(); foreach (Hex hex in nonEmptyNeighbors) { Hivailability hivailableNeighbor = Hivailability.GetHivailability(board, hex); emptyNeighborNeighbors = hivailableNeighbor.EmptyNeighborHexes(hex).Concat(emptyNeighborNeighbors).ToList(); } HashSet <Hex> validMovementHexes = new HashSet <Hex>(((emptyNeighborNeighbors.Intersect(emptyNeighbors)).Except(blockedNeighbors)).Except(visited)); visited.Add(current); HashSet <Hex> validHexSet; if (results.TryGetValue(depth, out validHexSet)) { validHexSet.UnionWith(validMovementHexes); } else { results.Add(depth, validMovementHexes); } if (stopAtDepth == depth) { return; } foreach (Hex h in validMovementHexes) { if (!visited.Contains(h)) { GetSlideMovesRecursive(h, board, stopAtDepth, depth + 1, visited, results); } } }