public Cart(int x, int y, CartDirection direction) { this.X = x; this.Y = y; this.Direction = direction; this.LatestTurn = CartTurn.Right; }
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"); } }
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++; }
public CartState( int x, int y, CartDirection direction, int intersectionsEncountered) { X = x; Y = y; Direction = direction; IntersectionsEncountered = intersectionsEncountered; }
public Cart(Coord coordinates, Track owner, CartDirection direction) : this(coordinates, owner) { CurrentDirection = direction; }
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)); }
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; }
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; }