Функция рандомного игрока

Сообщения
10
Реакции
0
Всем доброго времени суток! Ломаю голову по-поводу рандомного игрока..

Есть код функции рандом игрока
C++:
public Cmd_FuncRandomPlayer()
{
    new iPlayers[32], iNum, RandomId, i;
    for(i = 1; i <= MaxClients; i++)
    {
        if(!is_user_alive(i)) continue;
        iPlayers[iNum++] = i;
    }
    RandomId = iPlayers[random_num(0, iNum - 1)];
    client_print_color(0, print_team_default, "^1Рандомный игрок: ^4%n", RandomId)
}
Как можно сделать так, чтобы данная функция выбрала вместо одного игрока - сразу трёх? Некоторые люди говорили что нужно код полностью менять, но я не знаю как именно нужно его изменить. Прошу какой-нибудь совет или подсказку. Заранее благодарю.
 
Сообщения
1,701
Реакции
1,512
Помог
26 раз(а)
Сделать RandomId массивом на 3, сделать ещё один цикл после первого на 3 итерации и заполнить RandomId массив рэндомом, исключая уже выбранных.
 
Сообщения
212
Реакции
334
Помог
3 раз(а)
fl0wer, это тривиально решается через SortIntegers с рандомным компаратором (Sort_Random) и выбором первых трех элементов перемешенного массива

C:
public Cmd_FuncRandomPlayer()
{
    new iPlayers[32], iNum, RandomId, i;
    for(i = 1; i <= MaxClients; i++)
    {
        if(!is_user_alive(i)) continue;
        iPlayers[iNum++] = i;
    }
    SortIntegers(iPlayers, iNum, Sort_Random);
    
    // iPlayers[0] — первый случайный игрок
    // iPlayers[1] — второй случайный игрок
    // iPlayers[2] — третий случайный игрок
}
 
Сообщения
10
Реакции
0
@Xelson,но а как быть с переменной RandomId ?
 
Сообщения
673
Реакции
242
Помог
11 раз(а)
Код:
stock setRandomPlayerInfected(const bool: bAftedInfected = false)    {
    new iIndex, iPlayersNum, iPlayers[MAX_PLAYERS + 1];
 
    for(iIndex = 1; iIndex <= MaxClients; iIndex++)
    {
        iPlayers[iPlayersNum++] = iIndex;
    }

    if(iPlayersNum)
    {
        new iNumberInfected = 3
     
        while(iNumberInfected)
        {
            new iTarget = iPlayers[random(iPlayersNum)];
         
            //code

        }
    }
}
 
Сообщения
212
Реакции
334
Помог
3 раз(а)
Limbooc, этот код может при определенных условиях выбрать три раза одного и того же игрока, более того в этом коде бесконечный цикл

Geneor, что с ней? Вместо RandomId используй iPlayers[0], остальные игроки будут iPlayers[1] и iPlayers[2]
 
Сообщения
673
Реакции
242
Помог
11 раз(а)
Limbooc, этот код может при определенных условиях выбрать три раза одного и того же игрока, более того в этом коде бесконечный цикл

Geneor, что с ней? Вместо RandomId используй iPlayers[0], остальные игроки будут iPlayers[1] и iPlayers[2]
в полном коде все ок,
Код:
stock setRandomPlayerInfected(const bool: bAftedInfected = false)    {
    new iIndex, iPlayersNum, iPlayers[MAX_PLAYERS + 1];
    
    for(iIndex = 1; iIndex <= MaxClients; iIndex++)
    {
        if(IsSetBit(gp_iBit[BIT_ALIVE], iIndex) && IsNotSetBit(gp_iBit[BIT_INFECTED], iIndex))
        {
            iPlayers[iPlayersNum++] = iIndex;
        }
    }

    if(iPlayersNum)
    {
        //new iNumberInfected = clamp(floatround(abs(iPlayersNum - 1) / Float:g_iCvar_ZombieRatio, floatround_floor), 1, 31);
        new iNumberInfected = clamp(floatround(abs(iPlayersNum - 1)* g_iCvar_ZombieRatio, floatround_round), 1, 31);
        

        while(iNumberInfected)
        {
            new iTarget = iPlayers[random(iPlayersNum)];
            
            if(IsSetBit(gp_iBit[BIT_HUMAN], iTarget))
            {
                SetBit(gp_iBit[BIT_INFECTED], iTarget);

                iNumberInfected--;
                g_iNumberInfected++;
                


                ExecuteForward(g_Forwards[FW_USER_INFECT_PRE_START_ROUND], g_ForwardResult, iTarget);
                
                if(g_iNumberSoundsAmbienceHumanInfection)
                {
                    static szSound[64];
                    
                    ArrayGetString(g_aAmbienceHumanInfection, random(g_iNumberSoundsAmbienceHumanInfection), szSound, charsmax(szSound));
                    
                    //emit_sound(iTarget, CHAN_AUTO, szSound, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
                    rh_emit_sound2(iTarget, 0, CHAN_AUTO, szSound, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
                }
                
            }
        }
    }
}
 
Сообщения
459
Реакции
272
Помог
9 раз(а)
Limbooc, это не ок, принцип тот-же что и в моде от чипа - может вылететь один и тот-же игрок Энное количество раз подряд, как и писалось выше.
 

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

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу