|
Очередность в Lua, /--/ |
|
|
Levo222 |
25.7.2019, 5:35
|
Journeyman
Сообщений: 399
Регистрация: 18.11.2017 Группа: Пользователи Наличность: 0
Пользователь №: 18.689
|
Как распределяется очередность выполнения в Lua при многоступенчатой задаче условий? Например есть 3 условия и соответственно 3 действия Код while 1 do wait (1) if A send A else if B wait (1) send B else if C wait (1) send C else end end end end
При данном варианте написания скрипт, скажем так: "увлекается" выполнением второстепенных задач (расположенных ниже) и не переходит к другой строчке пока там что-либо не выполнено. Есть ли способ перемещать скрипт с выполнения определенного пункта(даже если там подходят условия) на более приоритетную задачу? Т.е. задать время чтоли на его выполнение, таймеры например? Если тут нет времени на выполнение как в стандартном варианте Delphi например, то как возвращается вариант с недовыполненным условием, или как задать приоритет одного условия над другим кроме "функции" в каждой строчке? Там каждая строка выполнялась до определённой строки, означающей выполнение другого действия. А здесь как? Если функции, писать проверку функции в каждый if? или только в начало цикла? Допустим выполняется последовательно исключая какие-то функции при проверке: При многократном выполнении условия в точке B что может заставить скрипт тут же перенестись в точку C или A? даже если условия в Б всё еще подходят? Много раз сталкивался с тем, что скрипт выполняет действия в точке B многократно при том, что в точке A они уже также подходят. Он каким-то образом зацикливается на одном ife? пока в нём не исчезнут условия? 0
вобщем если следовать логике построения деревьев то нужно брать основной функцией приоритет 1 а затем от неё раскидывать подфункции с проверкой первой функции, а по ним подфункции с проверкой подфункций 1-й функции(или сразу 1 функции?) а по ним условия с проверкой подфункций подфункций первой функции? Какие еще есть варианты? Т.е. собственно вопрос: Каким образом так быстро перемещается код(и производится там проверка) из одной строчки в другую при проверке функций? даже если там очень большой объем информации. Всё заранее записывается в дамп памяти и присваиваются локальные значения? ___________________________ P.S: что с BB кодами? Невозможно кнопками ни 1 текст взять на панели. открывается окно даже на "сделать жирным"
|
|
|
|
Levo222 |
25.7.2019, 15:49
|
Journeyman
Сообщений: 399
Регистрация: 18.11.2017 Группа: Пользователи Наличность: 0
Пользователь №: 18.689
|
Цитата(Cockney @ 25.7.2019, 18:59) В одной итерации A может быть ложно
Ну скажем так: Актуальность его уже истекла, но когда-то требовалось, скрипт продолжает молотить всё то же условие пока оно не будет выполнено, а нужно чтобы после первого выполнения продолжил искать где-то была команда return когда после каждой интерации проверка возвращалась к началу цикла, была команда break когда управление переходило за текущую строку, но в данном контексте как применить? Цитата(Cockney @ 25.7.2019, 18:59) A,B,C - переменные, функции ?
Локальные переменные. Но тут мои знания ограничены. Что может быть лучше? Функции, или локальные? Для управления?
|
|
|
|
Cockney |
25.7.2019, 17:38
|
Master
Сообщений: 1.395
Регистрация: 22.6.2013 Группа: Пользователи Наличность: 21046
Пользователь №: 16.156
|
Довольно сложно мне ориентироваться по приведенному коду, т.к. думаю он написан немного нелогично, поэтому предложу то что вижу я. Код --Изначально положим, что работать будут все 3 ветки A,B,C = true,true,true
while 1 do if A then send A end if B then send B end if C then send C end --Тут проверяем какое либо условие --и отключаем нужные ветки согласно --условию myCond() if myCond() == 1 then A = false else B,C = false end end
При желании можно делать проверку myCond() в какой либо ветке, выставлять A,B,C и вызывать continue. Но не думаю что в этом есть особый смысл.
|
|
|
|
Levo222 |
26.7.2019, 0:03
|
Journeyman
Сообщений: 399
Регистрация: 18.11.2017 Группа: Пользователи Наличность: 0
Пользователь №: 18.689
|
Цитата(Cockney @ 26.7.2019, 2:08) myCond() - это функция, в которой происходит поиск картинки\обработка данных и т.п. Ее надо реализовать.
т.е. её нет в пилоте? Как её реализовать? Код A,B,C = true,true,true
while 1 do if A then send A end if B then send B end if C then send C end --Тут проверяем какое либо условие --и отключаем нужные ветки согласно --условию myCond() if myCond() == 1 then A = false else B,C = false end end
как перевести это на "русский" язык? типо A,B,C = true,true,true --А Б С - по умолчанию истины и равны 1 --Тут проверяем какое либо условие -- например функцию? local myCond() = function() не подходит? Т.е. в любом моменте кода скрипт проверяет сам себя на истинность? Я то имел в виду проверку блока отвечающего за более высокий приоритет. Задавал функции паузы в начало цикла, но при выполнении действий описанных в паузе скрипт всёравно продолжал доводить до конца проверку условий в цикле и действий по ним. Что в каждую строку func(pause) пихать? т.е. myCond() это не локальная функция? А каким образом тогда её реализовывать? if myCond() == 1 then A = false else B,C = false end --Так получается каждую переменную вписывать чтоли? P.S: Как среднюю кнопку мыши при проверке нажатия реализовать? Что-то у меня middle не очень подходит
|
|
|
|
Fors1k |
26.7.2019, 1:46
|
Journeyman
Сообщений: 497
Регистрация: 19.12.2017 Группа: Пользователи Наличность: 2398
Пользователь №: 18.746
|
Цитата(Levo222 @ 25.7.2019, 5:35) Есть ли способ перемещать скрипт с выполнения определенного пункта(даже если там подходят условия) на более приоритетную задачу?
Код if #a = 1 // шаг 1 log #a = true , Сейчас Шаг №1 else if #b = 1 and #a !=1 // шаг 2 log #b = true , Сейчас Шаг №2 else if #c = 1 and #a != 1 and #b != 1 // шаг 3 log #c = true , Сейчас Шаг №3 end_if end_if end_if end_script Если я правильно понял задачу... Допустим A= 0, идем к B, B= 0, идем к C, C= 1, должны в логе увидеть "#C = true Сейчас Шаг №3", но если в этот момент и A тоже равно 1, то мы уйдем наверх, на более приоритетную задачу( A), даже если для C подходит условие.
--------------------
Для связи
|
|
|
|
Fors1k |
26.7.2019, 2:15
|
Journeyman
Сообщений: 497
Регистрация: 19.12.2017 Группа: Пользователи Наличность: 2398
Пользователь №: 18.746
|
оказывается, циклы нужны..Цитата(Levo222 @ 25.7.2019, 5:35) Например есть 3 условия и соответственно 3 действия Ваш код
Код while 1 do wait (1) if A send A else if B wait (1) send B else if C wait (1) send C else end end end end
При многократном выполнении условия в точке B что может заставить скрипт тут же перенестись в точку C или A? даже если условия в Б всё еще подходят?... В Вашем примере условие B( wait1, send В) выполняется же всего один раз. Там же if , а не цикл. Я так понимаю Вам нужен цикл с многократным выполнением, но что бы он если что, сразу переходил к задачам с более высоким приоритетом. Цитата(Levo222 @ 25.7.2019, 5:35) ... Скрипт выполняет действия в точке B многократно при том, что в точке A они уже также подходят.
Здесь цикл 2( B) будет выполняться многократно, но как только условие A станет подходящим, скрипт переедет в цикл 1( A). Аналогично для цикла 3( C). Если сейчас в нем выполняются действия, но в A или B условия уже подходят, то он выйдет из цикла 3( C) (даже если #c все еще = 1), и перейдет в подходящий цикл, у которого выше приоритет. На сколько я понимаю, это Вы и просили. Код while #a = 1 // цикл 1 log #a = true Сейчас Цикл №1 end_while
while #b = 1 and #a !=1 // цикл 2 log #b = true Сейчас Цикл №2 end_while
while #c = 1 and #a != 1 and #b != 1 // цикл 3 log #c = true Сейчас Цикл №3 end_while
Цитата(Levo222 @ 25.7.2019, 5:35) ... Т.е. задать время чтоли на его выполнение, таймеры например?
Можно и время на выпролнение цикла задать, но я так понимаю код выше уже должен решить Вашу задачу.
--------------------
Для связи
|
|
|
|
Levo222 |
26.7.2019, 13:15
|
Journeyman
Сообщений: 399
Регистрация: 18.11.2017 Группа: Пользователи Наличность: 0
Пользователь №: 18.689
|
Цитата(Fors1k @ 26.7.2019, 6:15) оказывается, циклы нужны..В Вашем примере условие B( wait1, send В) выполняется же всего один раз. Там же if , а не цикл. Я так понимаю Вам нужен цикл с многократным выполнением, но что бы он если что, сразу переходил к задачам с более высоким приоритетом. Здесь цикл 2( B) будет выполняться многократно, но как только условие A станет подходящим, скрипт переедет в цикл 1( A). Аналогично для цикла 3( C). Если сейчас в нем выполняются действия, но в A или B условия уже подходят, то он выйдет из цикла 3( C) (даже если #c все еще = 1), и перейдет в подходящий цикл, у которого выше приоритет. На сколько я понимаю, это Вы и просили. Код while #a = 1 // цикл 1 log #a = true Сейчас Цикл №1 end_while
while #b = 1 and #a !=1 // цикл 2 log #b = true Сейчас Цикл №2 end_while
while #c = 1 and #a != 1 and #b != 1 // цикл 3 log #c = true Сейчас Цикл №3 end_while
Можно и время на выпролнение цикла задать, но я так понимаю код выше уже должен решить Вашу задачу. Возможно. Че-то я как-то подзапутался
|
|
|
|
Levo222 |
27.8.2019, 19:18
|
Journeyman
Сообщений: 399
Регистрация: 18.11.2017 Группа: Пользователи Наличность: 0
Пользователь №: 18.689
|
Цитата(Fors1k @ 26.7.2019, 5:46) Если я правильно понял задачу... Допустим A=0, идем к B, B=0, идем к C, C=1, должны в логе увидеть "#C = true Сейчас Шаг №3", но если в этот момент и A тоже равно 1, то мы уйдем наверх, на более приоритетную задачу(A), даже если для C подходит условие.
Ну да) Цитата(Fors1k @ 26.7.2019, 19:27) Опиши условия а б с, и что должно в них выполняться. Попробуем собрать.
Имеется дерево приоритетов: 1 -выжить 2 -атаковать 3 -собрать ресурсы При любой угрозе выживанию должно переходить к 1 блоку и там проверять и выполнять какие-то условия. Но часто бывает что скрипт увлекается нижестоящими действиями забывая о первостепенной задаче. В то же время существуют моменты, когда атака сама по себе важнее выживания, потому что не все условия в блоке можно проверить и задать, нужно ветвление блоков, которые бы переходили к нижестоящим по приоритету(но в то же время проверяло вышестоящие). короче хочу всё и понемногу))))))) Вобщем и целом я не знаю как задать параметры управления скриптом, чтобы в случае чего у меня блоки переходили к нижестоящим игнорируя более приоритетные, а в обычном состоянии выполняли всё строго по приоритету. Т.е. их нужно еще "ветвить" и задавать какие-то условия переключения от блока к блоку. т.е. при отсутствии более приоритетного нужно чтобы переходило по списку ниже, опять же я не знаю как работает приведенный скрипт: Код while 1 do if A then send A end if B then send B end if C then send C end Он возвращает проверку в начало цикла после каждого If или нет? Цитата(DarkMaster @ 26.7.2019, 21:23) А не подойдет ли стандартная конструкция типа: Код while 1 do if var1 = 1 then code elseif var2 = 2 then code elseif var3 = 3 then code elseif var4 = 4 then code end end
Т.е. это по сути switch конструкция. Таймеры так же возможны: Код local timeout = os.clock() + 5 while timeout > os.clock() do code end
Вашу конструкцию я вообще не понял.. что означает "var1" ? elseif как я понял это условное сокращение команды if ... then ... else чтобы не писать её в несколько строк... которое сразу задаёт блоку статус переходного, в случае отрицательности проверки его условия. - кое- что нашел для elseif Цитата И вообще по-идее в таких ситуациях нужно пользоваться оператором ветвления (switch\case\select и т.д). Но во многих языках он обладает неприятными ограничениями, которые заставляют пользоваться вышеупомянутой конструкцией. Имеет ли Lua тут какие-то ограничения упомянутые? Имеется ли какая-то разница между return и просто выполнением условием в цикле когда нужен возврат к его началу в таком скрипте как ниже? Код while 1 do if A then send A /return? else if B then send B/return? else if C then send C/return? else end end end end
|
|
|
|
Levo222 |
5.9.2019, 0:18
|
Journeyman
Сообщений: 399
Регистрация: 18.11.2017 Группа: Пользователи Наличность: 0
Пользователь №: 18.689
|
Код for i = 1, #button2 do -- проверяем не нажата ли клавиша из button2 local state=GetKeyState(button2[i]) -- зарезервировали State как определение нажатой клавиши из списка local button2 - статус while state and toggle do -- цикл выполняется пока статус клавиши "нажата" local state1, toggle = GetKeyState(0x90) -- (0х90 - Num_Lock) if state then --если горит лампочка if toggle then --log("Нажата клавиша с кодом: " .. button2[i]) send217('{' .. button2[i] .. '}') wait (1) state=GetKeyState(button2[i]) end end end end Непонятно, зачем вот в такой конструкции нужна "For"? Ведь её по сути заменяет проверка нажатой клавиши в цикле + еще и лампочка. Не лучше ли добавить #button2 в само условия исполнения цикла? Или он не обладает такой функцией? И еще не лишнее ли будет там условие определения статуса клавиши после каждого нажатия? Ведь это по-сути время... если убрать state=GetKeyState(button2[i]) из конца списка - как это повлияет на скорость исполнения? И может локальную переменную вынести за цикл фор и while? Чтобы они только в начале определялись? Будет ли так работать скрипт? Или скрипт будет "забывать" назначенную переменную, если выносить её за цикл? + Подскажите как аналог Hinta в Lua на экран выводить? Плагины какие-то ставят? Какие более совместимы?
|
|
|
|
Levo222 |
22.9.2019, 12:00
|
Journeyman
Сообщений: 399
Регистрация: 18.11.2017 Группа: Пользователи Наличность: 0
Пользователь №: 18.689
|
Как присвоить одной и тойже глобальной переменной несколько параметров проверки? притом чтобы эта переменная проверялась на истинность при обращении к ней например a = color(x,y) == 0 И a = color (x1,y1) ~= 435346 а = {color(x,y) == 0 and color (x1,y1) ~= 435346} -- что-то такое будет работать? b = {color(x2,y2) == 0 and color (x3,y3) ~= 43475} может лучше локальными их объявить? Чтобы потом Код while #a = 1 // приоритет 1 send A // действия приоритет 1 end_while while #b = 1 and #a !=1 // приоритет 2 send B // действия приоритета 2 end_while while #c = 1 and #a != 1 and #b != 1 // приоритет 3 send C // действия приоритета 3 end_while Так и сюда же по таймеру из https://forum.uokit.com/index.php?showtopic=69821В эти же циклы нужно сделать таймер выполнения чего-то, при условии того, что оно делалось более N секунд назад Как я понял обнулять таймер в конце цикла плохая затея? если он локально объявлен перед блоком Код if #а = 1 and local Time = 3 --время работы таймера 3 сек local endTimer = os.clock() + Time while os.clock() <= endTimer do --какая переменная здесь является многоприсваевомой? т.е. её можно изменить и использовать для других подобных таймеров И какая из них зарезервирована, а какая сконструированная?
log ("время истекло делаем")--действие действие else -- время не истекло, пропускаем
end Чтобы что-то такое получилось: Код Local Timer = 0 -- изначально полагаем что таймер истёк while #a = 1 // приоритет 1 if time = 0 --время вышло then send A // действия приоритет 1 и запускаем таймер 3 сек local Timer = 3 else --time 1~=0 -- время не вышло send A2 -- действия приоритет 1.1 else end_while while #b = 1 and #a !=1 // приоритет 2 if time 1 --время вышло then send B // действия приоритет 2 else --time 1~=0 -- время не вышло send B2 -- действия приоритет 2.1 else send B // действия приоритета 2 end_while while #c = 1 and #a != 1 and #b != 1 // приоритет 3 и так далее send C // действия приоритета 3 end_while
|
|
|
|
Fors1k |
22.9.2019, 14:19
|
Journeyman
Сообщений: 497
Регистрация: 19.12.2017 Группа: Пользователи Наличность: 2398
Пользователь №: 18.746
|
Цитата(Levo222 @ 22.9.2019, 12:00) Как присвоить одной и тойже глобальной переменной несколько параметров проверки? притом чтобы эта переменная проверялась на истинность при обращении к ней например a = color(x,y) == 0 И a = color (x1,y1) ~= 435346 а = {color(x,y) == 0 and color (x1,y1) ~= 435346} -- что-то такое будет работать? b = {color(x2,y2) == 0 and color (x3,y3) ~= 43475} может лучше локальными их объявить? Чтобы потом Код while #a = 1 // приоритет 1 send A // действия приоритет 1 end_while while #b = 1 and #a !=1 // приоритет 2 send B // действия приоритета 2 end_while while #c = 1 and #a != 1 and #b != 1 // приоритет 3 send C // действия приоритета 3 end_while Код //-----Условия set $a 100, 200 0 and 300, 400 435346 set $b 500, 600 0 and 700, 800 43475 set $c ??? //-----Условные действия while ($a) = 1 // приоритет 1 send A // действия приоритет 1 end_while while ($b) = 1 and ($a) !=1 // приоритет 2 send B // действия приоритета 2 end_while while ($c) = 1 and ($a) != 1 and ($b) != 1 // приоритет 3 send C // действия приоритета 3 end_while Про таймер - непонятна задача. Типа если send A выполняется уже минуту подряд, то нужно вернуться куда-то в начало, или как?
--------------------
Для связи
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|