Хочу представить небольшой сниппет, который может пригодиться в разных случаях.
Суть:
Думаю все согласятся, что строки вида "30 аммопаков", "21 игрок" читаются приятнее, чем "Аммопаки: 30", "21 игроков(а)". Как добиться, чтобы при изменении числа в плагине изменялось и слово после него по смыслу?
Допустим у нас есть слово "игроки" и число X. Сначала нужно слово превратить в три вида:
A. мн. число, род. п. — "игроков"
B. нач. форма — "игрок"
C. ед. число, род. п. — "игрока"
...а затем узнать последние цифры числа X. Для этого мы узнаём остаток от деления на 10 и на 100:
- Код: Выделить всё
new num100 = X % 100
new num10 = X % 10
Теперь у нас два числа. Как мы будем их использовать? Мы будем их сравнивать с помощью условных операторов.
- Код: Выделить всё
new num100 = X %100, // Узнаём остаток от деления числа на 100
num10 = X % 10; // Узнаём остаток от деления числа на 10
// Если 5 ≤ num100 ≤ 20 или num10 = 0 или 5 ≤ num10 ≤ 9...
if(num100 >= 5 && num100 <= 20 || num10 == 0 || num10 >=5 && num10 <= 9)
// ...то возвращаем "игроков"
return A;
// Если num10 = 1...
else if(num10 == 1)
// ...то возвращаем "игрок"
return B;
// Если 2 ≤ num10 ≤ 4...
else if(num10 >= 2 && num10 <= 4)
// ...то возвращаем "игрока"
return C;
Для примера, в прикреплениях код плагина, который делает рестарт через некоторое время, после смены карты и выводит в HUD время, оставшееся до рестарта.
Update #1
Добавил include в аттачи. С ним можно просто использовать функцию:
- Код: Выделить всё
#include <wordending>
// ...
new str[512];
get_ending(
n, //Число
"first ending", // мн. число, род. п
"second ending", // нач. форма
"third ending", // ед. число, род. п
sizeof str-1, // длина
str // переменная, в которую будет записывать нужное окончание
);
Хочу отметить, что в переменную будет записывать только нужное слово, без самого числа.