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

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

Ответ
 
sleepw

offline
Опыт: 8,449
Активность:
Проверка массива
эммь..
есть массив инт [1-10]
как проверить когда в каждом массиве станет значение 2 например?
Старый 26.03.2008, 23:26
DFlyer
<3 MJ
offline
Опыт: 42,879
Активность:
В каждой ячейке ты хотел сказать?
Код:
For Loop Integer A From 1 To 10 Do
  If int[Integer A] =2 then
    set bool=true
  else
    set bool=false
    skip remaining actions

Если в итоге булевая переменная будет равно true, значит все ячейки массива равны 2.

Или более оптимальный вариант на джаззе.
» ArrCheck (jass)

Код:
function arr_check takes integer x returns boolean
  local integer i = 0
  loop
    set i=i+1
    if udg_int[i]!=x then
      return false
    endif
    exitwhen i==10
  endloop
  return true
endfunction

Вызывать так:
Код:
CS:  if arr_check(2) then 
...(триггерные действия, если все ячейки массива равны 2...
CS:  endif
...(остальные действия триггера)

Отредактировано DFlyer, 27.03.2008 в 00:10.
Старый 26.03.2008, 23:35
Mind_Freak
отступник дроу
offline
Опыт: 2,274
Активность:
значение массива меняются ведь когда-то... создай отдельный триггер с 10 условиями(на все индексы) или через цикл с иф зен элсе и вызывай это триггер каждый раз когда меняешь значение.
Старый 26.03.2008, 23:36
sleepw

offline
Опыт: 8,449
Активность:
дык а как же оно считает весь массив.. или я не понимаю или оно будет так:
например массив[2] равно 2
массив[10] равно 1
тоесть при лупе дойдя до массива 2 оно поставит тру ,а потом дойдя до массива 10 поставит фелс и вернёт фелс..=\
Старый 26.03.2008, 23:52
DFlyer
<3 MJ
offline
Опыт: 42,879
Активность:
Ой, я немного ступил. Щас пофиксил.
Смысл такой, проходит по лупу и по порядку проверяет ячейки массива.
int[1]=2 (true)
int[2]=2 (true)
int[3]=2 (true)
int[4]=2 (true)
int[5]!=2 (луп прекращается, возвращает false)
Старый 27.03.2008, 00:09
sleepw

offline
Опыт: 8,449
Активность:
ну х3 имхо оно тут не подходид..

вот де оно должно юзаться:
Код:
function Trig_ntRevive_Actions takes nothing returns nothing
local unit u=GetTriggerUnit()
local integer pn=GetConvertedPlayerId(GetOwningPlayer(u))
    set udg_ntCountLives[pn] =  udg_ntCountLives[pn] + 1
    if arr_check(2) then
    call BJDebugMsg("ALL DEAD :D")
    endif

endfunction


тоесть я не могу знать скоко будет массивов и как они будут расположены.. как тогда?
Старый 27.03.2008, 00:41
J
expert
offline
Опыт: 48,447
Активность:
да принцепи дфлаер все правльно сказал
Цитата:
скоко будет массивов и как они будут расположены

перефразируй...

Jon добавил:
т.е. как я понял у тебя 10 играков, у каждого пара юнитов, и если они все подохли то делать какието действия... так?
Старый 27.03.2008, 00:55
sleepw

offline
Опыт: 8,449
Активность:
не
ну тоесть 10 игроков это макс,но их может же может быть и меньше.
и у каждого по 2 жизни.

когда умирает сетим массив [ид игрока]+1
пока его массив не будет равен 2 будем воскрешать.

ну вот и когда все такие массивы =2 делаем тото

sleepw добавил:
тобишь я же немогу знать точно что массив будет идти 1,2,3...
второго игрока может не быть и тогда будет идти 1,3,4..
Старый 27.03.2008, 00:59
J
expert
offline
Опыт: 48,447
Активность:
тогда я посоветовал бы тебе сделать свой массив играков в котором будут распологатся только играющие игроки, т.к. он может и поже пригодится...
а можно прям в функции дфлаера проверять играет игрок или нет перед проверкой его ячейки
Старый 27.03.2008, 01:05
sleepw

offline
Опыт: 8,449
Активность:
мм так покатит?)

Код:
function PlayersAdd takes nothing returns nothing
local integer i=1
local integer ii=1
loop
exitwhen i>=10
if GetPlayerSlotState(Player(i)) == PLAYER_SLOT_STATE_PLAYING and GetPlayerController(Player(i)) == MAP_CONTROL_USER then
set udg_Players[ii]=Player(i)
set ii=ii+1
endif
set i=i+1
endloop
endfunction
Старый 27.03.2008, 01:18
J
expert
offline
Опыт: 48,447
Активность:
т.е. ты это делаеш для играков от 2 до 8?

короче в идеальном варианте для играков от 1 до 10 (включительно) это будет выглядеть так:
Код:
globals
    player array udg_Players // игроющие игроки от 0 до udg_CoustPlayers
    integer udg_CoustPlayers // (Количество играющих играков - 1)
    integer array udg_PlayerId // Замена функции GetPlayerId(), т.е. возвращает Id годное для этих масивов
    //...
    integer array udg_ntCountLives
endglobals

function PlayersAdd takes nothing returns nothing
    local integer i  =  0
    local integer ii = -1
    loop
        exitwhen i >= 10
        if GetPlayerSlotState(Player(i)) == PLAYER_SLOT_STATE_PLAYING and GetPlayerController(Player(i)) == MAP_CONTROL_USER then
            set ii=ii+1
            set udg_Players[ii]=Player(i)
            set udg_PlayerId[i] = ii
        endif
        set i = i + 1
    endloop
    set udg_CoustPlayers = ii
endfunction

function arr_check takes integer x returns boolean
    local integer i = 0
    loop
        exitwhen i > udg_CoustPlayers
        if udg_ntCountLives[i] != x then
            return false
        endif
        set i = i + 1
    endloop
    return true
endfunction

function Trig_ntRevive_Actions takes nothing returns nothing
    local unit    u  = GetTriggerUnit()
    local integer pn = GetPlayerId(GetOwningPlayer(u))
    set udg_ntCountLives[udg_PlayerId[pn]] =  udg_ntCountLives[udg_PlayerId[pn]] + 1
    if arr_check(2) then
        call BJDebugMsg("ALL DEAD :D")
    endif
endfunction


и последующие цыклы для этих играков оформляй в таком виде:
Код:
local integer i = 0
//local player p
loop
    exitwhen i > udg_CoustPlayers
    //set p = udg_Players[i]
    //...
    // Action
    //...
    set i = i + 1
endloop

Этот метод Очень часто используется для отображения на мультиборде только играющих играков

Отредактировано Jon, 27.03.2008 в 06:50.
Старый 27.03.2008, 01:46
sleepw

offline
Опыт: 8,449
Активность:
мм сенки,буду тестить..

а вот ещё такая идея возникла,что если просто сделать 1 переменную инт
и делаем так:
Код:
globals
integer ntCountMisc=0
endglobals

function ntReviveC takes nothing returns boolean
    return ( GetPlayerSlotState(GetFilterPlayer()) == PLAYER_SLOT_STATE_PLAYING ) and GetPlayerController(GetFilterPlayer()) == MAP_CONTROL_USER
endfunction

function Trig_ntRevive_Actions takes nothing returns nothing
local unit u=GetTriggerUnit()
local integer pn=GetConvertedPlayerId(GetOwningPlayer(u))
local integer count=CountPlayersInForceBJ(GetPlayersMatching(Condition(function ntReviveC)))*3
    set udg_ntCountLives[pn] =  udg_ntCountLives[pn] + 1
    set ntCountMisc=ntCountMisc+1
    if ntCountMisc>=count
    call BJDebugMsg("ALL DEAD :D")
    endif

endfunction

вроде норм считает..:)
Старый 27.03.2008, 05:55
J
expert
offline
Опыт: 48,447
Активность:
GetPlayersMatching() - утечк0

как я понимаю ты просто прибовляеш переменую ntCountMisc на 1 если ктото потерял жизнь, и если потереных жизней в общем больше чем количество играющих играков * 2? Можно и так, только там точно каждый игрок не может потерять больше 2-ух жизней? если да то такой способ тоже пойдет, и переменная массив ntCountLives не нужна будет, но эту ужасную проверку на форс играков убери, занеси значение количества играков в переменую и пользуйся им как у меня в примере, и вообще

май способ универсальнее, т.е. его потом можно будет использовать в любом месте карты что я думаю пригодится.
Старый 27.03.2008, 07:22
sleepw

offline
Опыт: 8,449
Активность:
Jon
ну так игрок же может выйти.. поэтому и не кинул в переменную..

sleepw добавил:
нелюблю много кода которого я не очень понимаю).. если гдето прижмёт буду юзать)
Старый 27.03.2008, 07:29
J
expert
offline
Опыт: 48,447
Активность:
короче я уже сказал как сделать)

если игрок выходит то тебе нужно написать функцию которая

1) сдвигает все индексы массива udg_Players
от udg_PlayerId [GetPlayerId(Вышедший игрок)]+1 до udg_CoustPlayers
на одну ячейку влево/Назад/ИлиКак...

2) уменьшить каждую ячейку массива udg_PlayerId на еденицу
от GetPlayerId(Вышедший игрок)+1 до 10


3) И уменьшает переменую udg_CoustPlayers на еденицу
Старый 27.03.2008, 07:40
Ответ

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

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

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

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



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