Exemplo n.º 1
0
        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
            });
        }
Exemplo n.º 2
0
        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++;
                }
            }
        }