Помощь - Поиск - Пользователи - Календарь
Полная версия: Очередность в Lua
UoKit.com Форумы > Кликер > UO Pilot
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) *
...
Т.е. задать время чтоли на его выполнение, таймеры например?

Можно и время на выпролнение цикла задать, но я так понимаю код выше уже должен решить Вашу задачу.
Levo222
Цитата(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


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

Возможно. Че-то я как-то подзапутался
Fors1k
Цитата(Levo222 @ 26.7.2019, 13:15) *

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

Опиши условия а б с, и что должно в них выполняться. Попробуем собрать.
DarkMaster
А не подойдет ли стандартная конструкция типа:
Код

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
Levo222
Цитата(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 наслышан
Levo222
Цитата(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
Fors1k
Цитата(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
Levo222
Цитата(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


Замечательно.
Levo222
Код
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
Как присвоить одной и тойже глобальной переменной несколько параметров проверки?
притом чтобы эта переменная проверялась на истинность при обращении к ней
например 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
Цитата(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
Цитата(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
Levo222
еще бы кто-то показал на простом примере как значения из одной программы передать в интерпретатор/файл, который прочитает интерпретатор а прочитав интерпретатором, обновить, или обмен данными через оперативную память, а то что-то все эти findcolorы и image уже мягко говоря напрягают)
например нашел в функциях общего Lua такой пример:
Код
-- table is in the stack at index 't'

lua_pushnil(L);  // first key
while (lua_next(L, t) != 0)
{
  printf("%s - %s\\n", luaL_typename(L, -2), luaL_typename(L, -1));

  lua_pop(L, 1);
}

по типу ключ-значение, как я понимаю при копировании в оперативную память нужно присваивать какую-то шифровку данным, чтобы они не путались между собой? Как в данном случае между 2-мя программами будет выглядеть"отправка-запись-чтение-интерпретация-действие"? Скажем между 2-мя пилотами?
Fors1k
Цитата(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
Цитата(Fors1k @ 23.9.2019, 4:31) *

[code] and timer1 < 6000

НУ, это всё хорошо!) На Lua эта функция как будет выглядеть?
Fors1k
Цитата(Levo222 @ 23.9.2019, 0:58) *

НУ, это всё хорошо!) На Lua эта функция как будет выглядеть?

Понятия не имею=)))
Ну либо на пилоте запиши скрипт, либо может ребята думаю переведут этот код на луа, если нужно)
Levo222
Цитата(Fors1k @ 23.9.2019, 5:05) *

Понятия не имею=)))
может ребята думаю переведут этот код на луа, если нужно)

Самая большая проблема в переводе то и заключается. Идеи то и у меня есть)
Просто там куча запятых, ошибившись хоть в 1 из них можно получить кучу мусора.
Fors1k
Цитата(Levo222 @ 23.9.2019, 1:41) *

Самая большая проблема в переводе то и заключается. Идеи то и у меня есть)
Просто там куча запятых, ошибившись хоть в 1 из них можно получить кучу мусора.

Ну так пиши на пилоте и не мучайся)) Изображение
Levo222
Цитата(Fors1k @ 23.9.2019, 5:58) *

Ну так пиши на пилоте и не мучайся)) Изображение

Вкусивший скорость и возможности Lua никогда больше не вернётся к старому... Эмм. Пилоту?
Fors1k
Флаг в руки)
Levo222
Барабан на шею!(
bumer
Fors1k

В общем это будет наверное овтоп, но всё же хочется понять

Код

set $a 100, 200 0 and 300, 400 435346

Что чего определяет
set $a (100, 200) это наверно координаты х,у. 0 нолик цвет? and (300, 400) вторая координата х,у.? 435346 это наверное ещё одни цвет...
Я всё правильно понимаю?
Levo222
/delete/
Fors1k
Цитата(bumer @ 23.9.2019, 15:52) *

Fors1k

В общем это будет наверное овтоп, но всё же хочется понять

Код

set $a 100, 200 0 and 300, 400 435346

Что чего определяет
set $a (100, 200) это наверно координаты х,у. 0 нолик цвет? and (300, 400) вторая координата х,у.? 435346 это наверное ещё одни цвет...
Я всё правильно понимаю?

Ага, все верно
Levo222
Цитата(Fors1k @ 23.9.2019, 22:21) *

Ага, все верно

НУ вобщем то таймер написал, но он выглядит громоздко. И код как-будто давится им
Код
lastTimeProcessed = os.clock()
local function IsTimeToProcess(currentTime)
span = currentTime - lastTimeProcessed
if  span >= 6 then
    lastTimeProcessed = currentTime
    return true
    end
    return false
    end


Нельзя ли сделать попроще?

потому что в блоке приходится проверять и IsTimeToProcess(os.clock()) и true, что несколько не соответствует упрощению кода.
DarkMaster
Цитата
Вашу конструкцию я вообще не понял..
что означает "var1" ?
elseif как я понял это условное сокращение команды if ... then ... else чтобы не писать её в несколько строк... которое сразу задаёт блоку статус переходного, в случае отрицательности проверки его условия.
- кое- что нашел для elseif
Цитата
И вообще по-идее в таких ситуациях нужно пользоваться оператором ветвления (switch\case\select и т.д). Но во многих языках он обладает неприятными ограничениями, которые заставляют пользоваться вышеупомянутой конструкцией.

Имеет ли Lua тут какие-то ограничения упомянутые?

Имеется ли какая-то разница между return и просто выполнением условием в цикле когда нужен возврат к его началу в таком скрипте как ниже?

Вы поняли ее правильно. В луа нет switch в чистом виде и его действительно заменяет вот это упрощение elseif чтобы не городить кучу вложенностей. Читается намного проще и практически приведен вид к стандартному switch.

Можно спустя весь этот код и разбирательства поставить задачу заного? Так сказать после переосмысления. Что в итоге хочется сделать?
Levo222
Цитата(DarkMaster @ 29.9.2019, 1:08) *

Что в итоге хочется сделать?

Хочется цикличность блоков задать в виде
Цитата(Fors1k @ 28.8.2019, 2:05) *

Код

local a = (...)
local b = (...)
local c = (...)
local f = (...)

...
while #a = 1 do// приоритет 1
if f == 1 then
    send A // выполняем необходимые действия
elseif f1 == 1 then
send B
end
end
end

while (#b = 1 and #a !=1) do // приоритет 2
if f == 1 then
    send A1 // выполняем необходимые действия
elseif f2 == 1 then
send B1
end
end
end

while (#c = 1 and #a != 1 and #b != 1) do // приоритет 3
if f == 1 then
    send A2 // выполняем необходимые действия
elseif f3 == nil
send B2
end
end
end


Но я слаб в функциях
Много очень переменных - вобще сложилось впечатление что производители Lua кода, да и может других языков, каждый раз лепят какого-то "франкенштейна" из нерабочих частей что-то слепили, оно вроде шевелится, но непонятно за счет чего работает.
Cockney
Цитата
вобще сложилось впечатление что производители Lua кода, да и может других языков, каждый раз лепят какого-то "франкенштейна" из нерабочих частей что-то слепили, оно вроде шевелится, но непонятно за счет чего работает.


Так и есть. Черная магия в чистом виде.
DarkMaster
Код

local function action1()
    while ... do
        ...
    end
end

local function action2()
    while ... do
        ...
    end
end

local function action3()
    while ... do
        ...
    end
end

while 1 do
    if ... then
        action1()
    elseif ... then
        action2()
    elseif ... then
        action3()
    end
end

Если именно приоритет, то вот оно вот самое.
DarkMaster
Цитата
Много очень переменных - вобще сложилось впечатление что производители Lua кода, да и может других языков, каждый раз лепят какого-то "франкенштейна" из нерабочих частей что-то слепили, оно вроде шевелится, но непонятно за счет чего работает.

Из того с чем работал, считаю луа самым логичным и выверенным языком. Тут кончено нужно понимать, что он и достаточно мал сам по себе и вылизать такой объем несопопставимо проще, но тем не менее. При этом еще и в рамках этой простоты получить такую гибкость...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Русская версия Invision Power Board © 2001-2024 Invision Power Services, Inc.