Прошу прощения если написал не в тот раздел. Вопрос вот в чём, давненько создал карту... но никак не могу исправить вылеты. Т.е игра идёт нормально если играть скажем 2 на 2 или даже 3 на 3 но при игре 6 на 6 (с ботами) игра вроде не тормозит, но с примерно в 50% случаев заканчивается банальным вылетом без ошибок. Большая часть кода написана на jass (использую jngp). Я не силён в jass, поэтому может что-то не так в коде. Очень хотелось бы понять ошибку и исправить. Грешу на функцию (смысл её в том чтобы боты кастовали заклинания на ближайших вражеских героев в радиусе 1000 ед.) так как вылеты происходят во время боя между героями (как я замечал). Вот код функции которую использую с промежутком в 1 секунду.
function filtgAI takes nothing returns boolean
return IsUnitAliveBJ(GetFilterUnit())==true and IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE)==false and GetUnitAbilityLevel(GetFilterUnit(),'Aloc')==0 and IsUnitType(GetFilterUnit(), UNIT_TYPE_HERO)==true
endfunction

function NewAI2_system takes real distance returns nothing
local group g=CreateGroup()
local unit u=null
local unit AI=null
local real x = 0.
local real y = 0.
local real x2 = 0.
local real y2 = 0.
local integer A = 1
local integer B = 12
loop
 exitwhen A>B
  if IsUnitAliveBJ(udg_hero[A])==true and GetPlayerController(GetOwningPlayer(udg_hero[A]))==MAP_CONTROL_COMPUTER then
  set AI = udg_hero[A]
  set x = GetUnitX(AI)
  set y = GetUnitY(AI)
  call GroupEnumUnitsInRange(g,x,y,distance,Condition(function filtgAI))
  set u=FirstOfGroup(g)
  
    loop
     exitwhen u==null
      if IsUnitEnemy(u,GetOwningPlayer(AI)) == true and IsUnitAliveBJ(AI)==true and IsUnitVisible(u,GetOwningPlayer(AI)) then
        set x2 = GetUnitX(u)
        set y2 = GetUnitY(u)
        call IssueTargetOrder(AI,"thunderbolt",u)
        call IssueTargetOrder(AI,"creepthunderbolt",u)
        call IssueTargetOrder(AI,"banish",u)
        call IssueTargetOrder(AI,"frostnova",u)
        call IssueTargetOrder(AI,"sleep", u)
        call IssueTargetOrder(AI,"shadowstrike",u)
        call IssueTargetOrder(AI,"chainlightning",u)
        call IssueTargetOrder(AI,"drunkenhaze",u)
        call IssueTargetOrder(AI,"acidbomb",u)
        call IssueTargetOrder(AI,"soulburn",u)
        call IssueTargetOrder(AI,"hex",u)
        call IssueTargetOrder(AI,"manaburn",u)
        call IssueTargetOrder(AI,"slow",u)
        call IssueTargetOrder(AI,"cripple",u)
        call IssueTargetOrder(AI,"forkedlighting",u)
        call IssueTargetOrder(AI,"antimagicshell",u)
        call IssueTargetOrder(AI,"entanglingroots",u)
        call IssueTargetOrder(AI,"purge",u)
        call IssueTargetOrder(AI,"ensnare",u)
        // --------C указанием точки--------
        call IssuePointOrder(AI,"flamestrike",x2,y2)
        call IssuePointOrder(AI,"inferno",x2,y2)
        call IssuePointOrder(AI,"shockwave",x2,y2)
        call IssuePointOrder(AI,"clusterrockets",x2,y2)
        call IssuePointOrder(AI,"impale",x2,y2)
        call IssuePointOrder(AI,"rainoffire",x2,y2)
        call IssuePointOrder(AI,"blink",x2,y2)
        call IssuePointOrder(AI,"silence",x2,y2)
        call IssuePointOrder(AI,"breathoffire",x2,y2)
        call IssuePointOrder(AI,"stasistrap",x2,y2)
        call IssuePointOrder(AI,"blizzard",x2,y2)
        // --------Без цели--------
        call IssueImmediateOrder(AI,"waterelemental" )
        call IssueImmediateOrder(AI,"windwalk" )
        call IssueImmediateOrder(AI,"thunderclap" )
        call IssueImmediateOrder(AI,"creepthunderclap" )
        call IssueImmediateOrder(AI,"spiritwolf" )
        call IssueImmediateOrder(AI,"Locustswarm" )
        call IssueImmediateOrder(AI,"Summongrizzly" )
        call IssueImmediateOrder(AI,"stomp" )
        call IssueImmediateOrder(AI,"Serpentward" )
        call IssueImmediateOrder(AI,"metamorphosis" )
        call IssueImmediateOrder(AI,"whirlwind" )
        call IssueImmediateOrder(AI,"fanofknives" )
        call IssueImmediateOrder(AI,"immolation" )
        call IssueImmediateOrder(AI,"berserk" )
        call IssueImmediateOrder(AI,"roar" )
        call IssueImmediateOrder(AI,"manashield" )
        call IssueImmediateOrder(AI,"robogoblin" )
        call IssueImmediateOrder(AI,"battleroar" )
        call RemoveLocation(Location(x2,y2))
        set x2 = 0.
        set y2 = 0.
      call GroupRemoveUnit(g,u)
      set u=FirstOfGroup(g)
      else
      call GroupRemoveUnit(g,u)
      set u=FirstOfGroup(g)
      endif
    endloop
    
   endif
   set A = A +1
 endloop
call DestroyGroup(g)
set g=null
set u=null
set AI=null
set x = 0.0
set y = 0.0
set x2 = 0.0
set y2 = 0.0
set A = 0
set B = 0
endfunction
Может быть проблема в нём? Так-же выкладываю открытую карту. (если кому интересно посмотреть код детальнее)

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

низнаю какой спел у героя перезаряжается, на какой хватает маны, какие спелы у героя вообще есть, и в прочем на основе каких спелов они сделаны
да здравствует бд
FenikS1991:
Я знаю что это координаты умник.. пустые придирки не прокатят
я не только про координаты, я про всё
короче судя по всему ты пытаешься написать прогу которая бы думала вместо тебя
и это очень пичально
поэтому я просто оставлю это здесь
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
2
9 лет назад
Отредактирован FenikS1991
0
nvc123:
FenikS1991, ну во первых ты отдаёшь юниту целую кучу приказов
FenikS1991, и там нету утечки вроде
Как тогда иначе узнать какие спелы имеет герой и приказать кастовать поочерёдно? До этого я так и недодумался, написал так, проверил, работает. (на этом и остановился)
Утечки мб и нету. но вылеты во время боя, а во время боя часто только эта функция срабатывает. Хотя повторюсь что без оптимизации вылетов не заметил. (хотя мб, просто повезло)
0
30
9 лет назад
0
FenikS1991, имхо c++ тоже не особо нормальный
Такс-такс-такс, что тут у нас, магистр руби, питона и эрланга! Ну поучите же нас!

FenikS1991, зачем ты кастуешь сразу ВСЕ спелы?
0
2
9 лет назад
Отредактирован FenikS1991
0
FenikS1991, имхо c++ тоже не особо нормальный
На вкус и цвет товарища нет. А что по поводу "Все спелы" так это потому что я низнаю какой спел у героя перезаряжается, на какой хватает маны, какие спелы у героя вообще есть, и в прочем на основе каких спелов они сделаны
Господи уже голова не варит.
nvc123:
FenikS1991, нет
точка создаётся при вызове метода
вызовешь 100 раз метод - получишь 100 точек
и насколько я помню хэширование точек нигде не юзается
так что это не проблема языка а твоя
FenikS1991, имхо c++ тоже не особо нормальный
FenikS1991, он кастует не по точке x2 y2 а по координатам x2 y2
ты вообще хоть немного понимаешь программирование? (твои ошибки никак не привязаны к языку, так что отговорка "незнаюjass" не прокатит)
Я знаю что это координаты умник.. пустые придирки не прокатят
0
28
9 лет назад
0
низнаю какой спел у героя перезаряжается, на какой хватает маны, какие спелы у героя вообще есть, и в прочем на основе каких спелов они сделаны
да здравствует бд
FenikS1991:
Я знаю что это координаты умник.. пустые придирки не прокатят
я не только про координаты, я про всё
короче судя по всему ты пытаешься написать прогу которая бы думала вместо тебя
и это очень пичально
поэтому я просто оставлю это здесь
Принятый ответ
0
2
9 лет назад
0
Ну вообщем больше помощь не требуется. решение по поиску ошибки нашёл сам (и безо всяких логов кстати) Осталось ждать вылета. Всем спасибо.
0
27
9 лет назад
0
отладочные сообщения добавьте и попробуйте еще раз.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.