public Position HandleCommand(PlutoCommand command) { switch (command) { case PlutoCommand.L: return(new Position(X, Y, Utils.DecrementOrientation(O))); case PlutoCommand.R: return(new Position(X, Y, Utils.IncrementOrientation(O))); default: { int step = command == PlutoCommand.F ? 1 : -1; switch (O) { case Orientation.N: return(new Position(X, Y + step, O)); case Orientation.E: return(new Position(X + step, Y, O)); case Orientation.S: return(new Position(X, Y - step, O)); case Orientation.W: return(new Position(X - step, Y, O)); default: return(null); } } } }
public MovementReport ProcessCommand(PlutoCommand command) { Position proposed = this.GetPosition().HandleCommand(command); proposed = _planet.Wrap(proposed); List <PlutoObject> obstructions = _planet.ObjectsAt(proposed); if (obstructions is null || 0 == obstructions.Count || (1 == obstructions.Count && object.ReferenceEquals(obstructions[0], this))) { this._position = proposed; return(new MovementReport(true, null)); }