|
Очередность в 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 |
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 Группа: Пользователи Наличность: 174
Пользователь №: 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 выполняется уже минуту подряд, то нужно вернуться куда-то в начало, или как?
--------------------
Для связи
|
|
|
|
Levo222 |
22.9.2019, 14:45
|
    
Journeyman
Сообщений: 399
Регистрация: 18.11.2017 Группа: Пользователи Наличность: 0
Пользователь №: 18.689

|
Цитата(Fors1k @ 22.9.2019, 18:19)  Код //-----Условия 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 выполняется уже минуту подряд, то нужно вернуться куда-то в начало, или как? Ладно, если применительно к Lua, например пишем функцию Код local TimerB = function () --ограничение на вызов действия по таймеру B - 6 сек local Timeb = 6 local endTimerb = os.clock() + Timeb if os.clock() <= endTimerb then --таймер B истёк local Timeb = 0 end local TimerS = function () --ограничение на вызов действия по таймеру S - 5 сек local Times = 5 local endTimer = os.clock() + Times if os.clock() <= endTimer then --таймер S истёк local Times = 0 end
while #a = 1 // приоритет 1 if TimerB() = 0 --время вышло then send A // действия приоритет 1 else --TimerB ~=0 -- время не вышло send A2 -- действия приоритет 1.1 -- потому что действие Send A часто возможно но не целесообразно чаще чем раз в 6 секунд, поэтому вводим таймер. else end end while #b = 1 and #a !=1 // приоритет 2 if TimerS = 0 --время вышло then send B // действия приоритет 2 else --TimerS ~=0 -- время не вышло send B2 -- действия приоритет 2.1 else send B // действия приоритета 2 end end while #c = 1 and #a != 1 and #b != 1 // приоритет 3 и так далее send C // действия приоритета 3 end_while
таймер для действий которые возможно осуществить но не целесообразно чаще чем раз в N секунд если чаще - лучше перейти к более приоритетным задачам К примеру: У нас есть солдат У него есть возможность построить окоп и стрелять, построение окопа увеличивает обороноспособность солдата, но отнимает его силы К примеру он построил окоп и начал стрелять, но враг разрушил окоп, солдат опять построил окоп, но враг опять разрушил окоп Поскольку окоп по трудовым затратам стоит намного больше простой стрельбы нужно ограничить его применение таймером, чтобы солдат всё же вел какие-то боевые действия потому что в конечном счете наша задача застрелить врага, а не сидеть в окопе! / с окопом, или без него / а не только строить окоп, для этого нужен таймер. Наиболее часто выполняемое действие лица за единицу времени определяет его статус. Если он будет строить окопы - он будет строитель а не солдат, а такого в планах не было. ---------------------------------------- P.S: Я так и не понял какое значение будет иметь например строчка return в функции Код local TimerB = function () --ограничение на вызов действия по таймеру B - 6 сек local Timeb = 6 local endTimerb = os.clock() + Timeb if os.clock() <= endTimerb then --таймер B истёк local Timeb = 0 end если я её добавлю, кажется что недостаточно функциональный скрипт без этих команд что и куда она будет возвращать? P.S: Я забыл что в языке Lua есть возможность использовать математические функции умножение и вычитание так бы функция таймера выглядела примерно: Код local Time1 = 0 local GetTime = os.clock() + Time1 if GetTime()-Time1>3 then
|
|
|
|
Fors1k |
23.9.2019, 0:31
|

    
Journeyman
Сообщений: 497
Регистрация: 19.12.2017 Группа: Пользователи Наличность: 174
Пользователь №: 18.746

|
Цитата(Levo222 @ 22.9.2019, 14:45)  К примеру: У нас есть солдат У него есть возможность построить окоп и стрелять, построение окопа увеличивает обороноспособность солдата, но отнимает его силы К примеру он построил окоп и начал стрелять, но враг разрушил окоп, солдат опять построил окоп, но враг опять разрушил окоп Поскольку окоп по трудовым затратам стоит намного больше простой стрельбы нужно ограничить его применение таймером, чтобы солдат всё же вел какие-то боевые действия потому что в конечном счете наша задача застрелить врага, а не сидеть в окопе! / с окопом, или без него / а не только строить окоп, для этого нужен таймер. Код //-----Условия set $a 100, 200 0 and 300, 400 435346 set $b 500, 600 0 and 700, 800 43475 //-----Условные действия while ($a) = 1 // окопа нет send A // строим окоп end_while // окоп готов set timer1 while (($b) = 1 and ($a) !=1) or (($b) = 1 and timer1 < 6000) // есть враг, окоп построен. Если окоп разрушен, то пойдем его строить не ранее, чем через 6 сек. после его предыдущей постройки. send B // стреляем end_while // враг убит, или пора чинить окоп
--------------------
Для связи
|
|
|
|
Сообщений в этой теме
Levo222 Очередность в Lua 25.7.2019, 5:35 Cockney Ничего не понятно, но думаю вопрос про так называе... 25.7.2019, 14:59 Levo222
В одной итерации A может быть ложно
Ну скажем т... 25.7.2019, 15:49 Cockney Довольно сложно мне ориентироваться по приведенном... 25.7.2019, 17:38 Levo222
[code]
myCond()
Не совсем понятно что это за фу... 25.7.2019, 21:47 Cockney По сути да, только в иной форме. myCond() - это фу... 25.7.2019, 22:08 Levo222
myCond() - это функция, в которой происходит поис... 26.7.2019, 0:03 Cockney
Думаю, стоит начать все же с основ. Конкретный ... 26.7.2019, 0:34 Fors1k
Есть ли способ перемещать скрипт с выполнения опр... 26.7.2019, 1:46 Levo222
Если я правильно понял задачу...
Допустим [b]A=0,... 27.8.2019, 19:18  Fors1k Имеется дерево приоритетов:
1 -выжить
2 -атаковать... 27.8.2019, 22:05   Levo222
while #a = 1 // Есть угроза жизни
send A // выпо... 28.8.2019, 2:07 Fors1k оказывается, циклы нужны..
Например есть 3 услови... 26.7.2019, 2:15 Levo222
оказывается, циклы нужны..
В Вашем примере услов... 26.7.2019, 13:15  Fors1k
Возможно. Че-то я как-то подзапутался
Опиши усло... 26.7.2019, 15:27 DarkMaster А не подойдет ли стандартная конструкция типа:
wh... 26.7.2019, 17:23 Levo222
А не подойдет ли стандартная конструкция типа:
w... 28.7.2019, 1:46 Levo222 for i = 1, #button2 do -- проверяем не нажата ли к... 5.9.2019, 0:18 Levo222 еще бы кто-то показал на простом примере как значе... 22.9.2019, 18:20 Fors1k Флаг в руки) 23.9.2019, 4:01 Levo222 Барабан на шею!( 23.9.2019, 15:00 bumer Fors1k
В общем это будет наверное овтоп, но всё ... 23.9.2019, 15:52  Fors1k
Fors1k
В общем это будет наверное овтоп, но всё... 23.9.2019, 18:21   Levo222
Ага, все верно
НУ вобщем то таймер написал, но о... 26.9.2019, 14:19 DarkMaster
Вы поняли ее правильно. В луа нет switch в чистом... 28.9.2019, 21:08 Levo222
Что в итоге хочется сделать?
Хочется цикличност... 28.9.2019, 22:06 Cockney
Так и есть. Черная магия в чистом виде. 28.9.2019, 23:24 DarkMaster
local function action1()
while ... do
... 29.9.2019, 0:18 DarkMaster
Из того с чем работал, считаю луа самым логичным ... 29.9.2019, 18:04
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|