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

Уроки · 82

else if

Давай сделаем полоску здоровья из урока «Полоска здоровья» трёхцветной: зелёной, пока здоровья много, жёлтой, когда его осталось поменьше, и красной, когда оно почти кончилось.

if с else выбирает из двух вариантов. Когда их три, между ними можно вставить ещё одну проверку: else if, то есть «а если нет, то проверь вот это». Выбор получается таким же, как в уроке «if как значение», только вариантов теперь три:

// Много здоровья — зелёный, иначе средне — жёлтый, иначе мало — красный.
let color = if fraction > GOOD_HEALTH {
GREEN
} else if fraction > LOW_HEALTH {
YELLOW
} else {
RED
};

GOOD_HEALTH равно 0.6, а LOW_HEALTH равно 0.3: зелёный выше 60 процентов, жёлтый от 30 до 60, красный ниже.

Условия проверяются сверху вниз. Как только одно оказалось верным, берём его ветку, а остальные пропускаем, даже если они тоже верны. Осталось 80 процентов здоровья: первое условие fraction > GOOD_HEALTH верно, получается зелёный, и до второго дело не доходит.

Поэтому порядок проверок важен. Что будет, если поменять их местами:

// Неправильный порядок: зелёного не получится никогда.
let color = if fraction > LOW_HEALTH {
YELLOW
} else if fraction > GOOD_HEALTH {
GREEN
} else {
RED
};

80 процентов здоровья больше 0.3, поэтому сработает первая проверка и полоска станет жёлтой, а до зелёной дело не дойдёт. Проверять надо от самого строгого условия к самому мягкому.

Всё, как в уроке «if как значение»: во всех ветках значения одного типа, на конце веток нет точки с запятой, а последний else обязателен. else if можно добавлять сколько нужно.

Он работает и в обычном if, где ветки не выдают значение, а что-то делают.

Кликай по примеру: каждый клик отнимает здоровье. Когда оно кончится, следующий клик вернёт его полностью. Меняй длину полоски ниже:

src/main.rs
use macroquad::prelude::*;
// Здоровье в начале и его максимум.
const MAX_HEALTH: f32 = 100.0;
// Сколько здоровья отнимает один клик.
const DAMAGE: f32 = 10.0;
// Выше какой доли здоровья полоска зелёная.
const GOOD_HEALTH: f32 = 0.6;
// Выше какой доли — жёлтая, а ниже — красная.
const LOW_HEALTH: f32 = 0.3;
// Левый верхний угол полоски, её высота и длина.
const BAR_X: f32 = 20.0;
const BAR_Y: f32 = 20.0;
const BAR_HEIGHT: f32 = 40.0;
const BAR_WIDTH: f32 = 400.0;
#[macroquad::main("else if")]
async fn main() {
// Текущее здоровье — сначала полное.
let mut health = MAX_HEALTH;
loop {
clear_background(BLACK);
// Кнопка мыши только что нажата.
if is_mouse_button_pressed(MouseButton::Left) {
if health <= 0.0 {
// Здоровья уже нет — возвращаем полное.
health = MAX_HEALTH;
} else {
// Отнимаем урон. max(0.0) не даёт здоровью уйти ниже нуля.
health = (health - DAMAGE).max(0.0);
}
}
// Доля здоровья от 0 до 1.
let fraction = health / MAX_HEALTH;
// Цвет выбираем по очереди: много здоровья — зелёный, иначе
// средне — жёлтый, иначе мало — красный.
let color = if fraction > GOOD_HEALTH {
GREEN
} else if fraction > LOW_HEALTH {
YELLOW
} else {
RED
};
// Серая подложка: вся полоска целиком.
draw_rectangle(BAR_X, BAR_Y, BAR_WIDTH, BAR_HEIGHT, GRAY);
// Цветная часть поверх неё: ширина — доля от всей полоски.
draw_rectangle(BAR_X, BAR_Y, BAR_WIDTH * fraction, BAR_HEIGHT, color);
next_frame().await;
}
}
  • GOOD_HEALTH и LOW_HEALTH — доли здоровья, по которым цвет меняется. Это константы, как в уроке «Константы».
  • if fraction > GOOD_HEALTH { GREEN } — первое условие. Если здоровья больше 60 процентов, цвет зелёный.
  • else if fraction > LOW_HEALTH { YELLOW } — проверяется, только если первое условие не сработало. Если здоровья больше 30 процентов, цвет жёлтый.
  • else { RED } — всё остальное: здоровья 30 процентов или меньше.
  • Условия проверяются сверху вниз, срабатывает первое верное. Поэтому их записывают от самого строгого к самому мягкому.