Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 2 из 2 ПерваяПервая 1 2
Показано с 11 по 17 из 17
  1. #11
    Аватар для StevenH
    Пользователь

    Статус
    Оффлайн
    Регистрация
    13.10.2015
    Сообщений
    516
    Репутация:
    21 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Как вы это выяснили? Код сделали точно так, как показано в примере?
    Я чуть затупил).
    Просьба пока темку не закрывать, сейчас буду заливать на сервер и тестировать там.
    Если будет всё окей, напишу сюда что бы Вы закрыли темку.

  2. #12
    Аватар для ^_^
    Übermensch

    Статус
    Оффлайн
    Регистрация
    25.11.2013
    Сообщений
    157
    Репутация:
    245 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    GetPlayerPoolSize ?
    PHP код:
    new winneridplayer_pool_size GetPlayerPoolSize();
    if (
    player_pool_size == 0)
        
    player_pool_size 1;
    do
    {
        
    winnerid random(player_pool_size);
    }
    while(!
    IsPlayerConnected(winnerid)); 
    Всяко лучше, чем потом выискивать функцию и менять в ней число при увеличении онлайна.
    В этом варианте существует множества логических ошибок:
    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 0win_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.

  3. 3 пользователя(ей) сказали cпасибо:
    Daniel_Cortez (30.12.2015) Osetin (30.12.2015) VVWVV (30.12.2015)
  4. #13
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Цитата Сообщение от ^_^ Посмотреть сообщение
    В этом варианте существует множества логических ошибок:
    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 0win_id INVALID_PLAYER_ID;
    for new 
    _i 0_i player_pool_size_i++ do if IsPlayerConnected(_i) *then onl[_onl++] = _i;
    if 
    _onl *then win_id onl[random(_onl)]; 
    Зачем так уродовать язык? Намешано чёрте пойми что... Публикуя код, свои собственные макросы следует убирать, а то этот код будет работать только у тебя.

    А по теме: так как использование foreach является признаком хорошего тона, то логично будет реализовать это с помощью него:
    PHP код:
    new winnerid Iter_Random(Player);
    if (
    winnerid != -1) {
        
    // ...


  5. 5 пользователя(ей) сказали cпасибо:
    $continue$ (30.12.2015) Daniel_Cortez (30.12.2015) L0ndl3m (30.12.2015) Osetin (30.12.2015) VVWVV (30.12.2015)
  6. #14
    Аватар для ^_^
    Übermensch

    Статус
    Оффлайн
    Регистрация
    25.11.2013
    Сообщений
    157
    Репутация:
    245 ±
    Цитата Сообщение от ziggi Посмотреть сообщение
    Зачем так уродовать язык? Намешано чёрте пойми что... Публикуя код, свои собственные макросы следует убирать, а то этот код будет работать только у тебя.
    Это не макросы а альтернативный синтаксис, код компилируется без всяких ошибок или предупреждений на всех адекватных Pawn компиляторах.
    Цитата Сообщение от ziggi Посмотреть сообщение
    А по теме: так как использование foreach является признаком хорошего тона, то логично будет реализовать это с помощью него:
    PHP код:
    new winnerid Iter_Random(Player);
    if (
    winnerid != -1) {
        
    // ...

    Принцип работы - одинаковый. Foreach не все используют, особенно после того как его автор стер себя и все свои разработки с офф форума.
    Последний раз редактировалось ^_^; 30.12.2015 в 01:54.

  7. #15
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от ^_^ Посмотреть сообщение
    В этом варианте существует множества логических ошибок:
    1) Код спровоцирует бесконечную рекурсию если на сервере не будет ни одного игрока онлайн.
    Судя по постам ТС, событие инициируется игроком, т.е. как минимум онлайн в 1 человека уже есть. Но для универсальности учесть можно.

    Цитата Сообщение от ^_^ Посмотреть сообщение
    2) Код игнорирует игрока с самым высоким ид.
    Вот с этим соглашусь. Никогда больше не буду помогать в 3 часа ночи -_-

    Цитата Сообщение от ^_^ Посмотреть сообщение
    PHP код:
    new player_pool_size GetPlayerPoolSize(), onl[MAX_PLAYERS], _onl 0win_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)]; 
    Зачем ж так издеваться-то? Можно просто с помощью foreach/y_iterate выбрать случайного игрока из уже готового итератора функцией Iter_Random/Itter_Random.

    EDIT: Ninja'd by ziggi.

    EDIT[2]:
    Цитата Сообщение от ^_^ Посмотреть сообщение
    Foreach не все используют, особенно после того как его автор стер себя и все свои разработки с офф форума.
    Моды с foreach всё ещё остались. Равно, как и есть добровольцы, которые поддерживают брошенные работы Y_Less'а, foreach в том числе.
    http://forum.sa-mp.com/showthread.php?t=570868
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  8. 2 пользователя(ей) сказали cпасибо:
    VVWVV (30.12.2015) ^_^ (30.12.2015)
  9. #16
    Аватар для ^_^
    Übermensch

    Статус
    Оффлайн
    Регистрация
    25.11.2013
    Сообщений
    157
    Репутация:
    245 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Зачем ж так издеваться-то? Можно просто с помощью foreach/y_iterate выбрать случайного игрока из уже готового итератора с помощью Iter_Random/Itter_Random.
    Упростил жизнь ТСа, трудновато нынче найти полноценные работы Y_Less-a, не говоря уже про документации на них, а так - бери и вставляй.

  10. #17
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от ^_^ Посмотреть сообщение
    Упростил жизнь ТСа, трудновато нынче найти полноценные работы Y_Less-a, не говоря уже про документации на них, а так - бери и вставляй.
    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).

  11. Пользователь сказал cпасибо:
    VVWVV (30.12.2015)
 

 
Страница 2 из 2 ПерваяПервая 1 2

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •