Нужна помощь с Turtle (Java Script)

текущая

У меня в данный момент есть данная картинка, которая не совпадает с оригиналом, если кто-то разбирается в этом, прошу помочь.

оригинал

а вот и код:

let s = 0;
let a = 120;
let fo = 80;
for (let index = 0; index < 99; index++) {
  if (s < 33) {
    colour(255, 0, 0, 1);
  } else if (s < 63) {
    colour(0, 255, 0, 1);
  } else if (s < 93) {
    colour(0, 0, 255, 1);
  }
  left(a + 1.5);
  forward((fo += 5));
  s = (s + 1) % 99;
}

Ответы (1 шт):

Автор решения: Ivan Shatsky

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

for (let i = 0; i < 10; i++) {
  console.log(i, i % 5);
}

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

0 0
1 1
2 2
3 3
4 4
5 0
6 1
7 2
8 3
9 4

То есть при последовательном увеличении значения переменной i остаток от её деления на 5 циклически изменяется от 0 до 4, это, надеюсь, понятно?

То, что вы делаете сейчас с помощью строки

s = (s + 1) % 99;

это получение остатка от деления номера итерации на 99 (не совсем понятно, зачем вам в данном случае отдельная переменная s, ну да ладно). Этот остаток циклически изменяется от 0 до 98. Совместно с конструкцией

if (s < 33) {
  colour(255, 0, 0, 1);
} else if (s < 63) {
  colour(0, 255, 0, 1);
} else if (s < 93) {
  colour(0, 0, 255, 1);
}

вы меняете цвет пера таким образом:

  • на итерациях 1..33, 100..132, 199..231 и так далее на красный;
  • на итерациях 34..64, 133..163, 232..262 и так далее на зелёный;
  • на итерациях 65..93, 164..192, 263..291 и так далее на синий;
  • на итерациях 94..99, 193..198, 292..297 и так далее цвет пера не меняется.

Кстати, последний if здесь лишний, вполне достаточно такой конструкции:

if (...) {
  ...
} else if (...) {
  ...
} else {
  ...
}

То есть у вас получается такая картина:

  • 33 красных отрезка;
  • 31 зелёный отрезок;
  • 35 синих отрезков.

И далее по кругу.

Вам же надо менять цвет после каждого отрезка, то есть использовать остаток от деления номера итерации на 3. В примерах кода, которые вам давали ранее, цвета объявлялись как элементы массива:

const colors = [
  'red',
  'green',
  'blue'
];

и далее цвет выбирался как элемент массива с соответствующим номером от 0 до 2:

color(colors[i % 3]);

(нумерация элементов массива в JavaScript начинается с нуля).

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

let c = index % 3;
if (c == 0) {
    color(255, 0, 0);
} else if (c == 1) {
    color(0, 255, 0);
} else {
    color(0, 0, 255);
}

Кстати, переменная i в циклах называется так ещё и от слова iteration, а не только от слова index, и в данном случае название index выбрано не очень удачно.

→ Ссылка