|
|
|
|
Интересная задачка!
|
|
Duosora | Дата: Пятница, 29 Марта 2013, 21:03:42 | Сообщение # 1 |
The cats never sleep...
Группа: Ветераны
Сообщений: 6734
Награды: 10
Репутация: 2161
Блокировки:
| Взято из урока JASS на The Hive Workshop. Автор - Nestharus. Тому, кто её решит, могу дать +20 в репутацию. Задача того стоит. Если Николас поддержит, то сделаем награду выше. edit: SirNikolas подкинет ещё +20. edit2: Ty3uK ещё +10 выдаст.
Ваше задание - сделать следующие чатовые команды: "-create (имя боевой единицы) [номер игрока]" - содержимое круглых скобок - обязательный параметр, содержимое квадратных - опциональный (но самих скобок в строке нет). Если номер игрока не указан, она создаётся для красного игрока (игрок 0). Боевых единиц надо создавать в координатах (0; 0) и как угол указывать 270 градусов. Пример: "-create peasant 11" должен создать работника для коричневого игрока. "-remove [all|random]" - содержимое квадратных скобок - опциональный параметр. Если указан флаг all, то удаляются все созданные боевые единицы. Если указан флаг random, то нужно удалить одну случайную боевую единицу. Если флаг не указан, то удалить всех выделенных игроком боевых единиц. Пример: "-remove all" удалит всех боевых единиц.
Заметьте: вы можете создать до 5 боевых единиц. Если создано уже 5 и игрок просит создать ещё одну, то заменить существующую боевую единицу на ту, которую игрок попросил создать командой в чате. Если боевые единицы не удаляются, а только создаются, то на каждой позиции боевая единица будет заменяться раз в пять команд.
Вы можете создать только 4 свои собственные переменные. Переменные, описанные ниже, не входят в число этих четырёх.- Вы можете объявить дополнительную переменную для хранения подстрок типа string;
- Вы можете объявить дополнительную переменную типа string, чтобы отловить вводимое сообщение;
Если игрок вводит сообщение, которое содержит вообще не чатовую команду или криво введённую чатовую команду, выводить ему сообщение такого вида: "Введённый игроком текст* ------------------------------------------------------------------- ERROR: Invalid Input -------------------------------------------------------------------" ERROR - красным цветом; Введённый игроком текст - синим цветом; всё остальное - зелёным цветом.
Когда вы сохраняете боевую единицу в переменную, поставьте её в координате X, отличающуюся на 128 от координаты предыдущей боевой единицы. Боевые единицы ставятся слева направо, максимум 5 боевых единиц. Не должно быть "дырок"! Если в данный момент на карте находится 4 боевых единицы, то самая крайняя правая позиция должна быть пустой! Используйте ClearTestMessages(), чтобы очистить экран от сообщений об ошибке.
Можно использовать только язык Jass2. Диалекты не допускаются. Можно использовать только локальные переменные и условия, а также вызывать любые функции кроме SetUnitUserData, SetItemUserData и все функции, связанные с кэшем и хэш-таблицами. Можно создать только одну переменную-массив! Нельзя всё остальное, в том числе создавать циклы или писать собственные функции.
edit: Пояснение на вопрос от VasyaBaratrum: В игре находится только один игрок - красный! edit2: Нет, я не дам решение.
Не зли других и сам не злись. Мы - гости в этом мире. И если что не так - смирись, Будь поумнее - улыбнись, Ведь в мире всё закономерно. Зло, излучённое тобой, К тебе вернётся непременно.
|
|
|
|
Murador | Дата: Пятница, 05 Апреля 2013, 20:08:23 | Сообщение # 51 |
Группа: Проверенные
Сообщений: 1221
Награды: 1
Репутация: 446
Блокировки:
| дуос, объясни, в чем сложность сей задачи? может есть подвох которого я не вижу, но я раз 10 перечитал =\ и не нашел его
|
|
|
|
BlackFoxi | Дата: Суббота, 06 Апреля 2013, 09:18:18 | Сообщение # 52 |
2 уровень
Группа: Пользователи
Сообщений: 23
Награды: 0
Репутация: 10
Блокировки:
| Murador, подвох в том, что решение должно прославлять Дуоса. Написано что можно использовать call if else elseif endif local и нельзя все остальное, в том числе loop function set. А как же без set? Решение с тремя переменными. Дуос лесом, интерес спортивный. Код function main takes nothing returns nothing local trigger trgInSz local unit array unitsz local group gAz if GetEventPlayerChatString() == null then set trgInSz = CreateTrigger() call TriggerRegisterPlayerChatEvent( trgInSz, Player(0), "", false ) call TriggerAddAction( trgInSz, function main ) else set gAz = CreateGroup() call GroupEnumUnitsInRange(gAz,0.0,0.0,66.6,null) set unitsz[0] = FirstOfGroup(gAz) call GroupClear(gAz) call GroupEnumUnitsInRange(gAz,128.0,0.0,66.6,null) set unitsz[1] = FirstOfGroup(gAz) call GroupClear(gAz) call GroupEnumUnitsInRange(gAz,256.0,0.0,66.6,null) set unitsz[2] = FirstOfGroup(gAz) call GroupClear(gAz) call GroupEnumUnitsInRange(gAz,384.0,0.0,66.6,null) set unitsz[3] = FirstOfGroup(gAz) call GroupClear(gAz) call GroupEnumUnitsInRange(gAz,512.0,0.0,66.6,null) set unitsz[4] = FirstOfGroup(gAz) call DestroyGroup(gAz) set gAz = null call ClearTextMessages() if SubString(GetEventPlayerChatString(),0,8) == "-create " then if SubString(GetEventPlayerChatString(),StringLength(GetEventPlayerChatString()) - 3,StringLength(GetEventPlayerChatString()) -2) == " " then set unitsz[5]=CreateUnitByName(Player(S2I(SubString(GetEventPlayerChatString(),StringLength(GetEventPlayerChatString())-2,StringLength(GetEventPlayerChat String())))), SubString(GetEventPlayerChatString(),8,StringLength(GetEventPlayerChatString())-3), 512., 0., 270.0) elseif SubString(GetEventPlayerChatString(),StringLength(GetEventPlayerChatString()) - 2,StringLength(GetEventPlayerChatString()) -1) == " " then set unitsz[5]= CreateUnitByName(Player(S2I(SubString(GetEventPlayerChatString(),StringLength(GetEventPlayerChatString())-1,StringLength(GetEventPlayerChatS tring())))), SubString(GetEventPlayerChatString(),8,StringLength(GetEventPlayerChatString()) -2), 512.0, 0., 270.0) else set unitsz[5]= CreateUnitByName(Player(0), SubString(GetEventPlayerChatString(),8,StringLength(GetEventPlayerChatString())), 512.0, 128., 270.0) endif if unitsz[5] != null then call PauseUnit(unitsz[5],true) if GetUnitTypeId(unitsz[4]) != 0 then call RemoveUnit(unitsz[0]) call SetUnitX(unitsz[1],0.0) call SetUnitX(unitsz[2],128.0) call SetUnitX(unitsz[3],256.0) call SetUnitX(unitsz[4],384.0) elseif GetUnitTypeId(unitsz[0]) == 0 then call SetUnitX(unitsz[5],0.0) elseif unitsz[1] == null then call SetUnitX(unitsz[5],128.0) elseif unitsz[2] == null then call SetUnitX(unitsz[5],256.0) elseif unitsz[3] == null then call SetUnitX(unitsz[5],384.0) endif call SetUnitY(unitsz[5],0.0) set unitsz[5] = null else call DisplayTextToPlayer(Player(0),0,0,"|cFF0000FF"+GetEventPlayerChatString()+"\n|cFF00FF00----------------------------------------------------- --------------\n|cFFFF0000ERROR:|cFF00FF00 Invalid Input \n-------------------------------------------------------------------|r\n") endif elseif GetEventPlayerChatString() == "-remove all" then call RemoveUnit(unitsz[0]) call RemoveUnit(unitsz[1]) call RemoveUnit(unitsz[2]) call RemoveUnit(unitsz[3]) call RemoveUnit(unitsz[4]) elseif GetEventPlayerChatString() == "-remove" then if IsUnitSelected(unitsz[0],Player(0)) then call RemoveUnit(unitsz[0]) call SetUnitX(unitsz[1],0.0) call SetUnitX(unitsz[2],128.0) call SetUnitX(unitsz[3],256.0) call SetUnitX(unitsz[4],384.0) set unitsz[1] = unitsz[2] set unitsz[2] = unitsz[3] set unitsz[3] = unitsz[4] endif if IsUnitSelected(unitsz[1],Player(0)) then call RemoveUnit(unitsz[1]) call SetUnitX(unitsz[2],128.0) call SetUnitX(unitsz[3],256.0) call SetUnitX(unitsz[4],384.0) set unitsz[2] = unitsz[3] set unitsz[3] = unitsz[4] endif if IsUnitSelected(unitsz[2],Player(0)) then call RemoveUnit(unitsz[2]) call SetUnitX(unitsz[3],256.0) call SetUnitX(unitsz[4],384.0) set unitsz[3] = unitsz[4] endif if IsUnitSelected(unitsz[3],Player(0)) then call RemoveUnit(unitsz[3]) call SetUnitX(unitsz[4],384.0) endif if IsUnitSelected(unitsz[4],Player(0)) then call RemoveUnit(unitsz[4]) endif elseif GetEventPlayerChatString() == "-remove random" then if GetUnitTypeId(unitsz[0]) != 0 then if GetUnitTypeId(unitsz[1]) == 0 then call RemoveUnit(unitsz[0]) elseif GetUnitTypeId(unitsz[2]) == 0 then if GetRandomInt(0,1) == 0 then call RemoveUnit(unitsz[0]) call SetUnitX(unitsz[1],0.) else call RemoveUnit(unitsz[1]) endif elseif GetUnitTypeId(unitsz[3]) == 0 then if GetRandomInt(0,2) == 0 then call RemoveUnit(unitsz[0]) call SetUnitX(unitsz[1],0.) call SetUnitX(unitsz[2],128.) elseif GetRandomInt(0,1) == 0 then call RemoveUnit(unitsz[1]) call SetUnitX(unitsz[2],128.) else call RemoveUnit(unitsz[2]) endif elseif GetUnitTypeId(unitsz[4]) == 0 then if GetRandomInt(0,3) == 0 then call RemoveUnit(unitsz[0]) call SetUnitX(unitsz[1],0.) call SetUnitX(unitsz[2],128.) call SetUnitX(unitsz[3],256.) elseif GetRandomInt(0,2) == 0 then call RemoveUnit(unitsz[1]) call SetUnitX(unitsz[2],128.) call SetUnitX(unitsz[3],256.) elseif GetRandomInt(0,1) == 0 then call RemoveUnit(unitsz[2]) call SetUnitX(unitsz[3],256.) else call RemoveUnit(unitsz[3]) endif else if GetRandomInt(0,4) == 0 then call RemoveUnit(unitsz[0]) call SetUnitX(unitsz[1],0.) call SetUnitX(unitsz[2],128.) call SetUnitX(unitsz[3],256.) call SetUnitX(unitsz[4],384.) elseif GetRandomInt(0,3) == 0 then call RemoveUnit(unitsz[1]) call SetUnitX(unitsz[2],128.) call SetUnitX(unitsz[3],256.) call SetUnitX(unitsz[4],384.) elseif GetRandomInt(0,2) == 0 then call RemoveUnit(unitsz[1]) call SetUnitX(unitsz[3],256.) call SetUnitX(unitsz[4],384.) elseif GetRandomInt(0,1) == 0 then call RemoveUnit(unitsz[3]) call SetUnitX(unitsz[4],384.) else call RemoveUnit(unitsz[4]) endif endif endif else call DisplayTextToPlayer(Player(0),0,0,"|cFF0000FF"+GetEventPlayerChatString()+"\n|cFF00FF00----------------------------------------------------- --------------\n|cFFFF0000ERROR:|cFF00FF00 Invalid Input \n-------------------------------------------------------------------|r\n") endif set unitsz[0] = null set unitsz[1] = null set unitsz[2] = null set unitsz[3] = null set unitsz[4] = null endif endfunction
|
|
|
|
Ty3uK | Дата: Суббота, 06 Апреля 2013, 11:29:19 | Сообщение # 53 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Я думал, что cJASS и vJASS'овые хуки запрещены. Я бы тогда сэкономил место в коде через препроцессорные циклы.
|
|
|
|
duos94 | Дата: Суббота, 06 Апреля 2013, 12:38:48 | Сообщение # 54 |
2 уровень
Группа: Пользователи
Сообщений: 34
Награды: 0
Репутация: 18
Блокировки:
| Цитата (Duosora) Нет, я не дам решение И тут такой врыв Дуоса. "Болваны! Вы просто вынуждаете меня открыть свое гениальное решение, иначе так будете постить непроходимый бред. Написал же что писать функции нельзя. В JASS2 любые действия могут выполняться только в теле функции. Значит задача не имеет решений."
|
|
|
|
Капитан_Очевидность | Дата: Суббота, 06 Апреля 2013, 12:42:57 | Сообщение # 55 |
1 уровень
Группа: Пользователи
Сообщений: 13
Награды: 0
Репутация: 0
Блокировки:
| На этом топик клоз. Добавлено (06 Апреля 2013, 12:42:57) --------------------------------------------- А Дуосу +50 за единственное правильное решение.
|
|
|
|
Duosora | Дата: Суббота, 06 Апреля 2013, 13:12:34 | Сообщение # 56 |
The cats never sleep...
Группа: Ветераны
Сообщений: 6734
Награды: 10
Репутация: 2161
Блокировки:
| Цитата (Капитан_Очевидность) А Дуосу +50 за единственное правильное решение. Выслал Нестарусу, соглашусь, что решение Алисы говно. Добавлено (06 Апреля 2013, 13:12:34) --------------------------------------------- [13-10-25] Nestharus: another thing is no collections obviously [13-10-29] Nestharus: group is a collection [13-10-32] Nestharus: so if they are using group.. lol [13-10-39] Nestharus: hashtable is also a collection [13-10-45] Nestharus: just no collections allowed [13-11-34] Nestharus: well, they can use collections [13-11-41] Nestharus: just not the native JASS collections.. [13-11-44] Nestharus: so like they can make thei rown, like a stack [13-11-54] Nestharus: but they can't use group, hashtable, force, etc
Лисоньку затралили)
Не зли других и сам не злись. Мы - гости в этом мире. И если что не так - смирись, Будь поумнее - улыбнись, Ведь в мире всё закономерно. Зло, излучённое тобой, К тебе вернётся непременно.
|
|
|
|
Капитан_Очевидность | Дата: Суббота, 06 Апреля 2013, 13:28:40 | Сообщение # 57 |
1 уровень
Группа: Пользователи
Сообщений: 13
Награды: 0
Репутация: 0
Блокировки:
| Выше писали, что задача от Дуоса отличается от задачи Nestharus, запретом GUI и глобальных переменных. Добавлено (06 Апреля 2013, 13:28:40) --------------------------------------------- Разные задачи - разные решения.
|
|
|
|
duos94 | Дата: Среда, 10 Апреля 2013, 18:01:00 | Сообщение # 58 |
2 уровень
Группа: Пользователи
Сообщений: 34
Награды: 0
Репутация: 18
Блокировки:
| Цитата (Duosora) затралили Значит цель топана троллинг? Нужно перенести в общалку? Где мои +50? Задача решена верно. Цитата (duos94) Написал же что писать функции нельзя. В JASS2 любые действия могут выполняться только в теле функции. Значит задача не имеет решений.
|
|
|
|
H_A_PK | Дата: Понедельник, 15 Апреля 2013, 12:10:43 | Сообщение # 59 |
Быдлокодер
Группа: Проверенные
Сообщений: 2605
Награды: 1
Репутация: 822
Блокировки:
| тема говно
проклятье ляжет на любого кто дочитает до конца нет не дочитывай не надо остановись ну всё капец
|
|
|
|
Волчачка | Дата: Вторник, 16 Апреля 2013, 01:10:49 | Сообщение # 60 |
САЙТ УМЕР ППЦ
Группа: Проверенные
Сообщений: 1361
Награды: 0
Репутация: 2165
Блокировки:
| Это просто пример create, но ещё над remove подумаю, и то есть это всё в один триггер и в одну функцию затолкать? Код function Trig_chat_Actions takes nothing returns nothing local string s = GetEventPlayerChatString() local string a = "" local integer b = 1 local integer i = StringLength( s ) set b = S2I( SubString( s, i - 2, i) ) if b < 10 and b > 0 then set a=SubString( s, 8, i - 2) else if b > 9 and b < 13 then set a = SubString( s, 8, i - 3 ) else set a = SubString( s, 8, i) endif endif if b!=0 then call CreateUnit( Player( b - 1 ), UnitId( a ), 0., 0., GetRandomReal( 0., 360. ) ) else call CreateUnit( Player( 0 ), UnitId( a ), 0., 0., GetRandomReal( 0., 360. ) ) endif endfunction
//=========================================================================== function InitTrig_chat takes nothing returns nothing set gg_trg_chat = CreateTrigger( ) call TriggerRegisterPlayerChatEvent( gg_trg_chat, Player(0), "-create", false ) call TriggerAddAction( gg_trg_chat, function Trig_chat_Actions ) endfunction Ага, теперь я понял всю хитрость, как сделать с -remove и -create вместе. и всё в один триггер. Норм прикол.
Сообщение отредактировал Волчачка - Вторник, 16 Апреля 2013, 01:54:53 |
|
|
|
Net | Дата: Четверг, 13 Июня 2013, 21:51:40 | Сообщение # 61 |
2 уровень
Группа: Пользователи
Сообщений: 30
Награды: 0
Репутация: 11
Блокировки:
| А в профиле Дуоса на The Hive Workshop есть ответ Nestharus на решение самого Дуоса: 01-14-2013 06:18 PM Nestharus Re: Project 3 Код Failed ; )
you removed incorrectly
your creation was also very poor : O
the lessons show of a better way to check if something is a digit
it also limits how many vars you create I believe if you read the instructions
look at the pics and you'll see what I meant about removing incorrectly
Jass: * You may only declare 4 of your own variables. * Variables provided do not count towards your 4.
Jass: * You may declare one additional variable for storing *substrings* of type string * * You may declare one additional variable for getting player input of type string * This variable may also be used to store *substrings*
so that's 4 of your own and 2 strings
you declared 7 there (2 strings and 5 of your own)
BJs are also not allowed GroupPickRandomUnit(udg_UnitGroup)
that's a general rule (introduced in an earlier lesson)
|
|
|
|
Волчачка | Дата: Пятница, 14 Июня 2013, 01:23:50 | Сообщение # 62 |
САЙТ УМЕР ППЦ
Группа: Проверенные
Сообщений: 1361
Награды: 0
Репутация: 2165
Блокировки:
| Net, я понял, как это решается, но это просто лишняя трата времени на многочисленные if endif и substring + манипуляция с массивом. Вкратце эта задачка некий тонко-эластичный троллинг Дуоса и не более. Ломать голову из-за какой-то ерунды. А если юнитов будет 40 или 100? конечно без цикла не обойтись никак. А так при 5 юнитов - "Ерунда © Волчий всадник".
Сообщение отредактировал Волчачка - Пятница, 14 Июня 2013, 01:24:09 |
|
|
|
Ty3uK | Дата: Пятница, 14 Июня 2013, 11:08:43 | Сообщение # 63 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| #for ... #endfor
|
|
|
|
Net | Дата: Пятница, 14 Июня 2013, 14:13:34 | Сообщение # 64 |
2 уровень
Группа: Пользователи
Сообщений: 30
Награды: 0
Репутация: 11
Блокировки:
| А три точки, это на каком языке можно? Я так тоже хотю.
|
|
|
|
Ty3uK | Дата: Пятница, 14 Июня 2013, 15:00:30 | Сообщение # 65 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Net, Brainfuck?
|
|
|
|
lawson | Дата: Пятница, 14 Июня 2013, 18:13:53 | Сообщение # 66 |
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
| как можно на яве произвести загрузку всех файлов в определенной папке? Добавлено (14 Июня 2013, 18:13:53) --------------------------------------------- ну тоесть по типу?
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
|
|
|
|
SirNikolas | Дата: Пятница, 14 Июня 2013, 19:33:19 | Сообщение # 67 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Цитата (Net) А три точки, это на каком языке можно? Я так тоже хотю. C. В C++ есть еще второй способ применения. А в стандарте 11 года добавили и третий.Цитата (Ty3uK) Net, Brainfuck?
Сообщение отредактировал SirNikolas - Пятница, 14 Июня 2013, 19:34:01 |
|
|
|
Ty3uK | Дата: Пятница, 14 Июня 2013, 20:06:24 | Сообщение # 68 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| SirNikolas, дык ведь так и есть.
|
|
|
|
Волчачка | Дата: Суббота, 15 Июня 2013, 01:18:18 | Сообщение # 69 |
САЙТ УМЕР ППЦ
Группа: Проверенные
Сообщений: 1361
Награды: 0
Репутация: 2165
Блокировки:
| Тема превратилась во флудильню и оффтопню, предлагаю её закрыть. Полный ответ так и никто и не дал.
|
|
|
|
Ty3uK | Дата: Суббота, 15 Июня 2013, 09:35:22 | Сообщение # 70 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Согласен.
|
|
|
|
|
|
|
|
|
|
|