14. Подсчет очков в игре

Занятие 14


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

Для создания игровой ситуации, в программе можно считать очки.
Допусти, при столкновении каких-то объектов с героем, очки уменьшаются, а при столкновении с некоторыми предметами сумма очков увеличивается.

Для подсчета  очков инициализируем переменную score. Пусть ее начальное значение будет равно 5 - количество "жизней".

int score = 5;

Красным шариком будем управлять при помощи  клавиатуры (функции Control и Phythics), остальные шарики будут двигаться прямолинейно (функция Phythics).

void Control (Subject* ball)
    {
    if (GetAsyncKeyState (ball->KeyForRight))     ball->x += 5;
    if (GetAsyncKeyState (ball->KeyForLeft))       ball->x -= 5;
    if (GetAsyncKeyState (ball->KeyForUp))         ball->y -= 5;
    if (GetAsyncKeyState (ball->KeyForDown))    ball->y += 5;
    if (GetAsyncKeyState (VK_SPACE))                ball->vx = ball->vy = 0;
    }

Перепишем функцию Collision таким образом, чтобы она возвращала значение переменной hit. Переменная hit будет равна 0, если не произошло столкновение и равна 1, если шарики столкнулись.

int  Collision (Subject* ball1, Subject* ball2)
    {
    int hit = 0;

    double distance = pow (ball1->x - ball2->x, 2) + pow (ball1->y - ball2->y, 2);

    if (distance < pow (ball1->r + ball2->r, 2))
        {
        std :: swap (ball1->vx, ball2->vx);
        std :: swap (ball1->vy, ball2->vy);
        hit = 1;
        }
    return hit;
    }

При столкновении красного шарика с синим, будем уменьшать переменную score на 1. Игра закончится, когда score станет равна 0.

Для всех вызовов функции Collision с красным шариком запишем:

        if (Collision (&ball1, &ball2)) score--;
        if (Collision (&ball1, &ball3)) score--;
        if (Collision (&ball1, &ball4)) score--;
        if (Collision (&ball1, &ball5)) score--;

Вывод счета на экран

Выведем счет игры  вверху по центру экрана.
Для вывода счета воспользуемся функцией txTextOut, но она выводит на экран текст, а счет игры - натуральное число.
Преобразуем число в текст, для этого можно использовать функцию sprintf:

sprintf (строковая переменная, "%d", число);

В нашем случае:  sprintf (scoreStr, "%d", score);

Функция вывода очков на экран может быть записана так:

void DrawScore (int score)
    {
    int x = 270, y = 20;
    txSetFillColor (TX_LIGHTBLUE);
    txSetColor (TX_LIGHTRED);
    txRectangle (x, y, x + 80, y + 40);

    txSelectFont ("Arial", 40);
    txSetTextAlign (TA_CENTER);

    char scoreStr[10] = "";
    sprintf (scoreStr, "%d", score);
    txTextOut (x + 40, y, scoreStr);
    }


Пример

В начале игры лягушке дается 5 "жизней". При столкновении лягушки и комара количество "жизней" уменьшается на 1.  Игра проиграна, если количество "жизней" станет равным 0. Для выигрыша необходимо собрать 10 цветочков. Лягушка управляется при помощи стрелок.

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

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

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

Создать игру для одного или двух игроков. В игре считать очки.