Я заядлый игрок в 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