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

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


****

Apprentice
Сообщений: 198
Регистрация: 18.11.2017
Группа: Пользователи
Наличность: 44
Пользователь №: 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Отправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 25.7.2019, 14:59
Сообщение #2


*******

Adept
Сообщений: 1.070
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 12373
Пользователь №: 16.156



Ничего не понятно, но думаю вопрос про так называемые "ленивые вычисления".

Цитата
При многократном выполнении условия в точке B что может заставить скрипт тут же перенестись в точку C или A? даже если условия в Б всё еще подходят?


Согласно приведенному коду - имеется один цикл while и стопка условий с вызовом функций. В одной итерации A может быть ложно и управление перейдет в B, а на следующей итерации может выполниться условие A, и соответственно в B не попадем. Нет ? A,B,C - переменные, функции ?
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Levo222
сообщение 25.7.2019, 15:49
Сообщение #3


****

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



Цитата(Cockney @ 25.7.2019, 18:59) *

В одной итерации A может быть ложно

Ну скажем так: Актуальность его уже истекла, но когда-то требовалось, скрипт продолжает молотить всё то же условие пока оно не будет выполнено, а нужно чтобы после первого выполнения продолжил искать

где-то была команда return когда после каждой интерации проверка возвращалась к началу цикла, была команда break когда управление переходило за текущую строку, но в данном контексте как применить?

Цитата(Cockney @ 25.7.2019, 18:59) *

A,B,C - переменные, функции ?

Локальные переменные. Но тут мои знания ограничены. Что может быть лучше? Функции, или локальные? Для управления?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 25.7.2019, 17:38
Сообщение #4


*******

Adept
Сообщений: 1.070
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 12373
Пользователь №: 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. Но не думаю что в этом есть особый смысл.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Levo222
сообщение 25.7.2019, 21:47
Сообщение #5


****

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



Цитата(Cockney @ 25.7.2019, 21:38) *

[code]
myCond()

Не совсем понятно что это за функция
(IMG:https://i.ibb.co/ykMSM7h/Image-201.jpg)
имеется ввиду while condition do … end ?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 25.7.2019, 22:08
Сообщение #6


*******

Adept
Сообщений: 1.070
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 12373
Пользователь №: 16.156



По сути да, только в иной форме. myCond() - это функция, в которой происходит поиск картинки\обработка данных и т.п. Ее надо реализовать.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Levo222
сообщение 26.7.2019, 0:03
Сообщение #7


****

Apprentice
Сообщений: 198
Регистрация: 18.11.2017
Группа: Пользователи
Наличность: 44
Пользователь №: 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 не очень подходит
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 26.7.2019, 0:34
Сообщение #8


*******

Adept
Сообщений: 1.070
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 12373
Пользователь №: 16.156



Цитата
Т.е. в любом моменте кода скрипт проверяет сам себя на истинность? Я то имел в виду проверку блока отвечающего за более высокий приоритет. Задавал функции паузы в начало цикла, но при выполнении действий описанных в паузе скрипт всёравно продолжал доводить до конца проверку условий в цикле и действий по ним. Что в каждую строку func(pause) пихать?



Думаю, стоит начать все же с основ. Конкретный материал не подскажу, но все что выдаст поисковик по запросу "lua циклы, условия, функции" надо посмотреть и постараться освоить.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Fors1k
сообщение 26.7.2019, 1:46
Сообщение #9


****

Apprentice
Сообщений: 164
Регистрация: 19.12.2017
Группа: Пользователи
Наличность: 692
Пользователь №: 18.746
Возраст: 26



Цитата(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 подходит условие.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Fors1k
сообщение 26.7.2019, 2:15
Сообщение #10


****

Apprentice
Сообщений: 164
Регистрация: 19.12.2017
Группа: Пользователи
Наличность: 692
Пользователь №: 18.746
Возраст: 26



оказывается, циклы нужны..
Цитата(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) *
...
Т.е. задать время чтоли на его выполнение, таймеры например?

Можно и время на выпролнение цикла задать, но я так понимаю код выше уже должен решить Вашу задачу.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Levo222
сообщение 26.7.2019, 13:15
Сообщение #11


****

Apprentice
Сообщений: 198
Регистрация: 18.11.2017
Группа: Пользователи
Наличность: 44
Пользователь №: 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


Можно и время на выпролнение цикла задать, но я так понимаю код выше уже должен решить Вашу задачу.

Возможно. Че-то я как-то подзапутался
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Fors1k
сообщение 26.7.2019, 15:27
Сообщение #12


****

Apprentice
Сообщений: 164
Регистрация: 19.12.2017
Группа: Пользователи
Наличность: 692
Пользователь №: 18.746
Возраст: 26



Цитата(Levo222 @ 26.7.2019, 13:15) *

Возможно. Че-то я как-то подзапутался

Опиши условия а б с, и что должно в них выполняться. Попробуем собрать.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 26.7.2019, 17:23
Сообщение #13


***********

Модератор UOPilot
Сообщений: 8.368
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 25837
Пользователь №: 11.279



А не подойдет ли стандартная конструкция типа:
Код

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


--------------------
Скрипты под заказ.
Консультации по UOpilot через ICQ, Skype, Ventrilo, TeamSpeak, TeamViewer 700р/час.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Levo222
сообщение 28.7.2019, 1:46
Сообщение #14


****

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



Цитата(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 конструкция.

Такое я вообще в первый раз вижу. хотя про elseif наслышан
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Levo222
сообщение 27.8.2019, 19:18
Сообщение #15


****

Apprentice
Сообщений: 198
Регистрация: 18.11.2017
Группа: Пользователи
Наличность: 44
Пользователь №: 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
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Fors1k
сообщение 27.8.2019, 22:05
Сообщение #16


****

Apprentice
Сообщений: 164
Регистрация: 19.12.2017
Группа: Пользователи
Наличность: 692
Пользователь №: 18.746
Возраст: 26



Цитата(Levo222 @ 27.8.2019, 19:18) *
Имеется дерево приоритетов:
1 -выжить
2 -атаковать
3 -собрать ресурсы
При любой угрозе выживанию должно переходить к 1 блоку и там проверять и выполнять какие-то условия.

Код
while #a = 1 // Есть угроза жизни
    send A // выполняем необходимые действия, что бы выжить
end_while
while #b = 1 and #a !=1 // Угрозы жизни нет, есть на кого напасть
    send B // атакуем
end_while
while #c = 1 and #a != 1 and #b != 1 // Угрозы жизни нет, атаковать некого
    send C // собираем ресурсы
end_while
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Levo222
сообщение 28.8.2019, 2:07
Сообщение #17


****

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



Цитата(Fors1k @ 28.8.2019, 2:05) *

Код
while #a = 1 // Есть угроза жизни
    send A // выполняем необходимые действия, что бы выжить
end_while
while #b = 1 and #a !=1 // Угрозы жизни нет, есть на кого напасть
    send B // атакуем
end_while
while #c = 1 and #a != 1 and #b != 1 // Угрозы жизни нет, атаковать некого
    send C // собираем ресурсы
end_while


Замечательно.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Levo222
сообщение 5.9.2019, 0:18
Сообщение #18


****

Apprentice
Сообщений: 198
Регистрация: 18.11.2017
Группа: Пользователи
Наличность: 44
Пользователь №: 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 на экран выводить? Плагины какие-то ставят? Какие более совместимы?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

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

 

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