public void DeployTo(IPlanet planet, int landingPointX, int landingPointY, Movement.CardinalHeading landingCardinalHeading) { this.DeployedTo = planet; if (landingPointX < 0 || landingPointY < 0 || landingPointX > planet.Size.Width || landingPointY > planet.Size.Height) { throw new ArgumentException("Rover cannot be deployed to a point outside the bounds of a planet."); } this.Position = new Position(landingPointX, landingPointY, landingCardinalHeading); }
private void Move(Movement.Direction direction) { int gridPoints = direction == Movement.Direction.Forwards ? 1 : -1; switch (this.Position.CardinalHeading) { case Movement.CardinalHeading.North: this.Position.Point = new Point(this.Position.Point.X, this.Position.Point.Y + gridPoints); break; case Movement.CardinalHeading.East: this.Position.Point = new Point(this.Position.Point.X + gridPoints, this.Position.Point.Y); break; case Movement.CardinalHeading.South: this.Position.Point = new Point(this.Position.Point.X, this.Position.Point.Y - gridPoints); break; case Movement.CardinalHeading.West: this.Position.Point = new Point(this.Position.Point.X - gridPoints, this.Position.Point.Y); break; } // Bounds wrapping if (this.Position.Point.X > this.DeployedTo.Size.Width) { this.Position.Point = new Point(0, this.Position.Point.Y); } else if (this.Position.Point.X < 0) { this.Position.Point = new Point(this.DeployedTo.Size.Width, this.Position.Point.Y); } else if (this.Position.Point.Y > this.DeployedTo.Size.Height) { this.Position.Point = new Point(this.Position.Point.X, 0); } else if (this.Position.Point.Y < 0) { this.Position.Point = new Point(this.Position.Point.X, this.DeployedTo.Size.Height); } // Detect collision if (this.DeployedTo.HasObstacleAtPosition(this.Position)) { throw new DetectedObstacleException(); } }
public Position(int x, int y, Movement.CardinalHeading cardinalHeading) { this.Point = new Point(x, y); this.CardinalHeading = cardinalHeading; }
private void Turn(Movement.TurningDirection turn) { switch (turn) { case Movement.TurningDirection.Right: if (this.Position.CardinalHeading == Movement.CardinalHeading.West) { // Bounds wrapping this.Position.CardinalHeading = Movement.CardinalHeading.North; } else { this.Position.CardinalHeading += 1; } break; case Movement.TurningDirection.Left: if (this.Position.CardinalHeading == Movement.CardinalHeading.North) { // Bounds wrapping this.Position.CardinalHeading = Movement.CardinalHeading.West; } else { this.Position.CardinalHeading -= 1; } break; } }