Перейти к содержимому

Уроки · 32

Цикл for

Нарисуем пять кружков в ряд посередине экрана. Можно просто вызвать draw_circle пять раз, каждый раз со своим x:

draw_circle(60.0, screen_height() / 2.0, 40.0, YELLOW);
draw_circle(220.0, screen_height() / 2.0, 40.0, YELLOW);
draw_circle(380.0, screen_height() / 2.0, 40.0, YELLOW);
draw_circle(540.0, screen_height() / 2.0, 40.0, YELLOW);
draw_circle(700.0, screen_height() / 2.0, 40.0, YELLOW);

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

for i in 0..5 {
// здесь i по очереди равно 0, 1, 2, 3, 4
}

0..5 — это диапазон чисел от 0 до 5, не включая само 5 (та же идея, что и в уроке «Случайная точка»: верхняя граница никогда не достигается). for i in ... берёт из этого диапазона числа по одному и каждый раз выполняет тело цикла заново — сначала с i = 0, потом с i = 1, и так до i = 4. Пять чисел — тело цикла выполнится пять раз.

Раз i меняется от кружка к кружку, можно посчитать его x прямо по i: каждый следующий кружок сдвигается на фиксированный шаг STEP правее предыдущего, начиная от какой-то точки START_X:

// Начинаем от START_X и сдвигаемся на i шагов вправо.
let x = START_X + STEP * (i as f32);

Замени содержимое src/main.rs на это:

src/main.rs
use macroquad::prelude::*;
// Сколько кружков рисуем.
const COUNT: usize = 5;
// Откуда начинаем и на сколько пикселей сдвигаем каждый следующий кружок.
const START_X: f32 = 60.0;
const STEP: f32 = 160.0;
#[macroquad::main("Цикл for")]
async fn main() {
loop {
clear_background(BLACK);
// i по очереди принимает 0, 1, 2, 3, 4 — по разу на каждый кружок.
for i in 0..COUNT {
// Начинаем от START_X и сдвигаемся на i шагов вправо.
let x = START_X + STEP * (i as f32);
draw_circle(x, screen_height() / 2.0, 40.0, YELLOW);
}
next_frame().await;
}
}

Запусти как обычно:

Окно терминала
cargo run

Пять жёлтых кружков встают ровным рядом посередине экрана — так же, как если бы мы вручную выписали все пять draw_circle, только теперь это одна строка draw_circle внутри for:

  • for i in 0..COUNT — повторяет тело цикла COUNT раз, давая i по очереди значения 0, 1, 2, 3, 4.
  • i as f32 — i внутри for целое число (без дробной части, оно же просто счётчик), а STEP — f32. Умножать их напрямую нельзя, разные типы — поэтому i явно переводится в f32 перед умножением (подробнее про целые числа и as — в уроке «Целые числа»).
  • COUNT, START_X и STEP — const вне main, как в уроке «Константы»: все три числа не меняются, пока программа работает.