16. Игра. Уровни игры

Занятие 16


Это надо знать

На прошлом занятии мы создавали движение 8 шариков, используя массив структур. Но заполняли каждый элемент массива вручную:

    Subject ball0 = { 100, 200, 1, 1, 20, TX_LIGHTRED, 
                                VK_RIGHT, VK_LEFT, VK_UP, VK_DOWN};
    Subject ball1 = { 150, 100, 6, 1, 15, TX_BLUE };
    ...
А если шариков 10, 20,...

В этом случае заполнить массив элементами можно при помощи случайных чисел:

const int nball = 50;
    Subject balls[nball] ={};
    for (int i = 0; i < nball; i++)
        balls[i] = { rand()%WINX,   rand()%WINY,   rand()%8,    rand()%6,   rand()%15 + 5,
                           RGB (rand()%255,   rand()%255,   rand()%255) };

Функция rand() генерирует случайное число в диапазоне от 0 до максимального числа (32767).
rand() % 10 — rand() генерирует число и далее вычисляется остаток от деления нa 10 от этого числа. Понятно, что это могут быть числа только oт 0 до 9.

rand()%WINX   - координата по х: случайное число  от 0 до WINX - 1
rand()%WINY   координата по у: случайное число  от 0 до WINY - 1 
rand()%8,           скорость vx: случайное число  от 0 до 7 
rand()%6,           скорость vy: случайное число  от 0 до 5 
rand()%15 + 5,  радиус шарика: случайное число  от 5 до 19
RGB (rand()%255,   rand()%255,   rand()%255) - цвет, заданный случайными составляющими красного, зеленого и синего цветов.



Уровни игры

Как сделать игру, в которой при переходе на другой уровень, увеличивается количество "врагов" и количество предметов, которые необходимо собрать?

Допустим, мы написали такую игру. Как бы она могла выглядеть:

уровень = 1
количество "жизней" = 10

пока на достигнем последнего уровня (первый цикл)
   количество врагов = уровень + 2
   количество предметов = уровень + 2
   количество собранных предметов = 0
  
   инициализируем героя
   инициализируем предметы 
   инициализируем врагов
   
   пока не собрали все предметы (второй цикл)
      нарисуем героя
      создадим его движение
  
      нарисуем предметы
      создадим их движение
   
      нарисуем  врагов
      создадим их движение

      отследим столкновение героя с предметом
         если столкнулись, увеличим количество собранных предметов на 1

      отследим столкновение героя с врагом
         если столкнулись, уменьшим количество "жизней" на 1

      отследим столкновение предметов, героев между собой

      если мы  собрали все предметы, то уровень увеличим на 1 и вернемся в первый цикл

Пример функции MoveBall()

Управление красным шариком. Зеленые шарики необходимо ловить, синие шарики - враги.

void MoveBall()
    {
    const double dt = 1;
    int level = 1;
    int lives = 10;
    Subject ballsgreen[NBALLS] = {};
    Subject ballsblue[NBALLS]  = {};

    while (!GetAsyncKeyState (VK_ESCAPE) && level < (NLEVEL + 1) && lives > 0)
        {
        int score = 0;
        int ngreen = level + 2;
        int nblue  = level + 2;

        Subject ballred  = { rand()%WINX, rand()%WINY, 1, 1, 20, TX_LIGHTRED, VK_RIGHT, VK_LEFT, VK_UP, VK_DOWN };

        InitBalls (ballsgreen, ngreen, TX_GREEN);
        InitBalls (ballsblue,  nblue,  TX_BLUE);

        txBegin();
        while (!GetAsyncKeyState (VK_ESCAPE) && score < ngreen && lives > 0)
            {
            txSetFillColor (TX_WHITE);
            txClear();

            DrawBall (ballred);
            Phithics (&ballred, dt);
            Control  (&ballred);

            DrawAllBalls (ballsgreen, ngreen);
            DrawAllBalls (ballsblue,  nblue);

            MoveAllBalls (ballsgreen, ngreen, dt);
            MoveAllBalls (ballsblue,  nblue,  dt);

            InspectionRed (&ballred, ballsgreen, ngreen,  1, &score);
            InspectionRed (&ballred, ballsblue,  nblue,  -1, &lives);

            Inspection (ballsgreen, ngreen, ballsblue,  nblue);
            Inspection (ballsgreen, ngreen, ballsgreen, ngreen);
            Inspection (ballsblue,  nblue,  ballsblue,  nblue);

            Count (score, ngreen, &level);

            DrawScore (WINX/4, score, "Предметы");
            DrawScore (WINX*3/4, lives, "Здоровье");

            txSleep(50);
            }
        txEnd();
        }
      txSleep(1000);
    }





Пример

В игре лягушка должна ловить падающие цветочки, если цветочек упадет на землю, то вычитается "Здоровье". Лягушка должна избегать столкновения с комарами. На первом уровне три цветочка и три комара, на каждом следующем уровне комаров и цветочков на 1 больше. Всего в игре 4 уровня.

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

Результат работы программы


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

Создать игру с несколькими уровнями