UoKit.com Форумы > Кликер > UO Pilot
Страницы: 1, 2, 3, 4
Levo222
Как распределяется очередность выполнения в 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 текст взять на панели. открывается окно даже на "сделать жирным"
Вверх
Cockney
Ничего не понятно, но думаю вопрос про так называемые "ленивые вычисления".

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


Согласно приведенному коду - имеется один цикл while и стопка условий с вызовом функций. В одной итерации A может быть ложно и управление перейдет в B, а на следующей итерации может выполниться условие A, и соответственно в B не попадем. Нет ? A,B,C - переменные, функции ?
Вверх
Levo222
Цитата(Cockney @ 25.7.2019, 18:59)

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

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

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

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

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

Локальные переменные. Но тут мои знания ограничены. Что может быть лучше? Функции, или локальные? Для управления?
Вверх
Cockney
Довольно сложно мне ориентироваться по приведенному коду, т.к. думаю он написан немного нелогично, поэтому предложу то что вижу я.

Код

--Изначально положим, что работать будут все 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
Цитата(Cockney @ 25.7.2019, 21:38)

[code]
myCond()

Не совсем понятно что это за функция

имеется ввиду while condition do … end ?
Вверх
Cockney
По сути да, только в иной форме. myCond() - это функция, в которой происходит поиск картинки\обработка данных и т.п. Ее надо реализовать.
Вверх
Levo222
Цитата(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 не очень подходит
Вверх
Cockney
Цитата
Т.е. в любом моменте кода скрипт проверяет сам себя на истинность? Я то имел в виду проверку блока отвечающего за более высокий приоритет. Задавал функции паузы в начало цикла, но при выполнении действий описанных в паузе скрипт всёравно продолжал доводить до конца проверку условий в цикле и действий по ним. Что в каждую строку func(pause) пихать?



Думаю, стоит начать все же с основ. Конкретный материал не подскажу, но все что выдаст поисковик по запросу "lua циклы, условия, функции" надо посмотреть и постараться освоить.
Вверх
Fors1k
Цитата(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
оказывается, циклы нужны..
Цитата(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)
...
Т.е. задать время чтоли на его выполнение, таймеры например?

Можно и время на выпролнение цикла задать, но я так понимаю код выше уже должен решить Вашу задачу.
Вверх
Invision Power Board © 2001-2024 Invision Power Services, Inc.
Version for Pocket PC © 2006-2024, IPBest Studio.