Этот урок завершает разработку игры, добавляя хвост змее и реализуя недостающую логику. Готовый код и домашнее задание доступны на сайте ссылка на сайт.
Реализация хвоста змеи
Хвост змеи реализуется с помощью массивов для хранения координат и переменной для отслеживания длины. Повороты хвоста имитируются последовательным переносом координат.
Для этого потребуются следующие переменные:
- tailX: массив из 100 элементов, хранящий координаты X хвоста.
- tailY: массив из 100 элементов, хранящий координаты Y хвоста.
- ntail: переменная, хранящая длину хвоста (число съеденных фруктов).
В функции logic, при поедании фрукта, значение ntail увеличивается на единицу.
Отрисовка хвоста и обработка столкновений
Отрисовка хвоста и обработка столкновений с хвостом и границами поля реализуются в циклах.
Для отрисовки используется следующий код:
for (int k = 0; k < ntail; k++) {
if (tailX[k] == j && tailY[k] == a) {
// Рисуем элемент хвоста
}
}
Для корректной отрисовки используется булева переменная print (изначально false). При рисовании элемента хвоста print устанавливается в true. Перед отрисовкой пробела проверяется значение print: если false, рисуется пробел, иначе – элемент хвоста.
Координаты первого элемента хвоста присваиваются следующим образом:
tailX[0] = x;
tailY[0] = y;
где x и y – координаты головы змеи.
Обработка столкновения со змеей:
for (int i = 0; i < ntail; i++) {
if (tailX[i] == x && tailY[i] == y) {
gameOver = true;
}
}
Для циклического прохождения через стены используется следующая логика:
if (x >= width) x = 0;
else if (x < 0) x = width - 2;
// Аналогично для y
Значения width — 2 и height — 2 могут потребовать корректировки в зависимости от особенностей реализации.
Обновление координат хвоста
Для создания эффекта «следования» хвоста за головой змеи используется следующий цикл:
for (int i = 1; i < ntail; i++) {
int prev2X = tailX[i];
int prev2Y = tailY[i];
tailX[i] = prevX;
tailY[i] = prevY;
prevX = prev2X;
prevY = prev2Y;
}
В результате создана функциональная игра «Змейка» на C++, поддерживающая сбор фруктов, циклическое прохождение через стены и проверку на столкновение с собственным хвостом. Код игры относительно компактен.