Exemplo n.º 1
0
        private Robot Process(string instructions)
        {
            foreach (char instruction in instructions)
            {
                switch (instruction)
                {
                case '<':
                {
                    _robot.DirectionOfMovement =
                        _directionChanger.GetDirection(_robot.DirectionOfMovement, Rotation.Anticlockwise);
                    break;
                }

                case '>':
                {
                    _robot.DirectionOfMovement =
                        _directionChanger.GetDirection(_robot.DirectionOfMovement, Rotation.Clockwise);
                    break;
                }

                case '^':
                {
                    switch (_robot.DirectionOfMovement)
                    {
                    case Direction.North:
                    {
                        _robot.y = _robot.y + 1;
                        break;
                    }

                    case Direction.South:
                    {
                        _robot.y = _robot.y - 1;
                        break;
                    }

                    case Direction.East:
                    {
                        _robot.x = _robot.x + 1;
                        break;
                    }

                    case Direction.West:
                    {
                        _robot.x = _robot.x - 1;
                        break;
                    }
                    }
                    break;
                }
                }
            }
            return(_robot);
        }
Exemplo n.º 2
0
        public void ChangeDirection(IDirectionChanger directionChanger)
        {
            Vector2 directionVector = (Vector2)transform.position - directionChanger.GetPosition();

            float angle        = Vector2.SignedAngle(directionVector, Vector2.up);
            float roundedAngle = Mathf.Round(angle / 90f) * 90f;

            //older solution for only one DirectionChanger
            // float directionalAngle = Vector2.SignedAngle(-direction, positionVector);
            // float orthogonalAngle = (directionalAngle > 0 ? 1 : -1) * 90f;

            float orthogonalAngle = (directionChanger.GetDirection() == Direction.Right ? 1 : -1) * 90f;

            if (Vector2.SignedAngle(direction, Vector2.up) % 180f == roundedAngle % 180f)
            {
                direction = Quaternion.AngleAxis(orthogonalAngle, Vector3.back) * direction;
            }
            else
            {
                direction = Quaternion.AngleAxis(roundedAngle, Vector3.back) * Vector2.up;
            }

            directionChanged = true;
        }