示例#1
0
        private Direction?DetermineExpectedDirection(ClonePos clonePos, ElementPos posOfElement)
        {
            Direction?expectedDirection = null;

            if (clonePos.XPos < posOfElement.XPos)
            {
                expectedDirection = Direction.Right;
            }
            if (clonePos.XPos > posOfElement.XPos)
            {
                expectedDirection = Direction.Left;
            }
            return(expectedDirection);
        }
示例#2
0
        private CloneAction GetAction(ClonePos clonePos, ElementPos exit, List <ElementPos> elevators)
        {
            if (clonePos.XPos == -1 && clonePos.Floor == -1)
            {
                Log("Invalid clone pos, wait!"); return(CloneAction.Wait);
            }

            bool cloneOnExitFloor = clonePos.Floor == exit.Floor;

            Log($"Drone is on exit floor: {cloneOnExitFloor}");

            var elementToNavTo = cloneOnExitFloor ? exit : elevators.FirstOrDefault(e => e.Floor == clonePos.Floor);

            if (elementToNavTo == null)
            {
                Log("We want to move to an elevator on floor {}, but none is found, creating an elevator here!");
                var newEl = new ElementPos()
                {
                    Floor = clonePos.Floor, XPos = clonePos.XPos, ElementType = "Own Elevator"
                };
                elevators.Add(newEl);
                return(CloneAction.Elevator);
            }

            Log($"Moving drone to {elementToNavTo}");

            var expectedDirection = DetermineExpectedDirection(clonePos, elementToNavTo);

            Log($"We expect the drone to navigate: {expectedDirection}");
            if (expectedDirection == null)
            {
                Log("No direction expected, spot on location, wait"); return(CloneAction.Wait);
            }
            if (expectedDirection == clonePos.Direction)
            {
                Log("Same floor, going correct way!"); return(CloneAction.Wait);
            }
            if (expectedDirection != clonePos.Direction)
            {
                Log("Same floor, but going wrong way!"); return(CloneAction.Block);
            }

            Log("No condition hit, just waiting this one!");
            return(CloneAction.Wait);
        }