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

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

Закрытая тема
 
Markiz

offline
Опыт: 11,432
Активность:
Toadcop
Еще раз.
У YasonDelAlt _абсолютно_ прозрачный код, изящный и красивый. Я в состоянии это оценить, уж поверь. Его задача решена совершенно чисто алгоритмически, однако, видимо, у него не установлен вар, чтобы отдебажить его.
У тебя несколько килобайт мусора, притом совершенно неоптимизированного, и абузящего некоторые фишки движка варкрафта, там где они не нужны. Get it?
Старый 05.07.2007, 23:10
Toadcop

offline
Опыт: 54,313
Активность:
Markiz нед =) это твоё мнение =) я его не разделяю...
Старый 05.07.2007, 23:58
Markiz

offline
Опыт: 11,432
Активность:
Toadcop
---------------->
знаешь, что этот знак обозначает?
Старый 06.07.2007, 00:27
Toadcop

offline
Опыт: 54,313
Активность:
да вот я объясню почему я не писал так как написал Джон... вся фичя заключаетьса в том что меня интересует само задание посебе ! т.е. что и как отзывыи подобные фичи будут по этой теме меня не интересуют мне важно что есть задачя и мне надо иё решить вот и всё это делаю только из за того что мне своего рода интересно. и мои коды не когда не будут прямыми опенсурсами или что то вроде я пишу их для себя или для того что бы они выполняли нужный толк в игре (для чего это всё и делаетьса). заостряютьса на красивом коды только нупы которым больше нечего показать... у меня раньше тоже был такой переод слава богу что я из него вышел (т.е. я пыталса покрасивей код писать) теперь я считаю что бы он был производительным + выполянлса как можно безглючно и без бажно. вот и всё. ТНЕ ЕНД

// ждём чудо кода джона

Toadcop добавил:
Markiz блин какой ?

Toadcop добавил:
Цитата:
---------------->
- ? стрелочга ?
Старый 06.07.2007, 00:37
Markiz

offline
Опыт: 11,432
Активность:
Цитата:
заостряютьса на красивом коды только нупы которым больше нечего показать...

Ясно. Спасибо, больше вопросов не имею.

Markiz добавил:
Спроси у диода, что этот знак значит, диод шарит ~
Старый 06.07.2007, 00:57
Toadcop

offline
Опыт: 54,313
Активность:
Markiz мне без разници что он значит ^^
Цитата:
заостряютьса на красивом коды только нупы которым больше нечего показать...
да кстати это факт =) читать надо внимательно заостряютьса если ты пишеш код незадумаваясь как он будет выгледить он он выходит нормальным то это разные вещи !
Старый 06.07.2007, 01:04
YasonDelAlt

offline
Опыт: 862
Активность:
Господа давайте не разжигать религиозных войн, пусть какждый пишет код так как он хочет. Я пишу код чисто автоматически, так как привык, так как мне удобнее, я НЕ заостряю внимание на красоте и чистоте кода, просто у меня так получается. И по мойму форумы созданы для того, что бы обмениваться знаниями, а код нужно писать так, что б другие поняли в чем его смысл и как он работает.

Toadcop, я действительно представляю, что происодит в JASS движке вара, хотя я его не писал. Я имею представление, как пишутся компиляторы и интерпретаторы, сам неоднократно писал простенькие интерпретаторы.

Что касается дебага, то я и правда не могу поставить вар, т.к. сижу сейчас сижу за машиной в одном захолустном офисе Росгосстраха, а моя машина находится за 1000 км. от меня =(.

Markiz, спасибо за поддержу моего несчастного кода! =)

З.Ы. Меня осенила мысль, модмейкинг это, конечно, хорошо, но неплохо бы двигаться дальше?!! Было бы не плохо создать раздел форума, посвященный игровому программированию (C/C++, DirectX, OpenGL, Искуственный Интелект, Скриптовые движки и т.д.), что скажите?

YasonDelAlt добавил:
Вот подправил, вроде должна правильно работать:
Код:
globals
    string array udg_PartStr
endglobals

function PriceStr takes string Str, integer Amount returns integer
    local integer Index = 0
    local integer blockBegin = 0
    local integer logicBlockSize = 0
    local integer lastSpace = 0
    local integer srcPos = 0
    local integer srcLen
    local boolean tagFlag = false
    local string char
    local string array stack
    local integer stackIndex = -1

    set Str = Str + " " //Добавляя конечный пробел, избавляемся от неправильного разбиения последней части
    set srcLen = StringLength(Str)
    loop
        exitwhen srcPos >= srcLen
        set char = StringCase(SubString(Str, srcPos, srcPos+1), false)
        if char == "|" then
            set tagFlag = true
        elseif char == "c" then
            if tagFlag then
                 set stackIndex = stackIndex + 1 // Впихиваем в стек цвет тега
                 set stack[stackIndex] = SubString(Str, srcPos + 1, srcPos + 7)
                 set srcPos = srcPos + 7
                 if logicBlockSize == 0 then
                     set blockBegin = srcPos
                 endif
            else
                 set logicBlockSize = logicBlockSize + 1
            endif
        elseif char == "r" then 
            if tagFlag then
                 set srcPos = srcPos + 1
                 if stackIndex >= 0 then // Удаляем из стека цвет тега
                     set stack[stackIndex] = ""
                     set stackIndex = stackIndex - 1
                 endif
            else
                 set logicBlockSize = logicBlockSize + 1
            endif
        elseif char == "n" then 
            if tagFlag then
                 set srcPos = srcPos + 1
            else
                 set logicBlockSize = logicBlockSize + 1
            endif
        elseif char == " " then
            if blockBegin == lastSpace + 1 then // Обнаружено слово длиннее нужной части, вываливаемся с ошибкой
                return -1
            endif
            if logicBlockSize > Amount then
                if stackIndex >= 0 then
                    set udg_PartStr[Index] = "|c" + stack[stackIndex] + SubString(Str, blockBegin, lastSpace) + "|r"
                else
                    set udg_PartStr[Index] = SubString(Str, blockBegin, lastSpace)
                endif
                set Index = Index + 1
                set blockBegin = lastSpace + 1
                set logicBlockSize = 0
            endif
            set lastSpace = srcPos
        else
            set logicBlockSize = logicBlockSize + 1
        endif
        set tagFlag = false

        set srcPos = srcPos + 1
    endloop
    if blockBegin < srcLen-1 then // этот кусок закидывает оставшуюся часть строки в массив (если она есть)
        if stackIndex >= 0 then
            set udg_PartStr[Index] = "|c" + stack[stackIndex] + SubString(Str, blockBegin, lastSpace) + "|r"
        else
            set udg_PartStr[Index] = SubString(Str, blockBegin, lastSpace)
        endif
        set Index = Index + 1
    endif
    return Index
endfunction

Отредактировано YasonDelAlt, 11.07.2007 в 06:23.
Старый 06.07.2007, 09:52
Toadcop

offline
Опыт: 54,313
Активность:
Цитата:
Было бы не плохо создать раздел форума, посвященный игровому программированию (C/C++, DirectX, OpenGL, Искуственный Интелект, Скриптовые движки и т.д.), что скажите?
хаха как видно ты не знаком с здесь присутствующими правилами ;) + GameDev или что то вроде тебе в помощь. После этого выражения для меня всё стало ясно о том что я думал с самого начала ^^
....
дык я же писал =) алгоритм не работаспособный. ну он что то там пытаетьса делать =)
вообщем не считая моего смайла самый лутчый. кто этого не осозноёт тот нешарит значит ^^

вот интересная срока для теста ;)
Код:
"|c5500ff00|cffffff00|cffff0000R|nE|nD|rSUXxZ X|cffFEDaaC123N|rEWSHiD|r_Buga|cfF44ddacgaTc|r+dfs3fvserw3s4s sr|cffff0000bnse|rr 3wbr webr bs 34 sn rs |cfffeddacTCX|cff4444ddRules b|nCOOL"

у меня она обрабатываетьса абсолютно коректно... т.е. некогда больше Х символов не режит если небыло пробела то иммено делит на Х символьные куски...

бтв
Цитата:
set Str = Str + " " //Добавляя конечный пробел, избавляемся от неправильного разбиения последней части
я хотел плакать... :'( это из категории бредо операция...
Старый 06.07.2007, 10:49
Markiz

offline
Опыт: 11,432
Активность:
YasonDelAlt
50 строка, не хватает закрывающей скобки.
Ушел тестить.

Markiz добавил:
Toadcop
У тебя в твоем мегатесте слово на 25+ символов.
Цитата:
если небыло пробела то иммено делит на Х символьные куски...

А кто тебе сказал, что автор хотел, чтобы прога работала именно так?

Markiz добавил:
YasonDelAlt
Отсутствует обработка вложенных тегов иди фикси ~

Markiz добавил:
И, кстати, пробелы тоже должны учитываться, как один символ.
А у меня меж тем появилась идейка, пойду-ка я ее реализую.
Старый 06.07.2007, 12:47
Toadcop

offline
Опыт: 54,313
Активность:
Цитата:
И, кстати, пробелы тоже должны учитываться, как один символ.
О_о а как оно это делаетьса в текущем виде ?

Цитата:
У тебя в твоем мегатесте слово на 25+ символов.
дык это тру тест а не говно-тест для ламо алгоритмов !

Цитата:
А кто тебе сказал, что автор хотел, чтобы прога работала именно так?
дык фичя в том что как у мну сложней ^^ + в моём случаи это не проблема т.к. где будет обрезана строка хендлит отдельная функция и та безусловно ей подчиняетьса т.е. я могу делать что надо... без особых сложностей и учётов.
Старый 06.07.2007, 12:54
Markiz

offline
Опыт: 11,432
Активность:
Toadcop
Короче я тебя пока игнорю, ты не способен вести культурную беседу на русском языке.

Markiz добавил:
Код:
globals
  string array udg_PartStr
  string array udg_Stack                    //Intended as stack, but actually used as FIFO buffer
  integer array udg_StackLength             //Size of the chunk, in symbols
  integer udg_StackIndex=-1
endglobals

function echo takes string message returns nothing
  call DisplayTextToPlayer(GetLocalPlayer(), 0, 0, message)
endfunction

function Push takes string S, integer I returns integer
  set udg_StackIndex=udg_StackIndex+1
  set udg_Stack[udg_StackIndex]=S
  set udg_StackLength[udg_StackIndex]=I
  return udg_StackIndex
endfunction

function PriceStr takes string Str, integer Amount returns integer
local integer i=0
local integer LastSpace=0
local integer Index=-1
local integer Size=0
local string TempStr=Str
local string TempChar
  //Getting all the chunks inside stack
  set TempStr=StringCase(Str, false)+" "  //ukral ideyu :p
  loop
    exitwhen i>StringLength(TempStr)
    set TempChar=SubString(TempStr, i, i+1)
    if TempChar=="|" then 
      if SubString(TempStr, i+1, i+2)=="c" then
        set i=i+9
      elseif SubString(TempStr, i+1, i+2)=="n" then
        call Push(SubString(Str, LastSpace, i), Size)
        set LastSpace=i
        set Size=0
        set i=i+1
      else
        set i=i+1
      endif
    elseif TempChar==" " then
      call Push(SubString(Str, LastSpace, i), Size)
      set LastSpace=i
      set Size=0
    else
      set Size=Size+1
    endif
    set i=i+1
  endloop
  //Making up the logical blocks
  set Size=0
  set TempStr=""
  set i=-1
  loop
    set i=i+1
    exitwhen i>udg_StackIndex
    if udg_StackLength[i]>Amount then 
      call echo("Newbish test detected")
      return -1
    endif
    if (Size>0) then
      set Size=Size+1 //A space before the added part
    endif
    if (Size+udg_StackLength[i]<=Amount) then
      set Size=Size+udg_StackLength[i]
      set TempStr=TempStr+udg_Stack[i]
    else 
      set Index=Index+1
      set udg_PartStr[Index]=TempStr
      set Size=0
      set TempStr=""
      set i=i-1
    endif
  endloop
  if TempStr!="" then
    set Index=Index+1
    set udg_PartStr[Index]=TempStr
  endif
  set udg_StackIndex=-1
  return Index
endfunction

Мой вариант.
Старый 06.07.2007, 14:00
Toadcop

offline
Опыт: 54,313
Активность:
<_< ужос... детские приколы вообщем :thumb down: я про то что "Newbish test detected"
вообщем это нерабочий алгоритм. кстати очень похожая фичя как прикольчеги Какос насчёт хгм <_<

Toadcop добавил:
Цитата:
Короче я тебя пока игнорю, ты не способен вести культурную беседу на русском языке.
ну как хош ^^
Старый 06.07.2007, 17:44
YasonDelAlt

offline
Опыт: 862
Активность:
Toadcop
Цитата:
если небыло пробела то иммено делит на Х символьные куски...
Jon поставил как раз противоположную задачу, строка должна разбиваться только по пробелам.
Кстати, эта, так называемая, бредооперация избавляет от кучи лишнего кода и позволяет обработать почти всю строку одним и тем же кодом. Да и еще, ты похоже не чувствуешь разници между понятиями "нерабочий алгоритм" и "нерабочий КОД", помедетируй над этим. И что это за представление у тебя сложилось обо мне? Программист не в состоянии заниматься модмейкингом, так что ли? Как раз то, чем мы здесь занимаемся, это и есть детские приколы настоящий мод должен изменять структуру и логику игры, а этого без знания программирования и перелопачивания кода игры ни как не сделать!
Вот еще один аргумент в пользу "красивого" кода. Я добовляю поддержку кирилицы с минимумом телодвижений:
Код:
globals
    string array udg_PartStr
endglobals

function PriceStr takes string Str, integer Amount returns integer
    local integer Index = 0
    local integer blockBegin = 0
    local integer logicBlockSize = 0
    local integer lastSpace = 0
    local integer srcPos = 0
    local integer srcLen
    local boolean tagFlag = false
    local string char
    local string array stack
    local integer stackIndex = -1
    local string a = SubString("А",0,1) // !
    local string b = SubString("р",0,1) // !

    set Str = Str + " " //Добавляя конечный пробел, избавляемся от неправильного разбиения последней части
    set srcLen = StringLength(Str)
    loop
        exitwhen srcPos >= srcLen
        set char = StringCase(SubString(Str, srcPos, srcPos+1), false)
        if char == "|" then
            set tagFlag = true
        elseif char == "c" then
            if tagFlag then
                 set stackIndex = stackIndex + 1 // Впихиваем в стек цвет тега
                 set stack[stackIndex] = SubString(Str, srcPos + 1, srcPos + 7)
                 set srcPos = srcPos + 7
                 if logicBlockSize == 0 then
                     set blockBegin = srcPos
                 endif
            else
                 set logicBlockSize = logicBlockSize + 1
            endif
        elseif char == "r" then 
            if tagFlag then
                 set srcPos = srcPos + 1
                 if stackIndex >= 0 then // Удаляем из стека цвет тега
                     set stack[stackIndex] = ""
                     set stackIndex = stackIndex - 1
                 endif
            else
                 set logicBlockSize = logicBlockSize + 1
            endif
        elseif char == "n" then 
            if tagFlag then
                 set srcPos = srcPos + 1
            else
                 set logicBlockSize = logicBlockSize + 1
            endif
        elseif char == " " then
            if blockBegin == lastSpace + 1 then // Обнаружено слово длиннее нужной части, вываливаемся с ошибкой
                return -1
            endif
            if logicBlockSize > Amount then
                if stackIndex >= 0 then
                    set udg_PartStr[Index] = "|c" + stack[stackIndex] + SubString(Str, blockBegin, lastSpace) + "|r"
                else
                    set udg_PartStr[Index] = SubString(Str, blockBegin, lastSpace)
                endif
                set Index = Index + 1
                set blockBegin = lastSpace + 1
                set logicBlockSize = 0
            endif
            set lastSpace = srcPos
        elseif (char == a) or (char == b) then      // ! // этот маленький кусочек кода добовляет поддрежку кирилицы
            set srcPos = srcPos + 1                  // !
            set logicBlockSize = logicBlockSize + 1 // !
        else
            set logicBlockSize = logicBlockSize + 1
        endif
        set tagFlag = false

        set srcPos = srcPos + 1
    endloop
    if blockBegin < srcLen-1 then // этот кусок закидывает оставшуюся часть строки в массив (если она есть)
        if stackIndex >= 0 then
            set udg_PartStr[Index] = "|c" + stack[stackIndex] + SubString(Str, blockBegin, lastSpace) + "|r"
        else
            set udg_PartStr[Index] = SubString(Str, blockBegin, lastSpace)
        endif
        set Index = Index + 1
    endif
    return Index
endfunction
Старый 11.07.2007, 06:44
Markiz

offline
Опыт: 11,432
Активность:
YasonDelAlt
У тебя была там проблема со вложенными цветовыми тегами в прошлой версии (эту не проверял пока).
|cffff00001|cff00ff002|r|r интерпретировалось как
1ff00ff002
У меня в принципе код немного похож, но сама идея чуть другая:
Вначале я выделяю все части, на ходу вычисляю их длину (у "|cffffcc001123|r" длина 4) и пихаю в FIFO очередь. Затем, на основании уже имеющейся длин частей очень просто строить итоговый массив.
Старый 11.07.2007, 09:20
Toadcop

offline
Опыт: 54,313
Активность:
Цитата:
а этого без знания программирования и перелопачивания кода игры ни как не сделать!
ты что дезасемблируеш war3.exe + game.dll (он впринципе важней) ? ну удачи.

YasonDelAlt ты что то в своём коде изменял ? т.к. результат тот же =) ну вообщем я с самого начала значл что это будет сосо. многие переоценивают свой скилл и не могут нормально определеить уровень сложности задачи. кстати насчёт обрезания слова "там где есть последний пробел" имхо лажа =) вы просто не шарите (я написал почему в преведущем придложение). да представите что будет строка которая почти не содержит пробелов ! то ваши алги будут ужасно пороть всё создавая строки привышающие лимит в 2,3 раза О_О и они будут вылезать за предел.
вообщем всё ясно.

// "и его не вернуть ты считаеш до ста ты мечтаеш уснуть..." где Джон ? =)
Старый 11.07.2007, 11:06
Markiz

offline
Опыт: 11,432
Активность:
Toadcop
Мой код работал, хотя я его и не тестил мега интенсивно.
Ты бы все-таки проверял, а не додумывал за меня.
Цитата:
то ваши алги будут ужасно пороть всё создавая строки привышающие лимит в 2,3 раза О_О и они будут вылезать за предел.

Вообще глупость какая-то.
Условия задачи подразумевают, что все тесты корректны и проверки на дураков не надо.
Старый 11.07.2007, 14:23
Toadcop

offline
Опыт: 54,313
Активность:
автор автор не учёл этого ? у меня больше опыта я знаю как надо делать правильней <_<

Цитата:
Ты бы все-таки проверял, а не додумывал за меня.
ну на детских строках то возможно...
Цитата:
Вообще глупость какая-то.
Условия задачи подразумевают, что все тесты корректны и проверки на дураков не надо.
туалетная бугага =) смешно в "вашем" случаи то что вы пишите не где НЕ применимо из за кучи недочотов которые могут случитьса в практике ! а типо "вот смотрите я умны много знаю и написал парашу котороя соответствует требованием автора" как видно не применима на практике. джона долго нету =/ пусть клозит тхрид быстрей...

Toadcop добавил:
Цитата:
хотя я его и не тестил мега интенсивно
это большая ошибка многих "тру" кодеров...
Старый 11.07.2007, 18:33
Markiz

offline
Опыт: 11,432
Активность:
Цитата:
автор автор не учёл этого ? у меня больше опыта я знаю как надо делать правильней <_<

Хахах.
Цитата:
ну на детских строках то возможно...

Ну если ты не способен писать читабельный код, ничем не могу помочь.
Цитата:
туалетная бугага =) смешно в "вашем" случаи то что вы пишите не где НЕ применимо из за кучи недочотов которые могут случитьса в практике ! а типо "вот смотрите я умны много знаю и написал парашу котороя соответствует требованием автора" как видно не применима на практике. джона долго нету =/ пусть клозит тхрид быстрей...

Я-то знаю, зачем именно джонегу могло такое понадобиться - перенос строки для флоатинг текста.
Цитата:
это большая ошибка многих "тру" кодеров...

Ключевое слово "мега".
Я проверил на десяти или пятнадцати примерах и оно работало.
Старый 11.07.2007, 20:31
J
expert
offline
Опыт: 48,447
Активность:
а у меня длинее, а у меня длинее. (с) Jon

Toadcop делать проверку на действительность цветогово тега ненужно... т.к. на практике давольно редко и скорее всего никогда не будут встрачатся подобные строки "||rc|c|C\|c\|C|R|rr", такчто проверять на 0-F, только лишняя тратьа производительности.. имхо...

Jon добавил:
Цитата:
// ждём чудо кода джона
хватит говорить сол мной какбудто я считаю себя гением... я не ты

Jon добавил:
Цитата:
Я-то знаю, зачем именно джонегу могло такое понадобиться - перенос строки для флоатинг текста.
тру
Старый 11.07.2007, 20:41
Markiz

offline
Опыт: 11,432
Активность:
Jon
Я угадал про область применения? :<

Markiz добавил:
Markiz
А ну вот пост появился, ты был прав дружище xD
Старый 11.07.2007, 20:47
Закрытая тема

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

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

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

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



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