В этом варианте существует множества логических ошибок:
1) Код спровоцирует бесконечную рекурсию если на сервере не будет ни одного игрока онлайн.
2) Код игнорирует игрока с самым высоким ид.
Во вторых, даже если подправить логические ошибки - реализация остается отвратительной. Конструкция - чистый богосорт, среднее время работы - O(n*n!), максимальное время - O(∞). Рассмотрим самый худший вариант - на сервере с 1000 слотами играет только игрок с 1000 идом. В случае вызова этого участка кода поток будет перегружен до тех пор пока функция random(1001) не выдаст значение 1000 (вероятность = 1/1000 = 0,1%), что определённо забьет сервер на несколько секунд (если даже не минут).
Оптимальная реализация:
PHP код:
new player_pool_size = GetPlayerPoolSize(), onl[MAX_PLAYERS], _onl = 0, win_id = INVALID_PLAYER_ID;
for new _i = 0; _i < player_pool_size+1; _i++ do if IsPlayerConnected(_i) *then onl[_onl++] = _i;
if _onl *then win_id = onl[random(_onl)];
Последний раз редактировалось ^_^; 30.12.2015 в 01:25.
Daniel_Cortez (30.12.2015) Osetin (30.12.2015) VVWVV (30.12.2015)
Зачем так уродовать язык? Намешано чёрте пойми что... Публикуя код, свои собственные макросы следует убирать, а то этот код будет работать только у тебя.
А по теме: так как использование foreach является признаком хорошего тона, то логично будет реализовать это с помощью него:
PHP код:
new winnerid = Iter_Random(Player);
if (winnerid != -1) {
// ...
}
$continue$ (30.12.2015) Daniel_Cortez (30.12.2015) L0ndl3m (30.12.2015) Osetin (30.12.2015) VVWVV (30.12.2015)
Это не макросы а альтернативный синтаксис, код компилируется без всяких ошибок или предупреждений на всех адекватных Pawn компиляторах.
Принцип работы - одинаковый. Foreach не все используют, особенно после того как его автор стер себя и все свои разработки с офф форума.
Последний раз редактировалось ^_^; 30.12.2015 в 01:54.
Судя по постам ТС, событие инициируется игроком, т.е. как минимум онлайн в 1 человека уже есть. Но для универсальности учесть можно.
Вот с этим соглашусь. Никогда больше не буду помогать в 3 часа ночи -_-
Зачем ж так издеваться-то? Можно просто с помощью foreach/y_iterate выбрать случайного игрока из уже готового итератора функцией Iter_Random/Itter_Random.
EDIT: Ninja'd by ziggi.
EDIT[2]:
Моды с foreach всё ещё остались. Равно, как и есть добровольцы, которые поддерживают брошенные работы Y_Less'а, foreach в том числе.
http://forum.sa-mp.com/showthread.php?t=570868
Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
Стол заказов:
Мои работы:
Такой код сам по себе, как документация, разве что русского перевода не предусмотрено. А вообще, можно даже распарсить такие комментарии и сгенерировать веб-страницу с описанием всех функций.PHP код:
/*----------------------------------------------------------------------------*\
Function:
Itter_Random
Params:
itter - Name of the itterator to get a random slot from.
Return:
-
Notes:
Wrapper for Itter_RandomInternal.
native Iter_Random(Iterator:Name<>);
\*----------------------------------------------------------------------------*/
#define Iter_Random Itter_Random
#define Itter_Random(%1) Itter_RandomInternal(_Y_ITER_ARRAY:%1@YSII_Cg,_Y_ITER_ARRAY:%1@YSII_Ag,_Y_ITER_ARRAY_SIZE(%1))
Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
Стол заказов:
Мои работы:
VVWVV (30.12.2015)
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)