public CreatureCommand FindPath(int x, int y, Point goal) // принимает начальную позицию и цель. Возвращает следующую точку и обновляет CurrDir { var oppositeDirecrion = Direction.GetOppositeDirection(CurrentDirection); var oppositePoint = Direction.directions[oppositeDirecrion]; var minDist = mapDiagonalSize; var result = new Point(); foreach (var neighbor in GetNeighbors(new Point(x, y))) { var distSquare = GetDistanceSquare(neighbor, goal); var movement = new Point(neighbor.X - x, neighbor.Y - y); if (distSquare <= minDist && movement != oppositePoint) { minDist = distSquare; result = movement; } } if (result.X == 27) { CurrentDirection = Directions.Left; } else if (result.X == -27) { CurrentDirection = Directions.Right; } else { CurrentDirection = Direction.reversedDirections[result]; } return(new CreatureCommand { DeltaX = result.X, DeltaY = result.Y }); }
public CreatureCommand FrightenedAlgorithm(int x, int y) // алгоритм режима испуга. Принимает x, y. Возвращает след точку, обновляет CurrDir { var rnd = new Random(); var attemptsCount = 0; while (true) { if (attemptsCount >= 10) { return(new CreatureCommand()); } var newX = rnd.Next(-1, 2); var newY = rnd.Next(-1, 2); if ((newX != newY) && (newX == 0 || newY == 0)) { var newPoint = new Point(x + newX, y + newY); if (Game.teleports.teleports.Contains(newPoint)) { var movement = Game.teleports.EntranceExitPairs[newPoint]; return(new CreatureCommand { DeltaX = movement.X - x, DeltaY = movement.Y - y }); } if (CanMoveTo(newPoint) && Direction.reversedDirections[new Point(newX, newY)] != Direction.GetOppositeDirection(CurrentDirection)) { CurrentDirection = Direction.reversedDirections[new Point(newX, newY)]; return(new CreatureCommand { DeltaX = newX, DeltaY = newY }); } attemptsCount++; } } }