whtmst
@whtmst
https://github.com/whtmst

Понимание кода, новичок в C#. Как?

Здрасте :) Я только только изучаю язык C# и прохожу уроки от MVA. Дали там ДЗ, нарисовать с помощью черепашки Снежинку Коха, предварительно показав некоторые команды черепашки. Я вот сделал все таким образом (знаю что кода много, что можно было уложится в разы меньше, но я только на пороге дома C# и поэтому написав этот пусть и длинный код но без чьей либо помощи, я рад этому):
Мой код
static void Main(string[] args)
        {
            var len = 5; // Размер линии
            var ugol_small = -60; // Малый угол
            var ugol_big = 120; // Большой угол
            var ugol_end = 120; // Угол поворота всей части
            Turtle.Speed = 10;
            Turtle.TurnRight();

            // Полноценная снежинка Коха

            Side4(len, ugol_small, ugol_big);
            Turtle.Turn(ugol_end);
            Side4(len, ugol_small, ugol_big);
            Turtle.Turn(ugol_end);
            Side4(len, ugol_small, ugol_big);
        }

        private static void Side4(int len, int ugol_small, int ugol_big) // Четвертый кусок снежинки - Окончательный
        {
            Side3(len, ugol_small, ugol_big);
            Turtle.Turn(ugol_small);
            Side3(len, ugol_small, ugol_big);
            Turtle.Turn(ugol_big);
            Side3(len, ugol_small, ugol_big);
            Turtle.Turn(ugol_small);
            Side3(len, ugol_small, ugol_big);
        }

        private static void Side3(int len, int ugol_small, int ugol_big) // Третий кусок снежинки
        {
            Side2(len, ugol_small, ugol_big);
            Turtle.Turn(ugol_small);
            Side2(len, ugol_small, ugol_big);
            Turtle.Turn(ugol_big);
            Side2(len, ugol_small, ugol_big);
            Turtle.Turn(ugol_small);
            Side2(len, ugol_small, ugol_big);
        }

        private static void Side2(int len, int ugol_small, int ugol_big) // Второй кусок снежинки
        {
            Side1(len, ugol_small, ugol_big);
            Turtle.Turn(ugol_small);
            Side1(len, ugol_small, ugol_big);
            Turtle.Turn(ugol_big);
            Side1(len, ugol_small, ugol_big);
            Turtle.Turn(ugol_small);
            Side1(len, ugol_small, ugol_big);
        }

        private static void Side1(int len, int ugol_small, int ugol_big) // Первый кусок снежинки
        {
            Turtle.Move(len);
            Turtle.Turn(ugol_small);
            Turtle.Move(len);
            Turtle.Turn(ugol_big);
            Turtle.Move(len);
            Turtle.Turn(ugol_small);
            Turtle.Move(len);
        }
    }

Далее в следующем уроке, преподаватель показал как он сделал эту снежинку и тут у меня возник ступор и не понимание. В коде преподавателя я оставил комментарии, там и вопросы!
Код преподавателя
static void Main(string[] args)
        {
            Turtle.Speed = 10;
            for (int i = 0; i < 3; i++)
            {
                Draw(150, 3); // Тут по моему понимаю, задались параметры для процедуры Draw
                Turtle.Turn(120);
            }

            
        }

        public static void Draw(int len, int n) // Тут он создал процедуру Draw
        {
            if (n == 0) Turtle.Move(len); // Тут я понял, что если переменная n равна нулю, то всего лишь рисовать линию длинной равной переменной len

            else // А вот тут у меня ступор пошел.
            {
                Draw(len / 3, n - 1); // Как черепашка рисует, если нет команды Turtle.Move();
                Turtle.Turn(-60);
                Draw(len / 3, n - 1); // Как черепашка рисует, если нет команды Turtle.Move();
                Turtle.Turn(120);
                Draw(len / 3, n - 1); // Как черепашка рисует, если нет команды Turtle.Move();
                Turtle.Turn(-60);
                Draw(len / 3, n - 1); // Как черепашка рисует, если нет команды Turtle.Move();
            }

        }


Да и если кто не понял, вопрос конкретно касается вот этого: Draw(len / 3, n - 1); // Как черепашка рисует, если нет команды Turtle.Move();
Как черепашка рисует линию, если нет для нее команды Turtle.Move();
  • Вопрос задан
  • 760 просмотров
Решения вопроса 1
saboteur_kiev
@saboteur_kiev
software engineer
там идет рекурсия.
public static void Draw(int len, int n) {
...
Draw(len / 3, n - 1);
...

Вот тут Draw означает, что вызовется еще раз функция Draw, но с "n-1"
Если n будет равно 0, а это произойдет на третьем вложенном вызове Draw, то вызовется команда с move.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы