private bool TrySilence(out Direction direction, out int moves) { direction = Direction.E; moves = 0; if (_gameState.SilenceAvailable == false || MySubmarine.TrackingService.LostHealth == 0) { return(false); } var possibleSilenceMoves = SilenceAction.ComputeSilenceActions(MySubmarine.Position, MySubmarine.VisitedPositions); var bestScore = -1; var bestSilenceMove = (Direction.E, 0, MySubmarine.Position); Player.Debug($"{possibleSilenceMoves.Count} possibleSilenceMoves"); foreach (var currentSilenceMove in possibleSilenceMoves) { Player.Debug($"Evaluate {currentSilenceMove}"); var myPossiblePositions = MySubmarine.TrackingService.PossiblePositions; var lastMoveAction = MySubmarine.TrackingService.LastMoveAction; var trackingService = new TrackingService(myPossiblePositions, lastMoveAction); trackingService.Track(new SilenceAction(currentSilenceMove.Item1, currentSilenceMove.Item2)); var score = trackingService.PossiblePositions.Count; if (score > bestScore) { bestScore = score; bestSilenceMove = currentSilenceMove; Player.Debug($"bestSilenceMove: {bestSilenceMove} ({score})"); } } direction = bestSilenceMove.Item1; moves = bestSilenceMove.Item2; return(true); }
private void TrackSilenceAction() { var newPossiblePositions = new HashSet <Position>(); var visitedPositions = new HashSet <Position>(); var excludeDirection = Player.OppositeDirection[LastMoveAction.Direction]; foreach (var pos in _possiblePositions) { var possibleSilenceActions = SilenceAction.ComputeSilenceActions(pos, visitedPositions) .Where(silenceAction => silenceAction.Item1 != excludeDirection) .ToList(); foreach (var possibleSilenceAction in possibleSilenceActions) { newPossiblePositions.Add(possibleSilenceAction.Item3); } } _possiblePositions = newPossiblePositions; }