Здравствуйте, гость ( Вход | Регистрация )

> Очередность в Lua, /--/
Levo222
сообщение 25.7.2019, 5:35
Сообщение #1


*****

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 текст взять на панели. открывается окно даже на "сделать жирным"
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
 
Ответить в эту темуОткрыть новую тему
Ответов
Levo222
сообщение 22.9.2019, 12:00
Сообщение #2


*****

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
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Fors1k
сообщение 22.9.2019, 14:19
Сообщение #3


*****

Journeyman
Сообщений: 497
Регистрация: 19.12.2017
Группа: Пользователи
Наличность: 2158
Пользователь №: 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 выполняется уже минуту подряд, то нужно вернуться куда-то в начало, или как?


--------------------
Для связиИзображение
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Levo222
сообщение 22.9.2019, 14:45
Сообщение #4


*****

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
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Fors1k
сообщение 23.9.2019, 0:31
Сообщение #5


*****

Journeyman
Сообщений: 497
Регистрация: 19.12.2017
Группа: Пользователи
Наличность: 2158
Пользователь №: 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       // враг убит, или пора чинить окоп


--------------------
Для связиИзображение
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Levo222
сообщение 23.9.2019, 0:58
Сообщение #6


*****

Journeyman
Сообщений: 399
Регистрация: 18.11.2017
Группа: Пользователи
Наличность: 0
Пользователь №: 18.689



Цитата(Fors1k @ 23.9.2019, 4:31) *

[code] and timer1 < 6000

НУ, это всё хорошо!) На Lua эта функция как будет выглядеть?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Сообщений в этой теме
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
Fors1k   НУ, это всё хорошо!) На Lua эта функция как б...   23.9.2019, 1:05
Levo222   Понятия не имею=))) может ребята думаю переведут...   23.9.2019, 1:41
Fors1k   Самая большая проблема в переводе то и заключаетс...   23.9.2019, 1:58
Levo222   Ну так пиши на пилоте и не мучайся)) https://foru...   23.9.2019, 3:16
Levo222   /delete/   23.9.2019, 16:03
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


Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 3.6.2024, 7:45
Designed by Nickostyle