Занятие 15
Это надо знать
В программе, рассмотренной на прошлом занятии, мы использовали пять шариков:Subject ball1 = { 100, 100, 5, 7, 20, TX_BLUE };
Subject ball2 = { 10, 150, 3, 2, 10, TX_RED };
Subject ball3 = { 150, 300, 2, 3, 5, TX_GREEN };
Subject ball4 = { 450, 500, 7, 9, 15, RGB (210, 40, 200) };
Subject ball5 = { 500, 400, 1, 3, 25, RGB ( 20, 230, 220) };
Для каждого из шариков вызывали функции его рисования DrawBall, движения Physics, функцию, которая определяет столкновение шариков Collision. А если мы захотим переместить не 5, а 10 или 20 шариков?
Может можно написать:
выполни 5 раз
нарисуй шарик;
перемести шарик;
Но каким-то образом надо указать, что сначала надо нарисовать и переместить первый шарик, затем нарисовать и переместить второй шарик и т. д.
Все шарики - это элементы одного типа Subject, всего шариков 5. Для работы с множеством однотипных данных удобно использовать массив.
Массив - тип данных, состоящий из фиксированного числа элементов одного типа.
int a[6] - массив a из 6 целых чисел;
char str[10] - массив str из 10 символов;
Subject balls[5] - массив balls из 5 элементов, описанных при помощи структуры Subject.
Описание массива:
тип_элементов название_массива [количество_элементов] = { список начальных значений };
int a[6] = { 4, 6, 9, 0, 7, 3 };
Номер (индекс) первого элемента равен 0.
В указанном массиве a[0] = 4, a[1] = 6, a[2] = 9, a[3] = 0, a[4] = 7, a[5] = 3.
Если список значений меньше, чем количество элементов в массиве, то остальным элементам присваивается значение равное 0.
Если записать int a[6] = {}; то всем шести элементам массива а будет присвоено значение 0.
Для работы с элементами массива удобно использовать цикл while или цикл for.
Пусть задан массив:
int a[6] = { 4, 6, 9, 0, 7, 3 };
Увеличим все его элементы на 5.
Если использовать цикл while:
int i = 0; // начинаем с элемента под номером 0
while (i < 6) // выполняем операторы цикла, пока номер меньше 6, т.е. 0, 1, 2, 3, 4, 5
{
a[i] += 5; // увеличиваем элемент с i-тым номером на 5
i++; // увеличиваем номер на 1, т.е. будем рассматривать следующий элемент
}
Если использовать цикл for:
a[i] += 5;
Сначала целочисленной переменной i присваивается значение 0:
i = 0;
это инициализация цикла.
Затем программа проверяет, меньше ли i числа 6:
i < 6;
это проверочное выражение.
Если это так, программа выполняет тело цикла: a[i] += 5;
После этого программа обновляет цикл, увеличивая i на 1.
Общий вид цикла for:
for (инициализация; проверочное выражение; обновляющее выражение)
тело цикла
Для работы с нашими 5 шариками будем использовать массив:
const int n = 5; // в переменной n будем хранить количество шариков
Subject balls[n] = { ball1, ball2, ball3, ball4, ball5 }; // элементами массива balls являются наши шарики, описанные при помощи структуры Subject.
Нарисуем все шарики с помощью функции DrawBall и переместим при помощи функции Phithics:
for (int i = 0; i < n; i++)
{
DrawBall (balls[i]);
Phithics (&balls[i], dt);
}
Рассмотрим столкновение первого красного шарика (шарик с номером 0) со всеми остальными шариками (шарики с номерами 1, 2, 3, 4):
for (int i = 1; i < n; i++)
if (Collision (&balls[0], &balls[i])) score--;
Для того, чтобы все синие шарики реагировали на столкновение можно использовать следующие команды:
for (int i = 1; i < n - 1; i++)
for (int j = i + 1; j < n; j++)
(Collision (&balls[i], &balls[j]));
Т.е. мы рассматриваем столкновение шарика с номером i (i изменяется от 1 до 3) c шариком под номером j ( j изменяется от 2 до 4).
т.е balls[1] с balls[2], balls[1] с balls[3], balls[1] с balls[4];
затем balls[2] с balls[3], balls[2] с balls[4];
затем balls[3] с balls[4].
Subject balls[n] = { ball1, ball2, ball3, ball4, ball5 }; // элементами массива balls являются наши шарики, описанные при помощи структуры Subject.
Нарисуем все шарики с помощью функции DrawBall и переместим при помощи функции Phithics:
for (int i = 0; i < n; i++)
{
DrawBall (balls[i]);
Phithics (&balls[i], dt);
}
Рассмотрим столкновение первого красного шарика (шарик с номером 0) со всеми остальными шариками (шарики с номерами 1, 2, 3, 4):
for (int i = 1; i < n; i++)
if (Collision (&balls[0], &balls[i])) score--;
Для того, чтобы все синие шарики реагировали на столкновение можно использовать следующие команды:
for (int i = 1; i < n - 1; i++)
for (int j = i + 1; j < n; j++)
(Collision (&balls[i], &balls[j]));
Т.е. мы рассматриваем столкновение шарика с номером i (i изменяется от 1 до 3) c шариком под номером j ( j изменяется от 2 до 4).
т.е balls[1] с balls[2], balls[1] с balls[3], balls[1] с balls[4];
затем balls[2] с balls[3], balls[2] с balls[4];
затем balls[3] с balls[4].
Пример
Внесем изменения в игру прошлого занятия, чтобы значения цветочков и комаров хранилось в массивах.Subject mosquito0 = { 10, 450, 3, 2, 0.8, 0.8, 20, TX_RED, 1, 10, 1 };
Subject mosquito1 = { 150, 300, 2, 3, 0.7, 0.7, 20, TX_GREEN, 1, 5, 1 };
Subject mosquito2 = { 450, 500, 7, 9, 0.9, 0.9, 20, RGB (128, 0, 155), 1, 8, 1 };
Subject mosquito3 = { 500, 400, 1, 3, 0.6, 0.6, 20, RGB ( 20, 230, 220), 1, 5, 1 };
Subject flower0 = { 500, 400, 1, 2, 0.5, 0.5, 10 };
Subject flower1 = { 100, 200, 2, 3, 0.4, 0.4, 10 };
Subject flower2 = { 300, 100, 4, 3, 0.3, 0.3, 10 };
const int nMosquito = 4;
const int nFlower = 3;
Subject mosquitos[nMosquito] = { mosquito0, mosquito1, mosquito2, mosquito3 };
Subject flowers[nFlower] = { flower0, flower1, flower2 };
Посмотреть текст программы
Результат выполнения программы