Доброго времени суток.
Пожалуйста помогите найти ошибку. Всегда возвращает 1(или похожее) что в общем то в дальнейшем считается как первый игрок(красный)
Функция должна выбрать рандомного игрока из играющих людей и чтобы в массиве AccEmpPlayer[номер рандомного игрока] был false(Нет)

Принятый ответ

Должно работать:
function GetRandomPlayerIndex takes nothing returns integer
    set udg_Buf_A = 0
    set bj_forLoopAIndex=0 //red
    set bj_forLoopAIndexEnd=10  //light blue
    loop
        exitwhen(bj_forLoopAIndex>bj_forLoopAIndexEnd)
        if(GetPlayerSlotState(Player(bj_forLoopAIndex))==PLAYER_SLOT_STATE_PLAYING)and(GetPlayerController(Player(bj_forLoopAIndex)))==MAP_CONTROL_USER)and(udg_AccEmpPlayer[bj_forLoopAIndex]==false)then
                set udg_PlayersPlay[udg_Buf_A]=Player(bj_forLoopAIndex)
                set udg_Buf_A=(udg_Buf_A+1)
        endif
    set bj_forLoopAIndex=bj_forLoopAIndex+1
    endloop
    set udg_Random=GetRandomInt(0,udg_Buf_A)
    set udg_RndPlayer=udg_PlayersPlay[udg_Random]
    return udg_RndPlayer
endfunction
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
1
23
5 лет назад
1
потому что не правильно ты получаеш рандом...
судя у тя прибавляет +1 если данный игрок найден. Значит рандом должен
GetRandomInt(1,udg_Buf_A) - 1 возврашает 0 если только 1 красный играет, а если красный и синый то 0,1
0
22
5 лет назад
0
Были ли проверки в многопользовательском режиме? Может компьютер просто находит лишь одного играющего человека в однопользовательском режиме.
И что такое udg_AccEmpPlayer?
0
23
5 лет назад
0
построеник кода убивает которые не нужны конверт и прочего
0
22
5 лет назад
0
Кстати есть функция ForcePickRandomPlayer. Например
function forceUsersFilter takes nothing returns boolean
  return PLAYER_SLOT_STATE_PLAYING == GetPlayerSlotState(GetFilterPlayer()) and MAP_CONTROL_USER == GetPlayerController(GetFilterPlayer())
endfunction

function getRandomPlayer takes nothing returns player
  local force f = CreateForce()
  call ForceEnumPlayers(f, Condition(forceUsersFilter))
  return ForcePickRandomPlayer(f)
endfunction
Не проверял.
0
23
5 лет назад
0
Zahanc, у тя утекает force
0
22
5 лет назад
0
Это пример а не готовая наработка.
0
9
5 лет назад
Отредактирован DarKRs
0
pro100master:
потому что не правильно ты получаеш рандом...
судя у тя прибавляет +1 если данный игрок найден. Значит рандом должен
GetRandomInt(1,udg_Buf_A) - 1 возврашает 0 если только 1 красный играет, а если красный и синый то 0,1
Данное исправление не помогло.
Zahanc:
Были ли проверки в многопользовательском режиме? Может компьютер просто находит лишь одного играющего человека в однопользовательском режиме.
Да по сети тесты проводились
И что такое udg_AccEmpPlayer?
Игрок являющийся принимающей стороной. И должен быть выбран другой рандомный игрок который ею не является. Только 1(один) игрок может быть принимающей стороной.
1
17
5 лет назад
Отредактирован N1ghtSiren
1
Странный способ, но да ладно.
Закиньте оба(или все 3) IF на 1 строку, добавьте слово and (будет проще, меньше шансов запутаться)
Можете код в текстовом варианте скинуть?
0
9
5 лет назад
Отредактирован DarKRs
0
function GetRandomPlayerIndex takes nothing returns integer
    set udg_Buf_A = 0
    set bj_forLoopAIndex = 1
    set bj_forLoopAIndexEnd = 11
    loop
        exitwhen bj_forLoopAIndex > bj_forLoopAIndexEnd
        if ( GetPlayerSlotState(ConvertedPlayer(GetForLoopIndexA())) == PLAYER_SLOT_STATE_PLAYING ) and (GetPlayerController(ConvertedPlayer(GetForLoopIndexA())) == MAP_CONTROL_USER ) and (udg_AccEmpPlayer[GetForLoopIndexA()] == false ) then
                set udg_PlayersPlay[udg_Buf_A] = ConvertedPlayer(GetForLoopIndexA())
                set udg_Buf_A = ( udg_Buf_A + 1 )
        else
        endif
        set bj_forLoopAIndex = bj_forLoopAIndex + 1
    endloop
    set udg_Random = GetRandomInt(1,  udg_Buf_A ) - 1
    set udg_RndPlayer = udg_PlayersPlay[udg_Random]
    return GetConvertedPlayerId(udg_RndPlayer)
endfunction
C "and" ещё не тестил но вот
0
17
5 лет назад
Отредактирован N1ghtSiren
0
Должно работать:
function GetRandomPlayerIndex takes nothing returns integer
    set udg_Buf_A = 0
    set bj_forLoopAIndex=0 //red
    set bj_forLoopAIndexEnd=10  //light blue
    loop
        exitwhen(bj_forLoopAIndex>bj_forLoopAIndexEnd)
        if(GetPlayerSlotState(Player(bj_forLoopAIndex))==PLAYER_SLOT_STATE_PLAYING)and(GetPlayerController(Player(bj_forLoopAIndex)))==MAP_CONTROL_USER)and(udg_AccEmpPlayer[bj_forLoopAIndex]==false)then
                set udg_PlayersPlay[udg_Buf_A]=Player(bj_forLoopAIndex)
                set udg_Buf_A=(udg_Buf_A+1)
        endif
    set bj_forLoopAIndex=bj_forLoopAIndex+1
    endloop
    set udg_Random=GetRandomInt(0,udg_Buf_A)
    set udg_RndPlayer=udg_PlayersPlay[udg_Random]
    return udg_RndPlayer
endfunction
Принятый ответ
0
9
5 лет назад
0
С and заработало.
Спасибо PyCCKuu_4eJl: и pro100master,
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.