示例#1
0
 public Cart(int x, int y, CartDirection direction)
 {
     this.X          = x;
     this.Y          = y;
     this.Direction  = direction;
     this.LatestTurn = CartTurn.Right;
 }
示例#2
0
        private void CartIntersectionTest(
            CartDirection initialDirection,
            CartDirection newDirection,
            int iteration)
        {
            int dx = 0;
            int dy = 0;

            switch (newDirection)
            {
            case CartDirection.West:
                dx = -1;
                break;

            case CartDirection.East:
                dx = 1;
                break;

            case CartDirection.North:
                dy = -1;
                break;

            case CartDirection.South:
                dy = 1;
                break;
            }
            for (int i = 0; i < 3; ++i)
            {
                var c = new CartState(2, 2, initialDirection, iteration + (i * 3)).Move(TrackCell.Intersection);
                Assert.AreEqual(2 + dx, c.X, $"X ({i})");
                Assert.AreEqual(2 + dy, c.Y, $"Y ({i})");
                Assert.AreEqual(newDirection, c.Direction, $"Direction ({i})");
                Assert.AreEqual(iteration + (i * 3) + 1, c.IntersectionsEncountered, "IntersectionsEncountered");
            }
        }
示例#3
0
 public Cart(int _x, int _y, CartDirection _dir)
 {
     x        = _x;
     y        = _y;
     dir      = _dir;
     lastTurn = CartDirection.Right;
 }
 public Cart(int positionX, int positionY, CartDirection direction)
 {
     PositionX     = positionX;
     PositionY     = positionY;
     Direction     = direction;
     LastDirection = direction;
     Id            = _idCounter;
     _idCounter++;
 }
示例#5
0
 public CartState(
     int x,
     int y,
     CartDirection direction,
     int intersectionsEncountered)
 {
     X         = x;
     Y         = y;
     Direction = direction;
     IntersectionsEncountered = intersectionsEncountered;
 }
示例#6
0
 public Cart(Coord coordinates, Track owner, CartDirection direction) : this(coordinates, owner)
 {
     CurrentDirection = direction;
 }
示例#7
0
        public CartState Move(TrackCell track)
        {
            int           x = X;
            int           y = Y;
            int           i = IntersectionsEncountered;
            CartDirection d = Direction;

            switch (track)
            {
            case TrackCell.NorthSouth:
                switch (Direction)
                {
                case CartDirection.North:
                case CartDirection.South:
                    break;

                default:
                    throw new InvalidOperationException("On N/S track and attempted to move " + Direction);
                }
                break;

            case TrackCell.EastWest:
                switch (Direction)
                {
                case CartDirection.East:
                case CartDirection.West:
                    break;

                default:
                    throw new InvalidOperationException("On E/W track and attempted to move " + Direction);
                }
                break;

            case TrackCell.NorthEastSouthWest:
                switch (d)
                {
                case CartDirection.North: d = CartDirection.East; break;

                case CartDirection.South: d = CartDirection.West; break;

                case CartDirection.East: d = CartDirection.North; break;

                case CartDirection.West: d = CartDirection.South; break;
                }
                break;

            case TrackCell.NorthWestSouthEast:
                switch (d)
                {
                case CartDirection.North: d = CartDirection.West; break;

                case CartDirection.South: d = CartDirection.East; break;

                case CartDirection.East: d = CartDirection.South; break;

                case CartDirection.West: d = CartDirection.North; break;
                }
                break;

            case TrackCell.Intersection:
                i += 1;
                int turnDelta = (IntersectionsEncountered % 3) - 1;
                d = (CartDirection)(((int)d + turnDelta + 4) % 4);
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(track), "Unrecognized track direction " + track);
            }

            int dx = 0;
            int dy = 0;

            switch (d)
            {
            case CartDirection.North: dy = -1; break;

            case CartDirection.South: dy = 1; break;

            case CartDirection.West: dx = -1; break;

            case CartDirection.East: dx = 1; break;
            }
            return(new CartState(
                       X + dx,
                       Y + dy,
                       d,
                       i));
        }
示例#8
0
            public void Move(char[,] tracks)
            {
                var track = tracks[X, Y];

                if (track == '|')
                {
                    if (_currentDirection == CartDirection.UP)
                    {
                        Y -= 1;
                    }
                    else if (_currentDirection == CartDirection.DOWN)
                    {
                        Y += 1;
                    }
                    else
                    {
                        throw new ArgumentOutOfRangeException();
                    }
                }
                else if (track == '-')
                {
                    if (_currentDirection == CartDirection.LEFT)
                    {
                        X -= 1;
                    }
                    else if (_currentDirection == CartDirection.RIGHT)
                    {
                        X += 1;
                    }
                    else
                    {
                        throw new ArgumentOutOfRangeException();
                    }
                }
                else if (track == '\\')
                {
                    if (_currentDirection == CartDirection.UP)
                    {
                        X -= 1;
                        _currentDirection = CartDirection.LEFT;
                    }
                    else if (_currentDirection == CartDirection.RIGHT)
                    {
                        Y += 1;
                        _currentDirection = CartDirection.DOWN;
                    }
                    else if (_currentDirection == CartDirection.LEFT)
                    {
                        Y -= 1;
                        _currentDirection = CartDirection.UP;
                    }
                    else if (_currentDirection == CartDirection.DOWN)
                    {
                        X += 1;
                        _currentDirection = CartDirection.RIGHT;
                    }
                }
                else if (track == '/')
                {
                    if (_currentDirection == CartDirection.UP)
                    {
                        X += 1;
                        _currentDirection = CartDirection.RIGHT;
                    }
                    else if (_currentDirection == CartDirection.RIGHT)
                    {
                        Y -= 1;
                        _currentDirection = CartDirection.UP;
                    }
                    else if (_currentDirection == CartDirection.LEFT)
                    {
                        Y += 1;
                        _currentDirection = CartDirection.DOWN;
                    }
                    else if (_currentDirection == CartDirection.DOWN)
                    {
                        X -= 1;
                        _currentDirection = CartDirection.LEFT;
                    }
                }
                else if (track == '+')
                {
                    if (_intersections % 3 == 0)
                    {
                        // Left
                        if (_currentDirection == CartDirection.UP)
                        {
                            _currentDirection = CartDirection.LEFT;
                            X -= 1;
                        }
                        else if (_currentDirection == CartDirection.DOWN)
                        {
                            _currentDirection = CartDirection.RIGHT;
                            X += 1;
                        }
                        else if (_currentDirection == CartDirection.LEFT)
                        {
                            _currentDirection = CartDirection.DOWN;
                            Y += 1;
                        }
                        else if (_currentDirection == CartDirection.RIGHT)
                        {
                            _currentDirection = CartDirection.UP;
                            Y -= 1;
                        }
                    }
                    else if (_intersections % 3 == 1)
                    {
                        // Straight
                        if (_currentDirection == CartDirection.UP)
                        {
                            Y -= 1;
                        }
                        else if (_currentDirection == CartDirection.DOWN)
                        {
                            Y += 1;
                        }
                        else if (_currentDirection == CartDirection.LEFT)
                        {
                            X -= 1;
                        }
                        else if (_currentDirection == CartDirection.RIGHT)
                        {
                            X += 1;
                        }
                    }
                    else if (_intersections % 3 == 2)
                    {
                        // Right
                        if (_currentDirection == CartDirection.UP)
                        {
                            _currentDirection = CartDirection.RIGHT;
                            X += 1;
                        }
                        else if (_currentDirection == CartDirection.DOWN)
                        {
                            _currentDirection = CartDirection.LEFT;
                            X -= 1;
                        }
                        else if (_currentDirection == CartDirection.LEFT)
                        {
                            _currentDirection = CartDirection.UP;
                            Y -= 1;
                        }
                        else if (_currentDirection == CartDirection.RIGHT)
                        {
                            _currentDirection = CartDirection.DOWN;
                            Y += 1;
                        }
                    }
                    _intersections += 1;
                }
                else
                {
                    throw new ArgumentOutOfRangeException();
                }

                _moves += 1;
            }
示例#9
0
 public MineCart(char cart, int x, int y)
 {
     X = x;
     Y = y;
     _currentDirection = (CartDirection)cart;
 }
            public void Turn(SpecialTrackPiece piece)
            {
                if (this.location.x == piece.location.x && this.location.y == piece.location.y)
                {
                    if (piece.type == Types.TURN)
                    {
                        switch (piece.direction)
                        {
                        case TurnDirection.TOPLEFT:
                            if (this.direction == CartDirection.RIGHT)
                            {
                                this.direction = CartDirection.ABOVE;
                            }
                            else
                            {
                                this.direction = CartDirection.LEFT;
                            }
                            break;

                        case TurnDirection.TOPRIGHT:
                            if (this.direction == CartDirection.LEFT)
                            {
                                this.direction = CartDirection.ABOVE;
                            }
                            else
                            {
                                this.direction = CartDirection.RIGHT;
                            }
                            break;

                        case TurnDirection.BOTTOMRIGHT:
                            if (this.direction == CartDirection.LEFT)
                            {
                                this.direction = CartDirection.BOTTOM;
                            }
                            else
                            {
                                this.direction = CartDirection.RIGHT;
                            }
                            break;

                        case TurnDirection.BOTTOMLEFT:
                            if (this.direction == CartDirection.RIGHT)
                            {
                                this.direction = CartDirection.BOTTOM;
                            }
                            else
                            {
                                this.direction = CartDirection.LEFT;
                            }
                            break;
                        }
                    }
                    else if (piece.type == Types.INTERSECTION)
                    {
                        switch (this.nextTurn)
                        {
                        case TurnState.LEFT:
                            switch (this.direction)
                            {
                            case CartDirection.ABOVE:
                                this.direction = CartDirection.LEFT;
                                break;

                            case CartDirection.LEFT:
                                this.direction = CartDirection.BOTTOM;
                                break;

                            case CartDirection.RIGHT:
                                this.direction = CartDirection.ABOVE;
                                break;

                            case CartDirection.BOTTOM:
                                this.direction = CartDirection.RIGHT;
                                break;
                            }
                            this.nextTurn = TurnState.STRAIGHT;
                            break;

                        case TurnState.STRAIGHT:
                            this.nextTurn = TurnState.RIGHT;
                            break;

                        case TurnState.RIGHT:
                            switch (this.direction)
                            {
                            case CartDirection.ABOVE:
                                this.direction = CartDirection.RIGHT;
                                break;

                            case CartDirection.LEFT:
                                this.direction = CartDirection.ABOVE;
                                break;

                            case CartDirection.RIGHT:
                                this.direction = CartDirection.BOTTOM;
                                break;

                            case CartDirection.BOTTOM:
                                this.direction = CartDirection.LEFT;
                                break;
                            }
                            this.nextTurn = TurnState.LEFT;
                            break;
                        }
                    }
                }
            }
 public Cart(Point location, CartDirection direction)
 {
     this.location  = location;
     this.direction = direction;
     this.nextTurn  = TurnState.LEFT;
 }