Условия, циклы и типы данных

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

Суть: if выбирает путь, for и while повторяют действие, а типы данных хранят разные виды значений.

Игра постоянно принимает решения: если здоровье ноль — игрок проиграл; если нажата стрелка вправо — двигаемся вправо; пока есть враги — продолжаем уровень. Все эти «если» и «пока» — это условия и циклы. В GDScript они выглядят как в Python: if, elif, else для ветвлений, for и while для повторений.

var health: int = 30

if health <= 0:
    print("Игра окончена")
elif health < 10:
    print("Осторожно, мало здоровья!")
else:
    print("Всё хорошо")

for i in range(3):
    print("Враг номер ", i)

var enemies: int = 5
while enemies > 0:
    enemies -= 1

Кроме управления есть типы данных — разные коробки под разные значения. int хранит целые числа (очки, число жизней), float — дробные (скорость, время), String — текст, bool — да/нет (жив ли игрок). Особенно важен Vector2 — пара чисел (x, y), которой задают позиции и направления в 2D. Для коллекций есть массивы (список значений) и словари (пары ключ-значение).

Отдельно стоит привыкнуть к словарям — это пары «ключ: значение», и в играх они встречаются постоянно. Настройки уровня, инвентарь игрока, таблица урона для разных типов врагов — всё это удобно хранить в словаре. Массив отвечает на вопрос «какие элементы и в каком порядке», а словарь — на вопрос «что лежит под этим именем». Например, в массиве enemies лежат сами враги по порядку, а в словаре scores можно держать очки каждого игрока по его имени. Освоив if, циклы, массивы и словари, ты получаешь полный набор инструментов, чтобы описать практически любую игровую логику.

Как работает под капотом

Условие if вычисляет логическое выражение в скобках: получается true или false. Если true — выполняется блок под if, иначе движок идёт к elif или else. Цикл for пробегает по диапазону или коллекции, выполняя тело на каждом шаге. Цикл while повторяет тело, пока условие истинно, — и если условие никогда не станет ложным, игра зависнет в бесконечном цикле.

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

health = 30
health -= 25  # получили урон

if health <= 0:
    print("Игра окончена")
elif health < 10:
    print(f"Осторожно! Здоровье: {health}")
else:
    print(f"Здоровье в норме: {health}")

enemies = ["гоблин", "слизень", "летучая мышь"]
alive = 0
for e in enemies:
    print("На уровне:", e)
    alive += 1
print("Всего врагов:", alive)

Та же логика на Python ▶. if/elif/else и for здесь работают точно как в GDScript. Запусти и поменяй урон с 25 на 35 — увидишь, как игра уходит в ветку «Игра окончена».

Стоит потренировать и логические операторы, которые часто соседствуют с условиями: and, or, not. Они склеивают проверки: «прыжок разрешён, если нажата клавиша and персонаж на земле»; «игра окончена, если здоровье ноль or истекло время»; «дверь закрыта, если not has_key». Эти три слова делают условия выразительными и читаются почти как обычный текст. Привыкнув составлять из них сложные проверки, ты сможешь точно описать любое игровое правило — а правила и есть сердце геймплея, ведь именно они решают, что игроку можно, а что нельзя.

Частые ошибки

Классическая ловушка — бесконечный while: если внутри цикла ты забыл уменьшать счётчик (enemies -= 1), условие enemies > 0 никогда не станет ложным и игра зависнет. Вторая ошибка — путать целые и дробные: при делении целых можно потерять дробную часть, для скорости и времени всегда используй float. Третья — сравнивать строку и число напрямую: "10" и 10 это разные вещи. И помни про порядок в Vector2: первое число — x (вправо), второе — y (вниз, а не вверх — в 2D ось y направлена вниз).

Best practices

Используй elif вместо вложенных if там, где это читается яснее. Выбирай правильный тип: int для счётчиков, float для физики, bool для флагов состояния. Для направлений и позиций всегда бери Vector2 — не таскай x и y по отдельности. Давай булевым переменным имена-вопросы: is_alive, can_jump, has_key — код читается как предложение.

Итоги: if/elif/else выбирают путь, for и while повторяют действия. Типы: int (целые), float (дробные), String (текст), bool (да/нет), Vector2 (пара x, y для 2D). Берегись бесконечного while без изменения счётчика и помни, что ось y в 2D направлена вниз.

Проверьте себя
1. Почему этот цикл может зависнуть: while enemies > 0: print(enemies) ?
AПотому что while нельзя использовать в играх
BВнутри не уменьшается enemies, условие всегда истинно
Cprint нельзя вызывать в цикле
DНужно использовать for вместо while
2. Какой тип данных лучше всего хранит направление движения в 2D?
Aint
BString
CVector2 (пара x, y)
Dbool