XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Закрытая тема
 
tgonta
Pixelated Sora Coder
offline
Опыт: 3,160
Активность:
Вопрос о подсчёте лучшего
У меня возникла следующая проблема: При запуске моего тригга вар выдаёт критическую ошибку. Просьба помочь в выявлении проблемы. Код ниже.
» Вот код
function CountBestPlayer takes integer playerCount returns integer
    local integer i = 0
    local integer BestPlayer
    loop
        exitwhen i > playerCount
        if(udg_Kills[GetConvertedPlayerId(Player(i))] > udg_Kills[GetConvertedPlayerId(Player(i-1))]) then
            set BestPlayer = udg_Kills[GetConvertedPlayerId(Player(i))]
        else
        endif
        set i = i+1
    endloop
    return BestPlayer
endfunction

function Trig_kmGameTimerExpiration_Actions takes nothing returns nothing
    call DisplayTextToPlayer(Player(CountBestPlayer(10)),0.,0.,"Поздравляем! Вы победили!")
    call DisplayTextToForce( GetPlayersAll(), ( ( ( "Победил игрок " + GetPlayerName(Player(CountBestPlayer(10))) ) + ( ", который набрал " + I2S(udg_Kills[GetConvertedPlayerId(Player(CountBestPlayer(10)))]) )) + " очков!" ))
endfunction

//===========================================================================
function InitTrig_kmGameTimerExpiration takes nothing returns nothing
    local trigger kmend = CreateTrigger()
    call TriggerRegisterTimerExpireEvent(kmend,udg_Timer[1])
    call TriggerAddAction(kmend,function Trig_kmGameTimerExpiration_Actions)
    set kmend = null
endfunction
Старый 16.10.2009, 17:20
Elf_Stratigo

offline
Опыт: 4,699
Активность:
Player(i-1) где i==0 не существует
Старый 16.10.2009, 18:40
_Red

offline
Опыт: 4,095
Активность:
Попробуй так
function CountBestPlayer takes integer playerCount returns integer
    local integer i = 1
    local integer BestPlayer
    loop
        exitwhen i > playerCount
        if(udg_Kills[GetConvertedPlayerId(Player(i-1))] > udg_Kills[GetConvertedPlayerId(Player(i))]) then
            set BestPlayer = udg_Kills[GetConvertedPlayerId(Player(i-1))]
        else
        endif
        set i = i+1
    endloop
    return BestPlayer
endfunction

function Trig_kmGameTimerExpiration_Actions takes nothing returns nothing
    call DisplayTextToPlayer(Player(CountBestPlayer(10)),0.,0.,"Поздравляем! Вы победили!")
    call DisplayTextToForce( GetPlayersAll(), ( ( ( "Победил игрок " + GetPlayerName(Player(CountBestPlayer(10))) ) + ( ", который набрал " + I2S(udg_Kills[GetConvertedPlayerId(Player(CountBestPlayer(10)))]) )) + " очков!" ))
endfunction

//===========================================================================
function InitTrig_kmGameTimerExpiration takes nothing returns nothing
    local trigger kmend = CreateTrigger()
    call TriggerRegisterTimerExpireEvent(kmend,udg_Timer[1])
    call TriggerAddAction(kmend,function Trig_kmGameTimerExpiration_Actions)
    set kmend = null
endfunction
Старый 16.10.2009, 18:43
Elf_Stratigo

offline
Опыт: 4,699
Активность:
у меня токо есть подозрение, что если у всех udg_Kills одинаковые значения, то будет опять крит (BestPlayer не будет инициализирована)
мне кажется алгоритм вообще не верен - может произойти выдача игрока, имеющего не максимум по массиву
необходимо инициализировать BestPlayer первым игроком, и в алгоритме сравнивать с ним, а не с предыдущим
Старый 16.10.2009, 19:12
ScorpioT1000
Работаем
offline
Опыт: отключен
во-первых, замени все
GetConvertedPlayerId(Player(i))
на
i+1
ScorpioT1000 добавил:
омг у вас там минус один тт
тогда просто i
ScorpioT1000 добавил:
это просто смешно)
Старый 16.10.2009, 19:15
silumin

offline
Опыт: 11,153
Активность:
Так будет более верно.
Код:
function CountBestPlayer takes integer playerCount returns integer
    local integer i = 1
    local integer BestPlayer = 0
    set playerCount = playerCount - 1
    loop
        exitwhen i > playerCount
        if(udg_Kills[i] > udg_Kills[i-1]) then
            set BestPlayer = i
        endif
        set i = i+1
    endloop
    return BestPlayer
endfunction

function Trig_kmGameTimerExpiration_Actions takes nothing returns nothing
    call DisplayTextToPlayer(Player(CountBestPlayer(10)),0.,0.,"Поздравляем! Вы победили!")
    call DisplayTextToForce( GetPlayersAll(), ( ( ( "Победил игрок " + GetPlayerName(Player(CountBestPlayer(10))) ) + ( ", который набрал " + I2S(udg_Kills[CountBestPlayer(10)]) )) + " очков!" ))
endfunction

//===========================================================================
function InitTrig_kmGameTimerExpiration takes nothing returns nothing
    local trigger kmend = CreateTrigger()
    call TriggerRegisterTimerExpireEvent(kmend,udg_Timer[1])
    call TriggerAddAction(kmend,function Trig_kmGameTimerExpiration_Actions)
    set kmend = null
endfunction


Ошибка была в том, что твоя функ-я по твоей задумке должна вернуть индекс лучшего игрока, а возвращала кол-во его киллов.

п.с. скопируй всё, не толко функ-ю, были исправления и в действии триггера.

Отредактировано silumin, 16.10.2009 в 20:07.
Старый 16.10.2009, 20:11
tgonta
Pixelated Sora Coder
offline
Опыт: 3,160
Активность:
Всё работает правильно, тему можно закрыть.
Огромное всем спасибо за помощь!
Старый 17.10.2009, 11:23
Закрытая тема

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

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

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 19:21.