PDA

Просмотр полной версии : [Вопрос] Правильное окончание слов в зависимости от числа



PawnoNoob
31.08.2021, 19:50
Приветствую! Может есть у кого-нибудь мануал или разбор вопроса, указанного в названии темы?

Если не совсем ясна суть вопроса, то поясню: предположим, что имеется команда /playerscount, которая показывает общее количество игроков на сервере в данный момент. При использовании команды показывает сообщение типа "На сервере %i игрок(???)", и хотелось бы сделать так, чтобы писало окончание в зависимости от его количества (1 - игрок; 2 - игрока; 7 - игроков).

Заранее благодарен за помощь в решении данного вопроса :blush2:

Shaolinka
31.08.2021, 21:06
stock GetPlayersCountWord(count, const dest[], size = sizeof dest)
{
if(size < 8)
return -1;

switch(count)
{
case 1: strcat(dest, "игрок");
case 2..4: strcat(dest, "игрока");
default: strcat(dest, "игроков");
}

return 1;
}

cmd:playerscount(playerid)
{
new fmt_str[] = "На сервере %d %s",
result_str[((sizeof fmt_str) + ((- 2 + 4) + (- 2 + 7)))],
dest[8];

GetPlayersCountWord(переменная с кол-вом игроком, dest);

format(result_str, sizeof result_str, fmt_str, думаю понятно, dest);
return SendClientMessage(playerid, result_str);
}

PawnoNoob
31.08.2021, 21:14
stock GetPlayersCountWord(count, const dest[], size = sizeof dest)
{
if(size < 8)
return -1;

switch(count)
{
case 1: strcat(dest, "игрок");
case 2..4: strcat(dest, "игрока");
default: strcat(dest, "игроков");
}

return 1;
}

cmd:playerscount(playerid)
{
new fmt_str[] = "На сервере %d %s",
result_str[((sizeof fmt_str) + ((- 2 + 1) + (- 2 + 7)))],
dest[8];

GetPlayersCountWord(переменная с кол-вом игроком, dest);

format(result_str, sizeof result_str, fmt_str, думаю понятно, dest);
return SendClientMessage(playerid, result_str);
}


Это решает мой вопрос, но хотелось бы увидеть общую функцию, которая будет вызываться в различных частях мода (количество игроков, репортов и т.п.).:black_eye:

Shaolinka
31.08.2021, 23:17
Можешь сделать на основе моей, заменив слова, в чём проблема?

UPD: Ну либо вот:


stock GetWord(count, const words[][], const dest[])
{
switch(count)
{
case 1: strcat(dest, words[0]);
case 2..4: strcat(dest, words[1]);
default: strcat(dest, words[2]);
}

return 1;
}

new words[][] = {"репорт", "репорта", "репортов"},
dest[9];

GetWord(5, words, dest);
printf("%d %s", 5, dest);

PawnoNoob
31.08.2021, 23:28
Можешь сделать на основе моей, заменив слова, в чём проблема?

Да я не спорю, просто мне нужна функция, в которой указываются окончания, допустим TextEnd(форматируемый текст, желаемые окончания (несколько))

Shaolinka
31.08.2021, 23:32
Да я не спорю, просто мне нужна функция, в которой указываются окончания, допустим TextEnd(форматируемый текст, желаемые окончания (несколько))

Выше написал, оно?

execution
01.09.2021, 07:28
https://github.com/Open-GTO/Open-GTO/blob/2c69f9847bc53c2f0f3e37cc71085a00d0eb39cc/sources/core/declension.pwn#L27

Nexius_Tailer
01.09.2021, 22:52
Можешь сделать на основе моей, заменив слова, в чём проблема?

UPD: Ну либо вот:


stock GetWord(count, const words[][], const dest[])
{
switch(count)
{
case 1: strcat(dest, words[0]);
case 2..4: strcat(dest, words[1]);
default: strcat(dest, words[2]);
}

return 1;
}

new words[][] = {"репорт", "репорта", "репортов"},
dest[9];

GetWord(5, words, dest);
printf("%d %s", 5, dest);

И в итоге получаем "21 репортов", "22 репортов" и т.д. с любыми числами, где есть более двух десятков + наши единицы-четверки, которые также склоняются.

LINKINPARK
03.09.2021, 04:18
#define GetTrueEnd(%1,%2,%3,%4)\
((%1)%(10)==1&&(%1)%(100)!=11?(%2):(%1)%(10)>=2&&(%1)%(10)<=4&&((%1)%(100)<10||(%1)%(100)>=20)?(%3):(%4))
Внимание: 1-ым параметром ф-и ОБЯЗАТЕЛЬНО должна быть переменная/константа!

format(string, sizeof(string), "Сейчас на сервере игра%s %d человек%s!", GetTrueEnd(all_players,"ет","ют","ют"), all_players, GetTrueEnd(all_players,"","а",""));
и получаем:


Сейчас на сервере играют 0 человек!
Сейчас на сервере играет 1 человек!
Сейчас на сервере играют 2 человека!
Сейчас на сервере играют 5 человек!


Автор функции: -Stranger-