15. Массив

Занятие 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:

for (int i = 0; i < 6; i++)
     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  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 }; 

Посмотреть текст программы

Результат выполнения программы


Домашнее задание

Внести изменения в свою игру (использовать массивы).