[Язык C] Арифметические прогрессии и MMORPG


Я заядлый игрок в MMORPG и для меня изучение программирования становится намного веселее и интереснее, если у написанных программ есть какая-то привязка к играм. Это особенно важно, если речь идет о каких-то абстрактных математических вещах, которые мне (гуманитарию) весьма непросто воспринимать.

Сегодня мы рассмотрим такую штуку как математические прогрессии. Для начала напишем арифметическую прогрессию на языке Си, которая будет считать сколько монстров нам надо убить, чтобы получить новый уровень 😉 Программа просит нас ввести наш начальный опыт (start), количество опыта за убийство одного монстра (step) и количество опыта, которое необходимо для получения нового уровня (stop):

#include <stdio.h>

int main (void)
{
int start, step, stop;
int mob = 1;

printf("Enter your initial XP, exp per fight, "
       "and exp needed for lvl up\n");

scanf("%d%d%d", &start, &step, &stop);

while (start < stop)
{
    start += step;
    printf("Killing %d monster: %d\n", mob++, start);
}

printf("Ding! Level up! You've finally got %d exp.\n", start);

getchar();
getchar();

return 0;
}

В качестве примера возьмем реальные значения из моего онлайн рогалика Tangaria: введя первым значением опыт на 22 уровне, вторым значением опыт за убийство среднестатистического монстра и третьим значением опыт, нужный для получения 23 уровня:

Enter your initial XP, exp per fight, and exp needed for lvl up
6800 75 8400
Killing 1 monster: 6875
Killing 2 monster: 6950
Killing 3 monster: 7025
Killing 4 monster: 7100
Killing 5 monster: 7175
Killing 6 monster: 7250
Killing 7 monster: 7325
Killing 8 monster: 7400
Killing 9 monster: 7475
Killing 10 monster: 7550
Killing 11 monster: 7625
Killing 12 monster: 7700
Killing 13 monster: 7775
Killing 14 monster: 7850
Killing 15 monster: 7925
Killing 16 monster: 8000
Killing 17 monster: 8075
Killing 18 monster: 8150
Killing 19 monster: 8225
Killing 20 monster: 8300
Killing 21 monster: 8375
Killing 22 monster: 8450
Ding! Level up! You've finally got 8450 exp.

Итого, мы видим, что для перехода с 22 уровня на 23 нам понадобиться в среднем убить 22 монстра 🙂 Этот простенький калькулятор можно использовать для любых игр. Конечно, можно просто воспользоваться калькулятором (поделить разность конечного и начального опыта на количество опыта за одного моба) — но такой способ нагляднее.. и он научит вас составлять прогрессии на языке Си! 😀

Теперь давайте напишем программу, которая поможет узнать эффективность фарма той или иной локации. Введите туда текущий опыт (cur_xp), количество опыта за минуту (exp_per_min) и игровую сессию в минутах (game_session_min) — и программа посчитает сколько опыта вы получаете за час:

#include <stdio.h>

int main (void)
{
int cur_xp, exp_per_min, game_session_min;
int min = 0; // counter; how long do we play already

printf("Enter your initial (current) XP, exp per minute, "
       "and your gaming session (in minutes)\n");

scanf("%d%d%d", &cur_xp, &exp_per_min, &game_session_min);

while (min < game_session_min)
{
    printf("Fighting %d minutes: %d\n", min++, cur_xp);
    cur_xp += exp_per_min;
}

printf("After %d minutes you will get %d exp.\n", game_session_min, cur_xp);

getchar();
getchar();

return 0;
}

Пример вывода:

Enter your initial XP, exp per minute, and your gaming session (in minutes)
0 470 15
Fighting 0 minutes: 0
Fighting 1 minutes: 470
Fighting 2 minutes: 940
Fighting 3 minutes: 1410
Fighting 4 minutes: 1880
Fighting 5 minutes: 2350
Fighting 6 minutes: 2820
Fighting 7 minutes: 3290
Fighting 8 minutes: 3760
Fighting 9 minutes: 4230
Fighting 10 minutes: 4700
Fighting 11 minutes: 5170
Fighting 12 minutes: 5640
Fighting 13 minutes: 6110
Fighting 14 minutes: 6580
After 15 minutes you will get 7050 exp.

Теперь составим программу, боя с монстром — сколько раундов ваш персонаж продержится, если ему наносят определенное количество урона. Нужно ввести здоровье вашего персонажа и входящий урон за раунд:

#include <stdio.h>

int main (void)
{
int cur_hp, damage;
int round = 1;

printf("Enter your HP and incoming damage per round\n");

scanf("%d%d", &cur_hp, &damage);

while (cur_hp > 0)
{
    printf("Fighting %d round: %d hp left\n", round++, cur_hp);
    cur_hp -= damage;
}

printf("You will survive %d blows\n", round - 1);

getchar();
getchar();

return 0;
}

Вывод:

Enter your HP and incoming damage per round
240 17
Fighting 1 round: 240 hp left
Fighting 2 round: 223 hp left
Fighting 3 round: 206 hp left
Fighting 4 round: 189 hp left
Fighting 5 round: 172 hp left
Fighting 6 round: 155 hp left
Fighting 7 round: 138 hp left
Fighting 8 round: 121 hp left
Fighting 9 round: 104 hp left
Fighting 10 round: 87 hp left
Fighting 11 round: 70 hp left
Fighting 12 round: 53 hp left
Fighting 13 round: 36 hp left
Fighting 14 round: 19 hp left
Fighting 15 round: 2 hp left
You will survive 15 blows

 


Запись опубликована в рубрике С (Си). Добавьте в закладки постоянную ссылку.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *