Форум программистов, компьютерный форум, киберфорум
EggHead
Войти
Регистрация
Восстановить пароль

Исполнитель Черепаха в КуМир: Решение задач

Запись от EggHead размещена 16.03.2025 в 12:35
Показов 6156 Комментарии 0

Нажмите на изображение для увеличения
Название: 09fb8521-d610-4e3b-9437-1afa42cf300a.jpg
Просмотров: 60
Размер:	181.6 Кб
ID:	10420
Представьте, что вы впервые учитесь программировать, а перед вами стоит задача заставить маленькую виртуальную черепашку рисовать на экране. Звучит забавно? Эта идея зародилась ещё в 1967 году, когда Сеймур Пейперт создал первый язык Лого с исполнителем Черепахой. С тех пор маленькая Черепаха "приползла" в самые разные среды программирования, включая отечественный КуМир.

КуМир (или "Комплект Учебных МИРов") - уникальная российская система, разработанная для обучения программированию и алгоритмическому мышлению. Она широко используется в школах, и не случайно: простой понятный синтаксис и визуальная составляющая превращают абстрактные алгоритмы в наглядные движения исполнителя. Черепаха в КуМир - это не просто игрушка. Это полноценный инструмент, позволяющий понять фундаментальные принципы программирования через рисование. Мне нравится сравнивать её с простым карандашом и бумагой, только вместо руки рисунком управляет код.

Особенности исполнителя и его команды



Исполнитель Черепаха в системе КуМир предельно прост в освоении, но обладает достаточной выразительной силой для решения интересных задач. Вот его ключевые особенности:
1. Интуитивно понятный набор команд: вперед, назад, влево, вправо - всё максимально наглядно.
2. Визуальная обратная связь - любая команда сразу же отображается на экране.
3. Простое управление пером - его можно опускать для рисования и поднимать для перемещения без следа.
4. Существенно ограниченный набор команд, что заставляет решать задачи через декомпозицию.
5. Поддержка процедур и функций, что позволяет структурировать код и повторно использовать решения.

Основные команды Черепахи просты и понятны даже младшим школьникам:

Code
1
2
3
4
вперед(N) | назад(N) - перемещение на N шагов
влево(A) | вправо(A) - поворот на A градусов
опустить перо | поднять перо - режим рисования/перемещения
установить перо(цвет) - изменение цвета линии
Что же делает Черепаху в КуМир особенной? Прежде всего - органичная интеграция в русскоязычную среду с поддержкой понятных школьникам конструкций. Вам не нужно учить английские слова или запоминать сложный синтаксис - программы пишутся практически на обычном русском языке.

Сравнение Черепахи в КуМир с аналогичными исполнителями



Если вы когда-нибудь работали с другими "черепашьими" средами, вы заметите как сходства, так и различия. Черепаха в Logo, родоначальник всех подобных систем, ориентирована на англоязычных пользователей и имеет более широкий набор встроенных функций. Синтаксис там немного сложнее, особенно для новичков, но зато мощнее.

Python Turtle графически похож, но существенно отличается синтаксисом. Преимущество Python Turtle в том, что вы сразу учите "настоящий" язык программирования, используемый в реальной разработке. Но для начинающих это может быть и недостатком - синтаксис Python не так интуитивно понятен:

Python
1
2
3
4
5
# Python Turtle
import turtle
t = turtle.Turtle()
t.forward(100)
t.right(90)
А вот так выглядит программа для Черепахи в КуМир:

Code
1
2
3
4
# КуМир
использовать Черепаха
вперед(100)
вправо(90)
Scratch со своим котиком вместо черепахи предлагает блочный интерфейс, где программы собираются из готовых визуальных блоков. Это облегчает старт, но затрудняет переход к текстовым языкам программирования.

В чём же преимущество именно Черепахи в КуМир? Помимо русскоязычного интерфейса, это максимально низкий порог входа при сохранении текстовой природы программирования. Вы сразу пишете код, но делаете это максимально просто. К тому же, КуМир позволяет пошагово выполнять алгоритмы, что просто бесценно для понимания того, как работает программа. Работая с Черепахой в КуМир, ты осваиваешь не просто инструмент, а целую методику мышления: от простой линии к сложному рисунку, от базовой команды к алгоритму. И это, пожалуй, самое главное достоинство этого исполнителя.

Базовые принципы работы Черепахи



Чтобы эффективно решать задачи с Черепахой в КуМир, нужно хорошо понимать, как устроен её мир. Представьте бесконечный лист бумаги с координатной сеткой, где наша Черепаха — это маленький робот с прикрепленным карандашом. Звучит просто, но за этой простотой скрываются возможности для создания сложнейших графических алгоритмов.

Система координат и перемещение



В начале работы Черепаха находится в центре экрана — точке с координатами (0, 0). Обратите внимание, что это не левый верхний угол, как во многих графических системах! Ориентирована Черепаха изначально на север (вверх экрана). Координатная система здесь декартова: ось X направлена слева направо, а ось Y — снизу вверх. Это классическое представление из математики, что делает систему интуитивно понятной для тех, кто знаком с построением графиков функций.

Code
1
2
3
4
5
использовать Черепаха
нц для i от 1 до 4
    вперед(50)
    вправо(90)
кц
Этот простой код заставит Черепаху нарисовать квадрат со стороной 50 шагов. Но что такое "шаг" для Черепахи? Это минимальная единица перемещения, которая в КуМир соответствует одному пикселю на экране. Такая точность позволяет создавать достаточно детализированные изображения. Что интересно, в КуМир есть команды для прямого управления позицией Черепахи:

Code
1
2
3
поднять перо
сместиться в точку(100, 100)
опустить перо
Эти команды позволяют "телепортировать" Черепаху в нужную точку координатной плоскости. Особенно удобно, если нужно рисовать несколько не связанных между собой объектов.

Ключевые команды



Весь арсенал команд Черепахи можно разделить на несколько логических групп:

Команды перемещения:
вперед(N) — перемещение вперед на N шагов.
назад(N) — перемещение назад на N шагов.
сместиться в точку(X, Y) — перемещение в точку с координатами (X, Y).

Команды поворота:
вправо(A) — поворот по часовой стрелке на A градусов.
влево(A) — поворот против часовой стрелки на A градусов.
повернуться на угол(A) — установка абсолютного направления A.

Команды управления пером:
опустить перо — начать рисование при перемещении.
поднять перо — прекратить рисование при перемещении.
установить перо(цвет) — изменить цвет пера.
установить размер(толщина) — изменить толщину линии.

Вспомогательные команды:
домой — возврат в точку (0, 0) с направлением на север.
очистить экран — удаление всех нарисованных линий.

Например, для рисования трех параллельных линий разного цвета мы можем использовать такой код:

Code
1
2
3
4
5
6
7
8
9
10
11
использовать Черепаха
нц для i от 1 до 3
    установить перо(i)  // Цвета: 1 - черный, 2 - синий, 3 - зеленый
    вперед(100)
    поднять перо
    назад(100)
    вправо(90)
    вперед(20)
    влево(90)
    опустить перо
кц
Обратите внимание на последовательность действий: рисуем линию, поднимаем перо, возвращаемся назад, смещаемся в сторону, снова опускаем перо. Такой подход — типичный пример алгоритмического мышления, которое развивает работа с Черепахой.

Управление пером: опускание, поднятие и изменение цвета



Управление пером — одна из ключевых концепций в работе с Черепахой. Представьте, что у нашего робота есть рука с карандашом, который можно прижимать к бумаге или поднимать над ней. Когда перо опущено, любое перемещение Черепахи оставляет след — линию. Когда перо поднято, Черепаха перемещается "по воздуху", не оставляя следа. Эта простая механика открывает огромные возможности для создания сложных рисунков.

В КуМире доступны следующие цвета пера (по номерам):
1: черный (используется по умолчанию).
2: синий.
3: зеленый.
4: красный.
5: розовый.
6: желтый.

Вот пример создания радуги из концентрических дуг:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
использовать Черепаха
поднять перо
сместиться в точку(0, -100)
нц для цвет от 6 до 1 шаг -1
    установить перо(цвет)
    опустить перо
    нц для угол от 0 до 180
        вперед(2)
        вправо(1)
    кц
    поднять перо
    вправо(180)
    вперед(10)
    вправо(180)
кц
В этом коде мы последовательно рисуем дуги разного цвета и радиуса. Обратите внимание, как сочетание циклов и управления пером позволяет создавать визуально сложные изображения с помощью довольно компактного кода. Помимо цвета, можно управлять и толщиной линии с помощью команды установить размер(толщина). Это особенно полезно, когда нужно выделить определенные элементы рисунка:

Code
1
2
3
4
5
6
использовать Черепаха
установить размер(5)  // Толстая линия
вперед(100)
установить размер(1)  // Тонкая линия
вправо(90)
вперед(100)

Понятие шага и угла поворота: практический подход



Работая с Черепахой, важно понимать, что такое "шаг" и "угол поворота" — эти два параметра определяют все движения нашего виртуального художника.

Шаг — это базовая единица перемещения Черепахи. В системе КуМир один шаг равен одному пикселю на экране. Понимание масштаба критически важно при проектировании рисунка: слишком маленькие значения сделают изображение крошечным, а слишком большие могут выйти за пределы видимой области. Представьте, что вы рисуете окружность. При малом количестве шагов и больших углах поворота вы получите многоугольник с небольшим числом сторон. Увеличивая количество шагов и уменьшая угол поворота, можно добиться более гладкой окружности:

Code
1
2
3
4
5
использовать Черепаха
нц для i от 1 до 360
   вперед(1)
   вправо(1)
кц
Этот код создает достаточно гладкую окружность, делая 360 шагов и поворачивая на 1 градус после каждого. Но что, если мы изменим соотношение шага и угла?

Code
1
2
3
4
5
использовать Черепаха
нц для i от 1 до 36
   вперед(10)
   вправо(10)
кц
Теперь у нас получится 36-угольник, который все еще похож на круг, но имеет заметные грани. Этот принцип можно использовать для создания правильных многоугольников с разным числом сторон. Опытным путем я выяснил, что для создания правильного n-угольника угол поворота должен быть равен 360/n градусов. Например, для шестиугольника:

Code
1
2
3
4
5
использовать Черепаха
нц для i от 1 до 6
   вперед(50)
   вправо(60)  // 360/6 = 60
кц
При работе над сложными проектами часто приходится вычислять необходимые шаги и углы поворота математически. Допустим, вам нужно нарисовать спираль с равномерно увеличивающимся радиусом:

Code
1
2
3
4
5
использовать Черепаха
нц для i от 1 до 100
   вперед(i/10)  // Шаг постепенно растет
   вправо(10)
кц
В этом примере длина шага увеличивается с каждой итерацией, создавая эффект спирали. Играя с этими параметрами, можно создавать боле сложные формы. Ещё один важный момент — абсолютные и относительные повороты. Команды вправо(A) и влево(A) выполняют относительный поворот от текущего направления. Но иногда удобнее указать абсолютный угол с помощью команды повернуться на угол(A), где 0 градусов — направление на север (вверх экрана), 90 — на восток (вправо) и так далее.

Code
1
2
3
4
5
использовать Черепаха
повернуться на угол(45)
вперед(100)
повернуться на угол(135)  // Абсолютный угол!
вперед(100)
Этот код нарисует букву "V", потому что второй поворот устанавливает абсолютное направление, а не добавляет угол к текущему. Иногда это спасает от сложных расчётов при создании геометрических фигур.

Одна из распространенных ошибок новичков — путаница с направлением поворота. В КуМир, как и в большинстве систем с Черепахой, положительный угол при команде вправо() соответствует повороту по часовой стрелке, а при команде влево() — против часовой. Это противоречит математической традиции, где положительный угол обычно отсчитывается против часовой стрелки. Еще один фундаментальный аспект работы с Черепахой — это понимание относительной и абсолютной системы координат. В начале работы Черепаха находится в точке (0, 0) и ориентирована на север. При движении вперед она перемещается в направлении своего текущего угла, а не строго вдоль осей координат.

Это отличается от работы в абсолютной системе координат, где перемещение всегда происходит параллельно осям. В КуМир есть специальная команда для такого перемещения:

Code
1
2
3
4
использовать Черепаха
поднять перо
сместиться в точку(100, 100)  // Прямое перемещение в точку с координатами (100, 100)
опустить перо
Комбинирование относительного и абсолютного перемещения открывает богатые возможности для создания сложных рисунков с минимальным количеством кода. Давайте рассмотрим пример, который сочетает многие из обсуждаемых принципов — рисование звезды:

Code
1
2
3
4
5
использовать Черепаха
нц для i от 1 до 5
   вперед(100)
   вправо(144)  // Угол для пятиконечной звезды: 180 - 360/5 = 144
кц
Почему угол поворота равен 144 градусам? Это связано с геометрией пятиконечной звезды: при соединении каждой второй вершины правильного пятиугольника получается именно такой угол. Для звёзд с другим количеством вершин формула будет иной: 180 - (360/n). Этот пример демонстрирует, как понимание математических принципов помогает создавать красивые геометрические фигуры с помощью простых команд Черепахи.

Для эффективной работы с Черепахой полезно освоить ещё один приём — предварительный расчёт параметров. Допустим, вам нужно нарисовать равносторонний треугольник со стороной определённой длины:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
использовать Черепаха
алг треугольник(длина)
нач
   нц для i от 1 до 3
      вперед(длина)
      вправо(120)  // Внешний угол равностороннего треугольника
   кц
кон
 
треугольник(50)
поднять перо
вправо(90)
вперед(100)
влево(90)
опустить перо
треугольник(75)
Здесь мы сначала создаем процедуру для рисования треугольника, а затем дважды используем её с разными параметрами. Такой модульный подход к программированию делает код более читаемым и облегчает внесение изменений. Заметьте, как мы аккуратно переместили Черепаху между двумя треугольниками — подняли перо, сдвинулись, снова опустили перо. Такие операции особенно важны при создании композитных рисунков.

Исполнитель Черепаха
Честно говоря, без понятия куда обратиться из разделов. Не помогли бы разобраться с кодом на кумире(без понятия что за исполнитель...) ...

Исполнитель Черепаха
У меня проблема с использованием исполнителя черепахи в кумире: когда я запускаю код, на карте, на которой расположена черепаха, почему-то нет...

Задача Гиа: какая фигура появится на экране при выполнении Исполнителем Черепашка данного алгоритма?
Исполнитель Черепашка перемещается на экране компьютера, оставляя след в виде линии. В каждый конкретный момент известно положение исполнителя и...

[КуМир] Нарисовать график функции y = tg(x+1)^2, исполнитель Рисователь
Ребят, простите дурака, но я не знаю где найти нужный форум по КУМИРУ, но так как он мне безумно напоминает Паскаь, пишу суда. Нужно...


Решение простых геометрических задач



Теперь, когда мы разобрались с базовыми принципами работы Черепахи, давайте перейдем к решению конкретных задач. Начнем с простых геометрических построений — это идеальный способ освоить команды Черепахи на практике и развить алгоритмическое мышление.

Построение квадратов и прямоугольников



Квадрат — самая простая фигура для начала работы с Черепахой. Его построение требует всего четырех одинаковых отрезков и четырех поворотов на 90 градусов. Вот базовый код:

Code
1
2
3
4
5
использовать Черепаха
нц для i от 1 до 4
   вперед(100)
   вправо(90)
кц
Обратите внимание, что после выполнения этого кода Черепаха возвращается в исходную точку с исходным направлением. Это очень удобно для построения сложных фигур — вы всегда знаете, где и как ориентирована Черепаха после завершения рисования базовой фигуры. А что если нам нужен не квадрат, а прямоугольник с заданными сторонами? Немного усложним алгоритм:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
использовать Черепаха
алг прямоугольник(ширина, высота)
нач
   вперед(ширина)
   вправо(90)
   вперед(высота)
   вправо(90)
   вперед(ширина)
   вправо(90)
   вперед(высота)
   вправо(90)
кон
 
прямоугольник(150, 80)
Заметьте, что я сразу оформил код в виде процедуры с параметрами — это позволит нам легко использовать его повторно. Однако здесь есть повторяющийся код, который можно оптимизировать с использованием цикла:

Code
1
2
3
4
5
6
7
8
9
алг прямоугольник(ширина, высота)
нач
   нц для i от 1 до 2
      вперед(ширина)
      вправо(90)
      вперед(высота)
      вправо(90)
   кц
кон
Часто нужно нарисовать несколько квадратов или прямоугольников рядом. Вот код для построения трех квадратов разного размера в ряд:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
использовать Черепаха
алг квадрат(размер)
нач
   нц для i от 1 до 4
      вперед(размер)
      вправо(90)
   кц
кон
 
нц для размер от 30 до 90 шаг 30
   квадрат(размер)
   поднять перо
   вперед(размер + 20)  // Отступ между квадратами
   опустить перо
кц
А что насчет построения вложенных квадратов? Эта задача чуть сложнее, но она отлично демонстрирует, как используются циклы для создания интересных визуальных эффектов:

Code
1
2
3
4
5
6
7
8
9
10
11
использовать Черепаха
нц для размер от 100 до 20 шаг -20
   нц для i от 1 до 4
      вперед(размер)
      вправо(90)
   кц
   вперед(10)
   вправо(90)
   вперед(10)
   вправо(90)
кц
Этот код создает эффект "туннеля" из квадратов. После каждого квадрата Черепаха смещается внутрь на 10 шагов, что позволяет начать рисовать следующий квадрат меньшего размера.

Построение правильных многоугольников разной сложности



Перейдем от четырехугольников к многоугольникам с произвольным числом сторон. Правильный многоугольник — это фигура, у которой все стороны и все углы равны. Формула для внешнего угла правильного n-угольника: 360 / n градусов.

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
использовать Черепаха
алг многоугольник(стороны, длина)
нач
   нц для i от 1 до стороны
      вперед(длина)
      вправо(360 / стороны)
   кц
кон
 
многоугольник(6, 50)  // Шестиугольник
поднять перо
назад(150)
опустить перо
многоугольник(8, 50)  // Восьмиугольник
Обратите внимание, как просто мы смогли обобщить алгоритм для любого количества сторон. Это один из принципов хорошего программирования — создавать универсальные решения. Интересная задача — нарисовать "цветок" из правильных многоугольников:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
использовать Черепаха
алг многоугольник(стороны, длина)
нач
   нц для i от 1 до стороны
      вперед(длина)
      вправо(360 / стороны)
   кц
кон
 
нц для лепестки от 1 до 8
   многоугольник(5, 40)  // Пятиугольник
   вправо(45)  // 360 / 8 = 45 (для равномерного распределения)
кц
Этот код создает визуально привлекательный узор, напоминающий цветок, где каждый "лепесток" — правильный пятиугольник. Меняя количество лепестков и сторон в многоугольнике, можно получать различные узоры.

Создание окружностей и спиралей



Строго говоря, нарисовать идеальную окружность с помощью Черепахи невозможно, поскольку мы можем перемещать её только по прямым линиям. Однако мы можем аппроксимировать окружность, используя многоугольник с большим количеством сторон:

Code
1
2
3
4
5
6
7
8
9
10
11
использовать Черепаха
алг окружность(радиус)
нач
   длина_отрезка = 2 * 3.14159 * радиус / 360  // Длина дуги
   нц для i от 1 до 360
      вперед(длина_отрезка)
      вправо(1)  // Малый угол для плавного поворота
   кц
кон
 
окружность(50)
В этом коде я использовал формулу для вычисления длины дуги: 2πR/360, где R — радиус окружности. Делаем 360 шагов, поворачивая на 1 градус после каждого, что дает довольно гладкую окружность. А теперь давайте создадим спираль — одну из самых интересных фигур, которые можно нарисовать с помощью Черепахи:

Code
1
2
3
4
5
использовать Черепаха
нц для i от 1 до 200
   вперед(i / 10)  // Постепенное увеличение шага
   вправо(10)  // Постоянный угол поворота
кц
В этом примере длина шага линейно увеличивается с каждой итерацией, создавая классическую архимедову спираль. Если же мы хотим создать логарифмическую спираль, можно использовать экспоненциальный рост:

Code
1
2
3
4
5
6
7
использовать Черепаха
шаг = 1
нц для i от 1 до 100
   вперед(шаг)
   вправо(10)
   шаг = шаг * 1.05  // Экспоненциальный рост
кц
Интересный эффект получается при комбинировании спиралей и изменении цвета пера:

Code
1
2
3
4
5
6
использовать Черепаха
нц для i от 1 до 300
   установить перо((i div 50) mod 6 + 1)  // Периодическое изменение цвета
   вперед(i / 10)
   вправо(15)
кц
Здесь я использовал операцию деления нацело (div) и остаток от деления (mod) для циклической смены цветов пера каждые 50 итераций.

Создание параллельных и перпендикулярных линий



Умение рисовать параллельные и перпендикулярные линии — базовый навык для построения сложных геометрических фигур. Рассмотрим, как можно создать сетку из параллельных линий:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
использовать Черепаха
// Горизонтальные линии
поднять перо
сместиться в точку(-100, -100)  // Начинаем с левого нижнего угла
нц для y от -100 до 100 шаг 20
   сместиться в точку(-100, y)
   опустить перо
   вперед(200)  // Длина линии
   поднять перо
кц
 
// Вертикальные линии
нц для x от -100 до 100 шаг 20
   сместиться в точку(x, -100)
   повернуться на угол(90)  // Устанавливаем направление вверх
   опустить перо
   вперед(200)
   поднять перо
кц
В этом примере мы используем абсолютное позиционирование для создания сетки. Обратите внимание, что между рисованием линий перо поднимается, чтобы не оставлять следы при перемещении к новой позиции.

А как насчёт создания паркетного узора из параллельных и перпендикулярных линий? Это чуть сложнее, но очень наглядно:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
использовать Черепаха
размер = 20
повторы = 8
поднять перо
сместиться в точку(-повторы * размер / 2, -повторы * размер / 2)
опустить перо
 
нц для i от 1 до повторы
   нц для j от 1 до повторы
      // Рисуем квадрат
      нц для к от 1 до 4
         вперед(размер)
         вправо(90)
      кц
      // Рисуем диагональ
      вперед(размер)
      вправо(45)
      вперед(размер * 1.414)  // Длина диагонали квадрата
      назад(размер * 1.414)
      влево(45)
      // Перемещаемся к следующей позиции
      поднять перо
      вперед(размер)
      опустить перо
   кц
   // Переход на новую строку
   поднять перо
   назад(повторы * размер)
   вправо(90)
   вперед(размер)
   влево(90)
   опустить перо
кц
Этот код создает решетку из квадратов с диагональными линиями, подобно некоторым узорам паркета. Здесь применяется вложенный цикл: внешний цикл для строк, внутренний — для элементов в каждой строке.

Подводя итог этой части, отмечу, что освоение простых геометрических фигур — отличная база для перехода к более сложным алгоритмическим задачам. Комбинируя базовые фигуры и применяя циклы, вы сможете создавать впечатляющие визуальные эффекты с минимальными усилиями.

Сложнее геометрические задачи: мозаики и шаблоны



Мозаики - это отличный способ объединить несколько базовых фигур в единую композицию. Давайте попробуем создать простую мозаику из треугольников:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
использовать Черепаха
алг треугольник(размер)
нач
   нц для i от 1 до 3
      вперед(размер)
      вправо(120)
   кц
кон
 
нц для ряд от 1 до 5
   нц для колонка от 1 до ряд
      треугольник(40)
      поднять перо
      вперед(40)
      опустить перо
   кц
   поднять перо
   назад(40 * ряд)
   вправо(90)
   вперед(40)
   влево(90)
   опустить перо
кц
В этом примере мы создаем треугольную мозаику, где каждая строка содержит на один треугольник больше предыдущей. Такой подход формирует треугольную структуру высшего порядка, состоящую из маленьких треугольников. А теперь усложним задачу и создадим шахматную доску:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
использовать Черепаха
размер_клетки = 30
цвет_белый = 6 // желтый
цвет_черный = 1 // черный
 
поднять перо
сместиться в точку(-120, -120) // Начало координат - левый нижний угол
опустить перо
 
нц для ряд от 1 до 8
   нц для клетка от 1 до 8
      // Определяем цвет клетки
      если (ряд + клетка) mod 2 = 0 то
         установить перо(цвет_белый)
      иначе
         установить перо(цвет_черный)
      все
      
      // Закрашиваем клетку
      нц для сторона от 1 до 4
         вперед(размер_клетки)
         вправо(90)
      кц
      
      // Перемещаемся к следующей клетке
      поднять перо
      вперед(размер_клетки)
      опустить перо
   кц
   
   // Переходим на новый ряд
   поднять перо
   назад(8 * размер_клетки)
   вправо(90)
   вперед(размер_клетки)
   влево(90)
   опустить перо
кц
Этот код использует операцию остатка от деления (mod) для определения цвета клетки - если сумма номеров ряда и клетки чётная, клетка "белая" (жёлтая), иначе - "чёрная".

Создание декоративных узоров



Перейдем к более изящным декоративным узорам. Вот код для создания цветка с лепестками в виде дуг:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
использовать Черепаха
алг лепесток(размер)
нач
   нц для i от 1 до 60
      вперед(размер/30)
      вправо(3)
   кц
кон
 
нц для i от 1 до 12
   установить перо((i mod 6) + 1)  // Циклически меняем цвет
   лепесток(60)
   вправо(30)  // 360 / 12 = 30 градусов между лепестками
кц
В этом коде лепесток формируется как дуга, где Черепаха постепенно поворачивает вправо, создавая изгиб. Затем мы рисуем 12 таких лепестков, равномерно распределенных по кругу. Еще одна интересная декоративная фигура - розетка, созданная путем пересечения окружностей:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
использовать Черепаха
алг окружность(радиус)
нач
   длина_шага = 2 * 3.14159 * радиус / 120  // Аппроксимация окружности 120 отрезками
   нц для i от 1 до 120
      вперед(длина_шага)
      вправо(3)  // 360 / 120 = 3
   кц
кон
 
радиус = 80
нц для i от 1 до 8
   поднять перо
   вперед(радиус / 2)  // Смещение центра окружности
   опустить перо
   окружность(радиус / 2)
   поднять перо
   назад(радиус / 2)
   вправо(45)  // 360 / 8 = 45
   опустить перо
кц
В этом примере мы создаем 8 окружностей, центры которых расположены равномерно по большей окружности. Это создает красивый симметричный узор, похожий на цветок.

Геометрические оптические иллюзии



Черепаха отлично подходит для создания геометрических оптических иллюзий. Вот код для создания иллюзии объёмного куба:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
использовать Черепаха
размер = 100
 
// Рисуем верхнюю грань
нц для i от 1 до 4
   вперед(размер)
   вправо(90)
кц
 
// Рисуем боковые ребра
нц для i от 1 до 4
   поднять перо
   нц для j от 1 до i - 1
      вперед(размер)
      вправо(90)
   кц
   опустить перо
   вправо(45)
   вперед(размер / 2)
   поднять перо
   назад(размер / 2)
   влево(45)
   опустить перо
кц
 
// Рисуем нижнюю грань
поднять перо
вправо(45)
вперед(размер / 2)
вправо(45)
опустить перо
нц для i от 1 до 4
   вперед(размер)
   вправо(90)
кц
Этот код создаёт иллюзию куба, рисуя сначала верхнюю грань (квадрат), затем боковые ребра и, наконец, нижнюю грань.

Задачи с нестандартными инструментами: штриховка и заливка



В некоторых задачах с Черепахой требуется создать эффект заливки или штриховки. Вот пример штриховки прямоугольной области:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
использовать Черепаха
ширина = 100
высота = 80
шаг_штриховки = 5
 
// Сначала рисуем контур
нц для i от 1 до 2
   вперед(ширина)
   вправо(90)
   вперед(высота)
   вправо(90)
кц
 
// Теперь делаем штриховку
поднять перо
вправо(90)
нц для y от 0 до высота шаг шаг_штриховки
   сместиться в точку(0, y)
   опустить перо
   вперед(ширина)
   поднять перо
кц
влево(90)
Этот код создает прямоугольник, а затем штрихует его горизонтальными линиями. Штриховка может быть и диагональной:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
использовать Черепаха
ширина = 100
высота = 80
шаг_штриховки = 8
 
// Контур
нц для i от 1 до 2
   вперед(ширина)
   вправо(90)
   вперед(высота)
   вправо(90)
кц
 
// Диагональная штриховка
поднять перо
нц для y от -ширина до высота + ширина шаг шаг_штриховки
   сместиться в точку(0, y)
   повернуться на угол(-45)
   опустить перо
   вперед(ширина * 1.5)  // Чуть длиннее диагонали
   поднять перо
кц
Иногда необходимо решить задачу на создание градиентной заливки. Вот пример, как это можно сделать:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
использовать Черепаха
размер = 100
шагов = 20
 
нц для i от 1 до шагов
   установить перо((i mod 6) + 1)  // Циклически меняем цвет
   установить размер(6 - (i / шагов * 5))  // Толщина линии уменьшается
   нц для j от 1 до 4
      вперед(размер - (i * размер / шагов / 2))
      вправо(90)
   кц
   поднять перо
   вперед(размер / шагов / 2)
   вправо(90)
   вперед(размер / шагов / 2)
   влево(90)
   опустить перо
кц
Этот код создает эффект "туннеля" из квадратов с постепенно уменьшающейся толщиной линии и меняющимся цветом, что создает интересный градиентный эффект. Теперь вы знаете, как решать разнообразные геометрические задачи с помощью исполнителя Черепаха в КуМир. Эти примеры демонстрируют, что даже с ограниченным набором команд можно создавать сложные и интересные графические построения. Главное - понимать принципы геометрии и уметь разбивать сложную задачу на простые шаги.

В следующем разделе мы рассмотрим, как использовать алгоритмические конструкции для создания ещё более сложных и интересных рисунков.

Алгоритмические конструкции в задачах



Переходим к самому интересному — использованию алгоритмических конструкций для создания по-настоящему крутых программ для Черепахи. Если базовые геометрические задачи были разминкой, то сейчас мы начинаем работать всерьёз. Именно здесь проявляется настоящая мощь программирования, позволяющая создавать сложные рисунки с помощью компактного и элегантного кода.

Циклы для повторяющихся элементов



Циклы — это сердце большинства программ для Черепахи. Без них пришлось бы писать одни и те же команды снова и снова. Представьте, что вам нужно нарисовать ряд из 10 одинаковых квадратов — без цикла это превратилось бы в монотонное копирование кода. В КуМир есть несколько видов циклов, но наиболее часто используются циклы нц с различными вариантами. Вот простейший пример рисования нескольких квадратов с увеличивающимся размером:

Code
1
2
3
4
5
6
7
8
9
10
11
12
использовать Черепаха
нц для размер от 20 до 100 шаг 20
    нц для i от 1 до 4
        вперед(размер)
        вправо(90)
    кц
    
    // Перемещение к следующей позиции
    поднять перо
    вперед(размер + 10)
    опустить перо
кц
В этом коде внешний цикл управляет размером квадратов и их позицией, а внутренний отвечает за рисование каждого квадрата. Обратите внимание, как легко менять параметры — хотите 10 квадратов вместо 5? Просто измените диапазон цикла.

Я часто сталкиваюсь с задачей нарисовать серию объектов, расположенных по кругу. Вот элегантное решение для размещения треугольников по окружности:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
использовать Черепаха
кол_фигур = 8
радиус = 100
размер = 30
 
нц для i от 1 до кол_фигур
    // Сохраняем начальную позицию
    поднять перо
    вперед(радиус)
    опустить перо
    
    // Рисуем треугольник
    нц для j от 1 до 3
        вперед(размер)
        вправо(120)
    кц
    
    // Возвращаемся и поворачиваемся для следующей фигуры
    поднять перо
    назад(радиус)
    вправо(360 / кол_фигур)
    опустить перо
кц
Здесь мы используем цикл для равномерного распределения фигур по окружности. Этот шаблон крайне полезен — придумайте любую фигуру, поместите её в место внутреннего цикла, и вы получите красивую радиальную композицию.

Кстати, циклы полезны не только для повторения фигур, но и для создания градиентных эффектов. Вот пример спирали с меняющимся цветом:

Code
1
2
3
4
5
6
7
8
использовать Черепаха
шаг = 1
нц для i от 1 до 250
    установить перо(((i div 40) mod 6) + 1)
    вперед(шаг)
    вправо(15)
    шаг = шаг + 0.2
кц
В этом примере мы используем деление нацело (div) и остаток от деления (mod) чтобы циклически менять цвет через каждые 40 шагов. Это создаёт красивый радужный эффект в изгибах спирали.

Отдельно стоит упомянуть про цикл пока — он особенно полезен, когда условие выхода не связано с счётчиком итераций, а определяется какими-то внешними факторами:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
использовать Черепаха
размер = 5
макс_размер = 100
 
нц пока размер <= макс_размер
    нц для i от 1 до 4
        вперед(размер)
        вправо(90)
    кц
    поднять перо
    вправо(15)
    опустить перо
    размер = размер * 1.2
кц
Здесь мы рисуем квадраты увеличивающегося размера, поворачивая каждый раз на 15 градусов, пока размер не превысит заданный предел. Кстати, этот код создаёт красивый эффект вращающейся спирали из квадратов.

А порой простые циклы позволяют создавать неожиданно сложные и красивые фигуры. Вот, например, математическая кривая — кардиоида:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
использовать Черепаха
радиус = 100
шаг = 5
поднять перо
повернуться на угол(90)
вперед(радиус)
повернуться на угол(90)
опустить перо
 
нц для угол от 0 до 360 шаг шаг
    поднять перо
    повернуться на угол(угол - 90)
    вперед(радиус)
    опустить перо
    повернуться на угол(180)
    вперед(2 * радиус * sin(угол / 2 * 3.14159 / 180))
    поднять перо
    назад(2 * радиус * sin(угол / 2 * 3.14159 / 180))
    повернуться на угол(270 - угол)
    опустить перо
кц
Этот код может показаться сложноватым, но он использует тригонометрическую формулу кардиоиды. При каждой итерации Черепаха передвигается в определенную точку на окружности и рисует линию к другой точке на окружности, создавая эффект огибающей.

Кстати, в своей практике я часто использую прием "вложенных циклов" — цикл внутри другого цикла. Это незаменимо для создания сеток и узоров. Вот пример создания сетки из шестиугольников (сотовый узор):

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
использовать Черепаха
размер = 20
ряды = 5
колонки = 6
 
поднять перо
сместиться в точку(-колонки * размер * 1.5, -ряды * размер * 1.5)
опустить перо
 
нц для ряд от 1 до ряды
нц для кол от 1 до колонки
    // Рисуем шестиугольник
    нц для i от 1 до 6
        вперед(размер)
        вправо(60)
    кц
    
    // Перемещаемся к следующему шестиугольнику в ряду
    поднять перо
    вперед(размер * 2)
    опустить перо
кц
// Перемещаемся на новый ряд со смещением
поднять перо
назад(колонки * размер * 2)
вправо(90)
вперед(размер * 1.75)
влево(90)
вперед(размер)
опустить перо
кц
Здесь мы создаем "медовые соты", где каждый последующий ряд смещен для более плотного расположения шестиугольников. Этот тип структуры часто встречается в природе из-за своей эффективности.

Вложенные циклы в графических построениях



Вложенные циклы открывают невероятные возможности для графических построений. Один из моих любимых примеров — создание узора "гильош", похожего на те, что используются для защиты банкнот:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
использовать Черепаха
радиус = 100
шаг_угла = 5
шаг_смещения = 2
 
нц для смещение от 0 до радиус шаг шаг_смещения
    поднять перо
    сместиться в точку(смещение, 0)
    опустить перо
    
    нц для угол от 0 до 360 шаг шаг_угла
        повернуться на угол(угол)
        вперед(радиус)
        назад(радиус)
        повернуться на угол(-угол)
    кц
    
    поднять перо
    сместиться в точку(0, 0)
    опустить перо
кц
Этот код создает серию окружностей с лучами, исходящими из точек, расположенных вдоль оси X. Результат напоминает сложные геометрические узоры, которые трудно подделать — идеально для защиты документов!

Ещё один интересный эффект, который можно получить с помощью вложенных циклов — это муаровые узоры. Вот пример:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
использовать Черепаха
размер = 150
частота = 5
шаг_линии = 2
 
поднять перо
сместиться в точку(-размер, -размер)
опустить перо
 
нц для y от -размер до размер шаг шаг_линии
    поднять перо
    сместиться в точку(-размер, y)
    опустить перо
    вперед(размер * 2)
кц
 
поднять перо
сместиться в точку(-размер, -размер)
повернуться на угол(5)
опустить перо
 
нц для y от -размер до размер шаг шаг_линии
    поднять перо
    сместиться в точку(-размер * cos(5 * 3.14159/180), y - размер * sin(5 * 3.14159/180))
    повернуться на угол(5)
    опустить перо
    вперед(размер * 2 / cos(5 * 3.14159/180))
    повернуться на угол(-5)
кц
Этот код рисует две серии параллельных линий под небольшим углом друг к другу. Когда эти линии пересекаются, они создают волнистый муаровый узор — оптическую иллюзию, которая кажется движущейся, если немного наклонить голову. Вложенные циклы отлично подходят и для создания фрактальных узоров, о которых мы поговорим позже.

Ещё один полезный прием — использование вложенных циклов с переменным шагом. Например, для создания радиальной сетки:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
использовать Черепаха
макс_радиус = 150
круги = 10
лучи = 12
 
// Рисуем концентрические окружности
нц для р от 1 до круги
    радиус = макс_радиус * р / круги
    поднять перо
    сместиться в точку(0, -радиус)
    опустить перо
    
    нц для угол от 0 до 360 шаг 5
        вперед(2 * 3.14159 * радиус / 72)  // 360/5 = 72 сегмента
        вправо(5)
    кц
    
    поднять перо
    сместиться в точку(0, 0)
    опустить перо
кц
 
// Рисуем радиальные лучи
нц для л от 0 до лучи - 1
    угол = 360 * л / лучи
    поднять перо
    повернуться на угол(угол)
    опустить перо
    вперед(макс_радиус)
    поднять перо
    назад(макс_радиус)
    повернуться на угол(-угол)
    опустить перо
кц
Этот код создаёт визуально сложную радиальную сетку, похожую на паутину или диаграмму из полярных координат. При этом он использует всего два вложенных цикла!

Условия и ветвления



Циклы — это только половина дела. Условные конструкции в программировании для Черепахи позволяют создавать интерактивные и адаптивные рисунки. В КуМир основная условная конструкция — это если ... то ... иначе ... все.

Рассмотрим пример создания шахматного узора с использованием условий:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
использовать Черепаха
размер_клетки = 30
поля = 8
 
поднять перо
сместиться в точку(-поля * размер_клетки / 2, -поля * размер_клетки / 2)
опустить перо
 
нц для ряд от 1 до поля
нц для клетка от 1 до поля
    если (ряд + клетка) mod 2 = 0 то
        установить перо(1) // черный
    иначе
        установить перо(6) // желтый
    все
    
    // Заполняем клетку
    нц для к от 1 до 4
        вперед(размер_клетки)
        вправо(90)
    кц
    
    поднять перо
    вперед(размер_клетки)
    опустить перо
кц
поднять перо
назад(поля * размер_клетки)
вправо(90)
вперед(размер_клетки)
влево(90)
опустить перо
кц
В этом примере создается доска 8×8 с чередующимися черными и жёлтыми квадратами. Условие (ряд + клетка) mod 2 = 0 определяет, какого цвета будет текущая клетка — это классический способ создания шахматного узора.

Условия могут определять не только цвет, но и форму:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
использовать Черепаха
нц для i от 1 до 12
    если i mod 3 = 0 то
        // Круг
        нц для j от 1 до 36
            вперед(5)
            вправо(10)
        кц
    иначе_если i mod 3 = 1 то
        // Квадрат
        нц для j от 1 до 4
            вперед(50)
            вправо(90)
        кц
    иначе
        // Треугольник
        нц для j от 1 до 3
            вперед(50)
            вправо(120)
        кц
    все
    
    // Перемещаемся для следующей фигуры
    поднять перо
    вперед(80)
    опустить перо
кц
В этом коде мы рисуем последовательность фигур: круг, квадрат, треугольник, повторяющуюся 4 раза. Условие, основанное на остатке от деления на 3, определяет, какую из трех фигур нужно нарисовать на текущем шаге.

Я часто использую условия для создания "случайных" узоров, основанных на закономерностях:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
использовать Черепаха
алг псевдослучайное(число)
нач
    рез = (число * 1103515245 + 12345) mod 32768
    знач рез
кон
 
сид = 12345
нц для i от 1 до 50
    сид = псевдослучайное(сид)
    направление = сид mod 4
    
    если направление = 0 то
        вперед(20)
    иначе_если направление = 1 то
        вправо(90)
        вперед(20)
    иначе_если направление = 2 то
        назад(20)
    иначе
        влево(90)
        вперед(20)
    все
кц
Этот код создает "случайное блуждание" Черепахи, используя простой линейный конгруэнтный генератор псевдослучайных чисел. На каждом шаге мы генерируем новое псевдослучайное число и, в зависимости от его значения, двигаемся в одном из четырех направлений. Результат — интересный лабиринтоподобный узор.

Условия также полезны для обработки исключительных случаев:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
использовать Черепаха
нц для сторон от 3 до 10
    если сторон < 6 то
        установить перо(2)  // синий для фигур с малым числом сторон
    иначе_если сторон < 9 то
        установить перо(3)  // зеленый для средних фигур
    иначе
        установить перо(4)  // красный для многоугольников
    все
    
    // Рисуем правильный многоугольник
    нц для i от 1 до сторон
        вперед(30)
        вправо(360 / сторон)
    кц
    
    // Перемещаемся для следующей фигуры
    поднять перо
    вперед(70)
    опустить перо
кц
Этот код рисует ряд многоугольников от треугольника до десятиугольника, окрашивая их в разные цвета в зависимости от количества сторон. Такой подход позволяет визуально группировать похожие фигуры.

Использование счетчиков и переменных



Переменные — ещё один мощный инструмент при работе с Черепахой. Они позволяют создавать параметризованные узоры и отслеживать состояние во времени рисования. Давайте начнем с простого примера создания спирали с меняющимся шагом:

Code
1
2
3
4
5
6
7
8
использовать Черепаха
шаг = 1
угол = 15
нц для i от 1 до 100
    вперед(шаг)
    вправо(угол)
    шаг = шаг + 0.5  // Увеличиваем шаг с каждой итерацией
кц
Переменная шаг здесь хранит текущую длину шага и увеличивается с каждой итерацией, создавая эффект расширяющейся спирали.

А вот более сложный пример с двумя переменными для создания звезды с заданным количеством лучей:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
использовать Черепаха
алг звезда(лучи, размер)
нач
    // Вычисляем угол поворота для звезды
    // Для n-конечной звезды: 360 * k / n, где k и n взаимно просты
    // Обычно используют k = n/2 (округление вверх) для звезд
    угол = 180 - (180 / лучи)
    
    нц для i от 1 до лучи
        вперед(размер)
        вправо(угол)
    кц
кон
 
// Рисуем несколько звезд
нц для лучей от 5 до 11 шаг 2  // Только звезды с нечетным числом лучей
    звезда(лучей, 80)
    поднять перо
    вперед(150)
    опустить перо
кц
В этой процедуре мы вычисляем угол поворота, необходимый для создания звезды с заданным числом лучей. Затем рисуем несколько звезд с разным количеством лучей.

Счетчики особенно полезны для отслеживания итераций и создания узоров, меняющихся со временем. Вот пример создания гармонограммы — фигуры Лиссажу:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
использовать Черепаха
алг гармонограмма(а1, а2, f1, f2, p1, p2, шаги)
нач
    // Параметры: амплитуды, частоты, фазы и количество шагов
    
    поднять перо
    // Перемещаемся в начальную точку
    начальный_x = а1 * sin(p1 * 3.14159 / 180)
    начальный_y = а2 * sin(p2 * 3.14159 / 180)
    сместиться в точку(начальный_x, начальный_y)
    опустить перо
    
    нц для t от 1 до шаги
        угол = 360 * t / шаги  // Угол в градусах
        
        // Вычисляем x и y по формулам гармонограммы
        x = а1 * sin(f1 * угол * 3.14159 / 180 + p1 * 3.14159 / 180)
        y = а2 * sin(f2 * угол * 3.14159 / 180 + p2 * 3.14159 / 180)
        
        // Перемещаемся в новую точку
        поднять перо
        сместиться в точку(x, y)
        опустить перо
    кц
кон
 
// Рисуем несколько гармонограмм с разными параметрами
гармонограмма(100, 100, 1, 2, 0, 0, 360)
поднять перо
сместиться в точку(0, 0)
опустить перо
гармонограмма(100, 100, 3, 2, 0, 90, 360)
Этот код создает две фигуры Лиссажу с разными частотами и фазами. Такие фигуры широко используются в физике для визуализации гармонических колебаний.

Иногда переменные можно использовать для создания сложных математических кривых. Например, вот код для рисования кардиоиды в полярных координатах:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
использовать Черепаха
радиус = 100
шаг_угла = 5
поднять перо
 
нц для угол от 0 до 360 шаг шаг_угла
    // Формула кардиоиды в полярных координатах: r = a(1 + cos(θ))
    р = радиус * (1 + cos(угол * 3.14159 / 180))
    
    // Преобразуем полярные координаты в декартовы
    х = р * cos(угол * 3.14159 / 180)
    y = р * sin(угол * 3.14159 / 180)
    
    // Перемещаемся в вычисленную точку
    сместиться в точку(х, y)
    
    если угол = 0 то
        опустить перо
    все
кц
Этот код использует математическую формулу кардиоиды в полярных координатах, преобразует полярные координаты в декартовы и перемещает Черепаху в соответствующие точки, создавая гладкую кривую.

Наконец, счетчики и переменные незаменимы при работе с рекурсивными структурами, такими как фракталы:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
использовать Черепаха
алг снежинка_коха(длина, уровень)
нач
    если уровень = 0 то
        вперед(длина)
    иначе
        // Рекурсивное разбиение
        снежинка_коха(длина/3, уровень-1)
        влево(60)
        снежинка_коха(длина/3, уровень-1)
        вправо(120)
        снежинка_коха(длина/3, уровень-1)
        влево(60)
        снежинка_коха(длина/3, уровень-1)
    все
кон
 
// Рисуем одну сторону снежинки Коха
снежинка_коха(100, 3)
В этом коде мы используем рекурсию для создания фрактальной кривой Коха. Переменная уровень отслеживает текущую глубину рекурсии, а переменная длина определяет размер текущего сегмента.

Эти примеры показывают, как алгоритмические конструкции — циклы, условия, переменные — превращают простой инструмент рисования в мощное средство создания сложных и красивых узоров. Сочетание этих конструкций открывает практически бесконечные возможности для творчества и экспериментов с Черепахой в КуМир.

Сложные графические построения



Когда начальный этап освоения Черепахи пройден, хочется чего-то более впечатляющего. Именно для таких случаев я подготовил набор техник для создания по-настоящему крутых изображений. Сложные графические построения — это та область, где программирование начинает граничить с искусством.

Фракталы и рекурсия



Фракталы — одна из самых завораживающих тем в компьютерной графике. Эти самоподобные структуры, где части похожи на целое, идеально подходят для реализации с помощью рекурсии. И Черепаха в КуМир может стать отличным инструментом для их создания.

Начнем с классического примера — кривой Коха. Это фрактал, который при бесконечном повторении образует знаменитую снежинку Коха:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
использовать Черепаха
алг кох(длина, уровень)
нач
  если уровень = 0 то
    вперед(длина)
  иначе
    кох(длина/3, уровень-1)
    влево(60)
    кох(длина/3, уровень-1)
    вправо(120)
    кох(длина/3, уровень-1)
    влево(60)
    кох(длина/3, уровень-1)
  все
кон
 
алг снежинка(длина, уровень)
нач
  нц для i от 1 до 3
    кох(длина, уровень)
    вправо(120)
  кц
кон
 
// Рисуем снежинку Коха 3-го уровня
снежинка(150, 3)
В этом коде рекурсивная функция кох моделирует один сегмент кривой. Параметр уровень определяет глубину рекурсии — чем он больше, тем детальнее получается фрактал. На нулевом уровне просто рисуется линия, а на каждом следующем происходит замена прямой линии на четыре меньших отрезка с характерным "зубцом" посередине. Интересно, что при увеличении уровня детализации периметр снежинки стремится к бесконечности, хотя площадь остается конечной. Такие парадоксы — типичная черта фрактальных структур.

Еще один знаменитый фрактал — треугольник Серпинского, еще называемый "решетом Серпинского". Он представляет собой самоподобную фигуру, где из центра равностороннего треугольника вырезается треугольник, соединяющий середины сторон, и так до бесконечности:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
использовать Черепаха
алг треугольник_серпинского(длина, уровень)
нач
  если уровень = 0 то
    // Рисуем базовый треугольник
    нц для i от 1 до 3
      вперед(длина)
      вправо(120)
    кц
  иначе
    треугольник_серпинского(длина/2, уровень-1)
    поднять перо
    вперед(длина/2)
    опустить перо
    треугольник_серпинского(длина/2, уровень-1)
    поднять перо
    влево(60)
    вперед(длина/2)
    вправо(60)
    опустить перо
    треугольник_серпинского(длина/2, уровень-1)
    поднять перо
    вправо(120)
    вперед(длина/2)
    влево(120)
    опустить перо
  все
кон
 
// Рисуем треугольник Серпинского 5-го уровня
треугольник_серпинского(200, 5)
В этом алгоритме мы рисуем три меньших треугольника Серпинского, размещая их в вершинах большего треугольника. С увеличением уровня рекурсии получается все более детализированная структура с хорошо заметным самоповторением. Однако, у рекурсии есть практический предел — слишком большая глубина вложенности может привести к переполнению стека или замедлить выполнение программы. В своей практике я обнаружил, что для Черепахи в КуМир оптимальны значения уровня от 3 до 5 — они дают хороший баланс между детализацией и производительностью.

Ещё один интересный фрактал, который прекрасно реализуется с помощью Черепахи — это дерево Пифагора. Оно моделирует ветвление деревьев, где каждая ветвь разделяется на две под определенным углом:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
использовать Черепаха
алг дерево(длина, уровень, угол)
нач
  если длина > 5 то
    вперед(длина)
    вправо(угол)
    дерево(длина*0.8, уровень-1, угол)
    влево(угол*2)
    дерево(длина*0.6, уровень-1, угол)
    вправо(угол)
    назад(длина)
  все
кон
 
повернуться на угол(270)
дерево(80, 7, 20)
В этом примере мы используем немного другой подход к рекурсии — вместо проверки уровня мы останавливаемся, когда длина ветви становится слишком малой. Это делает дерево более естественным, поскольку более короткие ветви прекращают ветвиться раньше.

Фракталы не только красивы, но и демонстрируют глубокую связь математики, программирования и искусства. Работая с ними, мы учимся разбивать сложные задачи на более простые и видеть закономерности там, где на первый взгляд их нет.

Построение снежинки Коха и других популярных фракталов



Мы уже рассмотрели базовую реализацию снежинки Коха, но давайте улучшим наш код, добавив возможность создания разноцветных фракталов и более сложных вариаций. Вот улучшенная версия снежинки Коха с градиентной окраской:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
использовать Черепаха
алг цветная_кривая_коха(длина, уровень, глубина)
нач
  // Меняем цвет в зависимости от глубины рекурсии
  установить перо((глубина mod 6) + 1)
  
  если уровень = 0 то
    вперед(длина)
  иначе
    цветная_кривая_коха(длина/3, уровень-1, глубина+1)
    влево(60)
    цветная_кривая_коха(длина/3, уровень-1, глубина+1)
    вправо(120)
    цветная_кривая_коха(длина/3, уровень-1, глубина+1)
    влево(60)
    цветная_кривая_коха(длина/3, уровень-1, глубина+1)
  все
кон
 
нц для i от 1 до 3
  цветная_кривая_коха(180, 4, 0)
  вправо(120)
кц
В этой версии мы добавили параметр глубина, который отслеживает текущий уровень вложенности и используется для выбора цвета. Каждый уровень рекурсии получает новый цвет, что создает красивый градиентный эффект. Ещё одной интересной вариацией кривой Коха является "квадратная снежинка", где вместо вырастания треугольного зубца мы добавляем квадратный выступ:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
использовать Черепаха
алг квадратная_кривая_коха(длина, уровень)
нач
  если уровень = 0 то
    вперед(длина)
  иначе
    квадратная_кривая_коха(длина/3, уровень-1)
    влево(90)
    квадратная_кривая_коха(длина/3, уровень-1)
    вправо(90)
    квадратная_кривая_коха(длина/3, уровень-1)
    вправо(90)
    квадратная_кривая_коха(длина/3, уровень-1)
    влево(90)
    квадратная_кривая_коха(длина/3, уровень-1)
  все
кон
 
// Создаем квадратную снежинку
нц для i от 1 до 4
  квадратная_кривая_коха(120, 3)
  вправо(90)
кц
Эта версия создает фрактал, больше похожий на причудливый городской рельеф или микросхему, чем на снежинку. Тут мы видим насколько разные формы могут принимать фракталы при небольшой модификации алгоритма.

Кроме кривой Коха, существует множество других известных фракталов. Рассмотрим, например, кривую Дракона — фрактал, который при каждой итерации как бы "складывается" подобно бумаге:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
использовать Черепаха
алг дракон(уровень, направление, длина)
нач
  если уровень = 0 то
    вперед(длина)
  иначе
    дракон(уровень-1, 1, длина)
    если направление = 1 то
      влево(90)
    иначе
      вправо(90)
    все
    дракон(уровень-1, -1, длина)
  все
кон
 
// Рисуем кривую Дракона 10-го уровня
дракон(10, 1, 5)
Красота кривой Дракона в том, что она никогда не пересекает сама себя, заполняя плоскость причудливым узором. Её название связано с тем, что при большом уровне рекурсии её форма напоминает силуэт дракона.

Ещё один удивительный фрактал — множество Жюлиа. Строго говоря, его полная реализация выходит за рамки возможностей Черепахи из-за сложных вычислений с комплексными числами, но мы можем создать аппроксимацию:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
использовать Черепаха
алг аппроксимация_жюлиа(макс_итераций, масштаб)
нач
  размер = 200
  поднять перо
  
  нц для x от -размер до размер шаг 4
    нц для y от -размер до размер шаг 8
      // Нормализуем координаты
      zx = x / размер * масштаб
      zy = y / размер * масштаб
      
      // Комплексное число c определяет форму множества
      cx = -0.7
      cy = 0.27
      
      // Проверяем, принадлежит ли точка множеству Жюлиа
      i = 0
      пока i < макс_итераций и (zx*zx + zy*zy) < 4
        // z = z^2 + c
        temp = zx*zx - zy*zy + cx
        zy = 2*zx*zy + cy
        zx = temp
        i = i + 1
      кц
      
      // Устанавливаем цвет в зависимости от скорости "убегания"
      если i = макс_итераций то
        установить перо(1) // Точка в множестве - черный
      иначе
        установить перо(i mod 6 + 1) // Градиент
      все
      
      // Рисуем пиксель
      сместиться в точку(x, y)
      опустить перо
      вперед(0)
      поднять перо
    кц
  кц
кон
 
аппроксимация_жюлиа(20, 1.5)
Этот код создает приблизительное изображение множества Жюлиа, проверяя для каждой точки, "убегает" ли она в бесконечность при итерациях функции z = z² + c с заданным комплексным параметром c. Точки, которые не убегают, принадлежат множеству.

Фракталы и рекурсия открывают перед нами удивительный мир самоподобных структур, где простые правила порождают невероятную сложность и красоту. Эксперименты с параметрами и вариациями алгоритмов позволяют создавать бесконечное разнообразие узоров, демонстрируя, что даже в ограниченной среде Черепахи можно создавать визуально поразительные результаты.

Симметричные узоры



Симметрия - одна из фундаментальных концепций в природе и искусстве. С помощью Черепахи можно создавать изумительно симметричные узоры, используя повторение и отражение базовых элементов. Давайте начнем с создания простого симметричного узора с радиальной симметрией:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
использовать Черепаха
алг лепесток(размер)
нач
  нц для i от 1 до 20
    вперед(размер / 10)
    вправо(9)
  кц
  нц для i от 1 до 20
    вперед(размер / 10)
    влево(9)
  кц
кон
 
нц для i от 1 до 8
  лепесток(80)
  вправо(45)  // 360 / 8 = 45 градусов
кц
Этот код создает цветок с восьмью лепестками, равномерно распределенными вокруг центра. Каждый лепесток имеет форму петли, созданной из двух дуг. С изменением числа лепестков и их формы можно получить множество разных вариаций.

Для создания более сложных симметричных узоров можно использовать технику зеркального отражения. Например, вот как можно создать глубоко симметричный узор с четырехкратной симметрией:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
использовать Черепаха
алг базовый_элемент(размер)
нач
  нц для i от 1 до 3
    вперед(размер)
    вправо(120)
  кц
  вправо(90)
  вперед(размер / 2)
  влево(90)
  нц для i от 1 до 3
    вперед(размер / 2)
    вправо(120)
  кц
кон
 
нц для i от 1 до 4
  базовый_элемент(50)
  вправо(90)
кц
Этот код рисует четыре набора треугольников, поворачивая каждый набор на 90 градусов. Результат - красивая симметричная мандала.

Интересный эффект создаётся при комбинировании осевой и поворотной симметрии:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
использовать Черепаха
алг спираль(длина, шаг)
нач
  нц для i от 1 до 20
    вперед(длина)
    вправо(90)
    длина = длина + шаг
  кц
кон
 
нц для i от 1 до 6
  спираль(5, 3)
  вправо(60)
кц
В этом примере мы создаём шесть спиралей, равномерно расположенных вокруг центра. Каждая спираль имеет форму расширяющегося квадрата. Вместе они создают гипнотический узор с гексагональной симметрией. Для создания более органичного вида можно добавить элемент случайности, сохраняя при этом симметрию:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
использовать Черепаха
алг симметричное_дерево(длина, угол, глубина)
нач
  если глубина > 0 то
    вперед(длина)
    вправо(угол)
    симметричное_дерево(длина * 0.7, угол + 5, глубина - 1)
    влево(угол * 2)
    симметричное_дерево(длина * 0.7, угол + 5, глубина - 1)
    вправо(угол)
    назад(длина)
  все
кон
 
повернуться на угол(270)  // Направляем Черепаху вверх
нц для i от 1 до 4
  симметричное_дерево(40, 15, 4)
  вправо(90)
кц
Этот код создаёт четыре симметричных "дерева", каждое повёрнутое на 90 градусов относительно соседнего. Увеличение угла с каждым уровнем глубины придаёт узору более естественный вид.

Создание сложных орнаментов с повторяющимися элементами



Орнаменты обычно состоят из повторяющихся элементов, организованных по определённой схеме. С Черепахой можно создавать сложные орнаменты, комбинируя базовые фигуры и трансформации. Начнём с создания бордюра - линейного орнамента с повторяющимся мотивом:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
использовать Черепаха
алг мотив(размер)
нач
  нц для i от 1 до 4
    вперед(размер)
    вправо(90)
  кц
  вперед(размер / 2)
  вправо(45)
  вперед(размер/2 * 1.414)  // Диагональ квадрата
  назад(размер/2 * 1.414)
  влево(45)
  вперед(размер / 2)
кц
 
поднять перо
сместиться в точку(-200, 0)
опустить перо
нц для i от 1 до 8
  мотив(30)
кц
В этом примере мы создаём орнамент из квадратов с диагоналями. Каждый элемент плавно переходит в следующий, создавая непрерывный бордюр.

Более сложный вариант - плитка или мозаика, заполняющая двумерное пространство:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
использовать Черепаха
алг плитка(размер)
нач
  нц для i от 1 до 4
    вперед(размер)
    вправо(90)
  кц
  
  // Добавляем внутренний узор
  вперед(размер / 4)
  влево(90)
  вперед(размер / 4)
  нц для i от 1 до 4
    вперед(размер / 2)
    вправо(90)
  кц
  назад(размер / 4)
  вправо(90)
  назад(размер / 4)
кон
 
поднять перо
сместиться в точку(-100, -100)
опустить перо
нц для ряд от 1 до 5
  нц для колонка от 1 до 5
    плитка(40)
    поднять перо
    вперед(40)
    опустить перо
  кц
  поднять перо
  назад(40 * 5)
  вправо(90)
  вперед(40)
  влево(90)
  опустить перо
кц
Этот код создаёт сетку 5x5 из плиток, каждая из которых содержит квадрат с меньшим квадратом внутри. Такие узоры часто встречаются в архитектуре и декоративно-прикладном искусстве.

Для создания более сложных орнаментов можно комбинировать разные элементы. Вот пример исламского геометрического узора:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
использовать Черепаха
алг звезда(размер)
нач
  нц для i от 1 до 8
    вперед(размер)
    вправо(135)
  кц
кон
 
алг восьмиугольник(размер)
нач
  нц для i от 1 до 8
    вперед(размер)
    вправо(45)
  кц
кон
 
нц для ряд от 1 до 3
  нц для колонка от 1 до 3
    // Рисуем восьмиугольник
    восьмиугольник(20)
    
    // Рисуем звезду внутри
    поднять перо
    вперед(20 / 2)
    вправо(22.5)
    опустить перо
    звезда(15)
    
    // Возвращаемся и перемещаемся к следующей позиции
    поднять перо
    влево(22.5)
    назад(20 / 2)
    вперед(60)
    опустить перо
  кц
  
  // Переход на новую строку
  поднять перо
  назад(3 * 60)
  вправо(90)
  вперед(60)
  влево(90)
  опустить перо
кц
Этот код создаёт сетку из восьмиугольников со звёздами внутри - типичный элемент исламского геометрического искусства. Пропорции и расположение элементов сбалансированы для создания гармоничного узора.

Особенно интересны орнаменты с повторяющимися элементами разного масштаба - такие узоры часто обладают фрактальными свойствами:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
использовать Черепаха
алг рекурсивный_орнамент(размер, уровень)
нач
  если уровень > 0 то
    нц для i от 1 до 6
      вперед(размер)
      если уровень > 1 то
        влево(60)
        рекурсивный_орнамент(размер / 3, уровень - 1)
        вправо(60)
      все
      вправо(60)
    кц
  все
кон
 
рекурсивный_орнамент(50, 2)
Этот код создаёт орнамент на основе шестиугольника, где каждая сторона может содержать меньший орнамент того же типа. При увеличении параметра уровень узор становится более сложным и детализированным.

Сочетание повторяющихся элементов с небольшими вариациями может создавать очень живописные узоры:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
использовать Черепаха
алг волна(амплитуда, длина, период)
нач
  поднять перо
  назад(длина / 2)
  опустить перо
  
  нц для x от -длина/2 до длина/2 шаг 2
    y = амплитуда * sin(x * 3.14159 / период)
    поднять перо
    сместиться в точку(x, y)
    опустить перо
    вперед(0.1)  // Точка
  кц
кон
 
нц для i от 1 до 8
  установить перо(i mod 6 + 1)
  волна(10 + i*2, 200, 20 + i*5)
  вправо(10)
кц
В этом примере мы создаём серию синусоидальных волн с разной амплитудой и периодом, слегка повёрнутых друг относительно друга. Результат напоминает муаровый узор или абстрактную композицию на тему движения. Орнаменты могут иметь не только декоративное, но и символическое значение. Например, узел удачи - традиционный элемент восточной символики:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
использовать Черепаха
установить размер(3)  // Увеличиваем толщину линии
 
поднять перо
сместиться в точку(-20, -20)
опустить перо
 
// Основа узла
вперед(40)
вправо(90)
вперед(40)
вправо(90)
вперед(40)
вправо(90)
вперед(40)
 
// Переплетения
поднять перо
сместиться в точку(-10, -20)
опустить перо
вправо(90)
вперед(20)
вправо(90)
вперед(20)
вправо(90)
вперед(20)
 
поднять перо
сместиться в точку(20, -10)
повернуться на угол(180)
опустить перо
вперед(20)
вправо(90)
вперед(20)
вправо(90)
вперед(20)
Этот код создаёт стилизованный узел удачи, состоящий из переплетающихся линий. Такие символические узоры можно использовать как элементы более сложных композиций. Графические орнаменты, созданные с помощью программирования, открывают удивительный мир на пересечении математики, искусства и информационных технологий. Экспериментируя с повторением, симметрией и вариациями элементов, можно создавать бесконечное разнообразие узоров, от строгих геометрических до витиеватых и органичных.

И помните - даже в рамках ограниченного набора команд Черепахи возможно создание впечатляющих визуальных эффектов. Главное - проявить творческий подход и не бояться экспериментировать с комбинированием различных техник и приёмов.

Разбор типичных ошибок



Программирование с Черепахой в КуМир кажется простым, но и здесь неизбежны ошибки. Особенно когда вы только начинаете или работаете над сложным проектом. За годы преподавания программирования я собрал целую коллекцию типичных ошибок, с которыми сталкиваются пользователи Черепахи. Давайте разберём самые распространённые из них и научимся их исправлять.

Отладка программ с Черепахой



Отладка — это искусство находить и устранять ошибки в программе. С Черепахой КуМир у нас есть несколько преимуществ: мы сразу видим результат работы программы в графическом виде, и среда поддерживает пошаговое выполнение кода. Первое, что нужно освоить для эффективной отладки — режим пошагового выполнения. Найдите кнопку "Шаг" в интерфейсе КуМир (обычно она выглядит как стрелка вправо) и используйте её для выполнения программы по одной команде за раз. Это позволяет увидеть, как именно движется Черепаха в каждый момент времени.
Вот типичный пример ошибки при рисовании квадрата:

Code
1
2
3
4
5
использовать Черепаха
нц для i от 1 до 3  // Ошибка! Должно быть до 4
    вперед(50)
    вправо(90)
кц
При пошаговом выполнении мы сразу заметим, что Черепаха нарисовала только три стороны квадрата. Исправление очевидно — изменить верхнюю границу цикла с 3 на 4.
А вот более коварная ошибка, связанная с неправильной последователностью команд:

Code
1
2
3
4
5
6
использовать Черепаха
нц для i от 1 до 5
    вперед(50)
    вправо(72)
    // Здесь отсутствует возвращение в исходную точку после рисования фигуры
кц
Этот код должен нарисовать пять отдельных пятиугольников, но вместо этого рисует пятиконечную звезду. Проблема в том, что мы не возвращаем Черепаху в исходную точку после каждого пятиугольника. Исправленный код:

Code
1
2
3
4
5
6
7
8
9
10
использовать Черепаха
нц для i от 1 до 5
    нц для j от 1 до 5
        вперед(50)
        вправо(72)
    кц
    поднять перо
    вперед(100)  // Смещение для следующей фигуры
    опустить перо
кц
Часто проблемы возникают при работе с рекурсивными функциями:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
использовать Черепаха
алг треугольник_серпинского(длина, уровень)
нач
    если уровень = 0 то
        нц для i от 1 до 3
            вперед(длина)
            вправо(120)
        кц
    иначе
        треугольник_серпинского(длина/2, уровень-1)
        поднять перо
        вперед(длина/2)
        опустить перо
        треугольник_серпинского(длина/2, уровень)  // Ошибка! Рекурсия без уменьшения уровня
        // Продолжение кода...
    все
кон
Здесь мы забыли уменьшить уровень во втором рекурсивном вызове, что приведёт к бесконечной рекурсии. При отладке такие ошибки выявляются по тому, что программа "зависает" или выдает ошибку переполнения стека.
Другая распространёная ошибка — неправильные углы поворота. Например, для рисования правильного семиугольника:

Code
1
2
3
4
5
использовать Черепаха
нц для i от 1 до 7
    вперед(50)
    вправо(45)  // Ошибка! Неправильный угол поворота
кц
Правильный внешний угол для семиугольника должен быть 360/7 ≈ 51.43 градуса, а не 45. При отладке мы увидим, что Черепаха не замыкает фигуру, а продолжает движение по спирали.
Также частая проблема — это ошибки в расчётах координат при построении сложных фигур:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
использовать Черепаха
// Пытаемся нарисовать сетку из квадратов
нц для ряд от 1 до 5
    нц для колонка от 1 до 5
        нц для i от 1 до 4
            вперед(20)
            вправо(90)
        кц
        поднять перо
        вперед(20)  // Ошибка! Недостаточное смещение между квадратами
        опустить перо
    кц
    поднять перо
    назад(100)
    вправо(90)
    вперед(20)
    влево(90)
    опустить перо
кц
Здесь смещение между квадратами должно быть равно размеру квадрата плюс некоторый отступ (например, вперед(25)). Иначе квадраты будут накладываться друг на друга.

На что обратить внимание



При работе с Черепахой есть несколько ключевых моментов, на которые стоит обратить особое внимание, чтобы избежать типичных ошибок.

1. Путаница с поворотами

Одна из самых распространенных проблем — путаница между командами вправо() и влево(). Это особенно проявляется при рисовании сложных фигур, где чередуются повороты в разные стороны.

Помогает визуализация: мысленно представьте себя на месте Черепахи и продумайте, в какую сторону надо повернуться. Или нарисуйте схему на бумаге перед реализацией в коде.
Также часто возникает непонимание между абсолютным и относительным поворотом:

Code
1
2
3
4
5
6
использовать Черепаха
вперед(50)
вправо(45)  // Относительный поворот на 45 градусов от текущего направления
вперед(50)
повернуться на угол(45)  // Абсолютный поворот в направление 45 градусов (северо-восток)
вперед(50)
В этом примере Черепаха сначала поворачивается на 45 градусов вправо от начального направления, а затем устанавливается абсолютный угол 45 градусов. Эти команды дают разные результаты, хотя числовые параметры одинаковы.

2. Неправильное использование пера

Еще одна частая ошибка — забыть опустить перо после его поднятия:

Code
1
2
3
4
5
6
7
8
использовать Черепаха
вперед(50)
поднять перо
вправо(90)
вперед(50)  // Черепаха перемещается без рисования
вправо(90)
// Здесь забыли опустить перо
вперед(50)  // Эта линия не будет нарисована!
Или наоборот, забыть поднять перо при перемещении Черепахи между несвязанными элементами рисунка.

3. Ошибки в расчёте углов для правильных многоугольников

Часто ошибки возникают при вычислении угла поворота для создания правильного многоугольника. Формула для внешнего угла: 360 / n.

Code
1
2
3
4
5
6
7
8
9
10
11
использовать Черепаха
алг правильный_многоугольник(стороны, длина)
нач
    угол = 360 / стороны  // Правильное вычисление внешнего угла
    нц для i от 1 до стороны
        вперед(длина)
        вправо(угол)
    кц
кон
 
правильный_многоугольник(5, 50)  // Пятиугольник
Но иногда люди путают внешние и внутренние углы:

Code
1
2
3
4
5
6
7
использовать Черепаха
стороны = 5
угол = (стороны - 2) * 180 / стороны  // Ошибка! Это внутренний угол многоугольника
нц для i от 1 до стороны
    вперед(50)
    вправо(180 - угол)  // Попытка использовать внутренний угол
кц
Запомните: для поворотов Черепахи нужно использовать внешние углы (360 / n), а не внутренние.

4. Проблемы масштабирования

Одна из распространенных ошибок при реализации сложных узоров — неправильное масштабирование элементов:

Code
1
2
3
4
5
6
7
8
9
использовать Черепаха
// Пытаемся нарисовать вложенные квадраты
нц для размер от 100 до 20 шаг -20
    нц для i от 1 до 4
        вперед(размер)
        вправо(90)
    кц
    // Забыли сместиться к центру для следующего квадрата
кц
Все квадраты будут начинаться из одной точки, вместо того чтобы быть вложенными друг в друга. Исправленный вариант:

Code
1
2
3
4
5
6
7
8
9
10
11
12
использовать Черепаха
нц для размер от 100 до 20 шаг -20
    нц для i от 1 до 4
        вперед(размер)
        вправо(90)
    кц
    // Смещаемся к центру для следующего квадрата
    вперед(10)
    вправо(90)
    вперед(10)
    влево(90)
кц
5. Ошибки при работе с циклами

Ошибки в циклах особенно коварны. Одна из типичных — ошибка на единицу (off-by-one error):

Code
1
2
3
4
5
6
7
8
использовать Черепаха
// Пытаемся нарисовать пять точек с равным интервалом
нц для i от 0 до 5  // Ошибка! Цикл выполнится 6 раз, а не 5
    опустить перо
    вперед(0)  // Рисуем точку
    поднять перо
    вперед(10)
кц
Правильный вариант — использовать диапазон от 1 до 5 или от 0 до 4.

6. Недостаточное понимание рекурсии

При работе с фракталами и другими рекурсивными структурами типичная ошибка — неправильное условие выхода из рекурсии:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
использовать Черепаха
алг дерево(длина)
нач
    вперед(длина)
    если длина > 5 то  // Правильное условие выхода из рекурсии
        вправо(30)
        дерево(длина * 0.7)
        влево(60)
        дерево(длина * 0.7)
        вправо(30)
    все
    назад(длина)
кон
 
дерево(80)
Без правильного условия выхода программа попытается работать с бесконечно малыми отрезками или зациклится.

7. Невнимательность к текущему состоянию Черепахи

Многие ошибки происходят из-за неправильного представления о текущем положении и ориентации Черепахи. Полезно добавлять комментарии о состоянии Черепахи в ключевых точках программы:

Code
1
2
3
4
5
6
7
8
9
использовать Черепаха
нц для i от 1 до 3
    нц для j от 1 до 4
        вперед(30)
        вправо(90)
    кц
    // Здесь Черепаха вернулась в начальную точку квадрата, смотрит на восток
    вперед(40)  // Смещаемся для следующего квадрата
кц
В сложных программах для отслеживания текущего состояния Черепахи можно использовать временные маркеры:

Code
1
2
3
4
5
6
7
8
9
10
использовать Черепаха
алг отметить_позицию()
нач
    цвет = перо
    установить перо(4)  // Красный
    опустить перо
    вперед(0)  // Ставим точку
    поднять перо
    установить перо(цвет)  // Восстанавливаем цвет
кон
Такие вспомогательные функции помогают визуально отслеживать траекторию Черепахи во время отладки.

Большинство ошибок в программировании для Черепахи связано не столько со сложными алгоритмическими проблемами, сколько с геометрическим мышлением и вниманием к деталям. Практика и терпение — ваши лучшие союзники в освоении этого интересного инструмента программирования.

Если вы столкнулись со сложной ошибкой, которую не можете исправить, попробуйте упростить задачу до минимального работающего примера. Устранив проблему в простой версии, постепенно добавляйте сложность, пока не вернётесь к исходной задаче. Этот подход особено эффективен при работе со сложными фрактальными узорами и рекурсией.

Исполнитель Робот
дали вот несколько задач (попросили решить, будучи студентом уже не ничего помню из курса информатики), можете проверить 1-3 и объяснить как делать...

Исполнитель КУЗНЕЧИК живёт на числовой оси
Исполнитель КУЗНЕЧИК живёт на числовой оси. Начальное положение КУЗНЕЧИКА – точка 0. Система команд Кузнечика: Вперед 5 – Кузнечик прыгает вперёд...

Исполнитель КУЗНЕЧИК живёт на числовой оси
Исполнитель КУЗНЕЧИК живёт на числовой оси. Начальное положение КУЗНЕЧИКА – точка 0. Система команд Кузнечика: Вперед 7 – Кузнечик прыгает вперёд...

Исполнитель Чертежник Составьте вспомогательный алгоритм-функцию Построение графика y = 50e-xsin(x) на отрезке [a, b]
Исполнитель Чертежник. Составьте вспомогательный алгоритм-функцию для построения графика y = 50e-xsin(x) на отрезке . Значения a и b задаются...

Задача для исполнителя Робот
Народ, нужны советы по поводу решения этой задачи.Буду признателен любым советам. Условие:Задачу необходимо решить, используя условный оператор...

Нестандартные задания для исполнителя DRAPE
Помогите необходимо разработать 5 творческих, нестандартных заданий для исполнителя DRAPE.

Составить минимальную по длине программу для исполнителя, которая уравнивает числа в паре (28, 64)
Рассмотрим исполнителя который оперирует над парой целых чисел и умеет выполнять следующие операции над парой (x,y): - операция `a`:(x,y) -&gt;...

[КуМир] программы в среде графического исполнителя Робот
Напишите программы в среде графического исполнителя Робот для решения следующих задач: 1. закрасить рабочее поле горизонтальными пунктирными...

Сколько разных программ можно составить для исполнителя?
Задача из школьного учебника. Исполнитель Калькулятор имеет следующую систему команд: 1) прибавь 1; 2) умножь на 2. С помощью первой из них...

[КуМир] В системе КуМир сделать задание номер 23
помогите пожалуйста) задание номер 23) заранее благодарю) если не трудно можно блок схему еще)Текст задачи набирайте вручную. Для вставки формул есть...

[КуМир] В программе Кумир написать алгоритм
(Ссылка на сторонний ресурс удалена) для 3 и 4 картинок Рекомендую Вам ознакомиться с правилами форума.

[КуМир] Перевести программу с C++ на Кумир
Помогите нужно переписать программку с СИ++ на Кумир или на паскаль (но лучше на кумир) сам код программы ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
Согласованность транзакций в MongoDB
Codd 30.04.2025
MongoDB, начинавшая свой путь как классическая NoSQL система с акцентом на гибкость и масштабируемость, сильно спрогрессировала, включив в свой арсенал поддержку транзакционной согласованности. Это. . .
Продвинутый ввод-вывод в Java: NIO, NIO.2 и асинхронный I/O
Javaican 30.04.2025
Когда речь заходит о вводе-выводе в Java, классический пакет java. io долгие годы был единственным вариантом для разработчиков, но его ограничения становились всё очевиднее с ростом требований к. . .
Обнаружение объектов в реальном времени на Python с YOLO и OpenCV
AI_Generated 29.04.2025
Компьютерное зрение — одна из самых динамично развивающихся областей искусственного интеллекта. В нашем мире, где визуальная информация стала доминирующим способом коммуникации, способность машин. . .
Эффективные парсеры и токенизаторы строк на C#
UnmanagedCoder 29.04.2025
Обработка текстовых данных — частая задача в программировании, с которой сталкивается почти каждый разработчик. Парсеры и токенизаторы составляют основу множества современных приложений: от. . .
C++ в XXI веке - Эволюция языка и взгляд Бьярне Страуструпа
bytestream 29.04.2025
C++ существует уже более 45 лет с момента его первоначальной концепции. Как и было задумано, он эволюционировал, отвечая на новые вызовы, но многие разработчики продолжают использовать C++ так, будто. . .
Слабые указатели в Go: управление памятью и предотвращение утечек ресурсов
golander 29.04.2025
Управление памятью — один из краеугольных камней разработки высоконагруженных приложений. Го (Go) занимает уникальную нишу в этом вопросе, предоставляя разработчикам автоматическое управление памятью. . .
Разработка кастомных расширений для компилятора C++
NullReferenced 29.04.2025
Создание кастомных расширений для компиляторов C++ — инструмент оптимизации кода, внедрения новых языковых функций и автоматизации задач. Многие разработчики недооценивают гибкость современных. . .
Гайд по обработке исключений в C#
stackOverflow 29.04.2025
Разработка надёжного программного обеспечения невозможна без грамотной обработки исключительных ситуаций. Любая программа, независимо от её размера и сложности, может столкнуться с непредвиденными. . .
Создаем RESTful API с Laravel
Jason-Webb 28.04.2025
REST (Representational State Transfer) — это архитектурный стиль, который определяет набор принципов для создания веб-сервисов. Этот подход к построению API стал стандартом де-факто в современной. . .
Дженерики в C# - продвинутые техники
stackOverflow 28.04.2025
История дженериков началась с простой идеи — создать механизм для разработки типобезопасного кода без потери производительности. До их появления программисты использовали неуклюжие преобразования. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru