Помощь - Поиск - Пользователи - Календарь
Полная версия: -Счётчик
UoKit.com Форумы > Кликер > UO Pilot
Страницы: 1, 2
Levo222
Как на Lua создать счетчик последовательного выполнения действия с присвоением каждому действию кликов координат? (с досрочным выходом из цикла в случае достижения макс числа)
code

Код
Local TCicleMax = 3 --максимальное кол-во
Count = Count + 1
local H1 = Kleft(100, 200) --первый контейнер
local H2 = Kleft(100, 300) --второй контейнер
local H3 = Kleft(100, 400) --третий контейнер

local h = findwindow("Containtg")
local t = os.clock()
While t > os.clock() do
  while Контейнер не полон (789, 9) ~= 9078784 do --Выполнять до тех пор пока контейнер не полон
    workwindow (h [1][1])
    hint ("Проверяю заполненность")
    wait (100)
    if  Контейнерполон (789, 9) == 9078785 --
    and что-то еще (10, 82) ~= 0  
    then
      hint ("Контейнер полон")
      alarm ("Контейнер полон.wav")
--но вот как узнать какой контейнер по счёту? потому что всего их 3. И если все 3 гонять по кругу это будет тупо.
      --Смотрим счётчик
      wait (10)
      --Если счётчик 3 (т.е. применялись H1, H2, H3)
      break --т.е. все 3 контейнера полны
   alarm ("Все контейнеры наполнены.wav")
    else --счетчик не 3
      --Проверка следующего контейнера--
      for i=1, #h do
        hint ("Открытие")
        workwindow (h[i][1])
        --drawtext(HNDL, '...\r\n...', 70, 300, 48, 'Segoe Print', 65279, 16000000)
        send217 ("5")
        wait (500)
--Здесь нужна какая-то функция открытия того контейнера, которыйне нажимался еще
        Kleft(Контейнер который не нажимался) --Т.е. H2/H3 второй/третий контейнер
        wait (500)
        send217 ("у")
        wait (1500)
        alarm ("Открытие контейнера.wav")
      end
    else
      hint ("Контейнер не заполнен")
      wait (200)
    end
  end
  alarm ("Завершение работы.wav")
  --log("Завершение работы")
  wait (500)

end

Если достигнуто TCicleMax, т.е. где-то в цикле уже прожимались H2 и H3 то цикл полностью завершает свою работу.
Т.е. важно чтобы скрипт помнил какие контейнеры он уже открывал, чтобы больше к ним не возвращаться.
cirus
Создать массив, в который записывать выполнялось ли действие. Принцип такой:
Код
--lua
local H = {{100, 200}, {100, 300}, {100, 400}}
local count = {0, 1, 0}  -- изначально массив заполняем нулями, для примера действие 2 уже выполнено

log 'clear'  log 'mode compact'
for i=1, 3 do
    if count [i] == 0 then  -- если действие ещё не выполнялось
        -- тут какое-то условие, если истина, то выполнить действие
        log (H[i][1], H[i][2])
        count[i] = 1  -- записываем что он выполнено
    end
end
Levo222
Цитата(cirus @ 20.6.2020, 17:01) *

Создать массив, в который записывать выполнялось ли действие. Принцип такой:
Код
--lua
local H = {{100, 200}, {100, 300}, {100, 400}}
local count = {0, 1, 0}  -- изначально массив заполняем нулями,

log 'clear'  log 'mode compact'
for i=0, 3 do
    if count [i] == 0 then  -- если действие ещё не выполнялось
        -- тут какое-то условие, если истина, то выполнить действие
        log (H[i][1], H[i][2])
        count[i] = 1  -- записываем что он выполнено
    end
end





Код
--lua
local H = {{100, 200}, {100, 300}, {100, 400}}

local count = {0, 1, 0}  -- изначально массив заполняем нулями, для примера действие 2 уже выполнено

log 'clear'  log 'mode compact'
for i=0, 3 do
    if count [i] == 0 then  -- если действие ещё не выполнялось
        -- тут какое-то условие, если истина, то выполнить действие
        log (H[i][1], H[i][2])
        count[i] = 1  -- записываем что он выполнено
    end
end

как её проверить? Чтобы массив последовательно перебрался?
cirus
Цитата
Чтобы массив последовательно перебрался?

Код
--lua
local H = {{100, 200}, {100, 300}, {100, 400}}

log 'clear'  log 'mode compact'

for i=1, #H do
    log (H[i][1], H[i][2])
end
Levo222
Цитата(cirus @ 20.6.2020, 21:21) *

Код
--lua
local H = {{100, 200}, {100, 300}, {100, 400}}

log 'clear'  log 'mode compact'

for i=1, #H do
    log (H[i][1], H[i][2])
end


Я имел ввиду как действием нажать те координаты, которые еще не нажимались?
cirus
Цитата
как действием нажать те координаты

Вместо log использовать move.
Levo222
Цитата(cirus @ 21.6.2020, 1:45) *

Вместо log использовать move.

Всё работает вродебы.
Или нет. НиX@я не работает.
cirus
Цитата
Тогда нажимаются сразу 2, мне одно надо нажать

break для выхода из цикла.
Levo222
Цитата(cirus @ 21.6.2020, 2:21) *

break для выхода из цикла.

Тут вот какая проблема, переменная count видна только внутри того цикла for в котром рассчитывается, а когда я выношу её за цикл, то она выдаёт ошибку
cirus
Цитата
переменная count видна только внутри того цикла for в котром рассчитывается

Объявить её до цикла да и всё.
Levo222
Цитата(cirus @ 21.6.2020, 2:51) *

Объявить её до цикла да и всё.

Как инициировать полную остановку скрипта?
А то у меня столько breakov получилось, что не поймёшь какой из-них куда ведёт.
В идеале то конечно goto каким-то образом применить, но он вроде не работает?

Если я напишу
Код
if 1 then
1
  else
if 2 then
   2
  else
   if 3 then
    break
   else
   end
end
end

То break выведет скрипт и из двух последних End тоже? Или так и будет гонять их по кругу?
cirus
Цитата
Как инициировать полную остановку скрипта?

Код
end_script()
Levo222
Цитата(cirus @ 21.6.2020, 3:36) *

Код
end_script()


Так, а теперь есть скрипт чтобы инициировать очистку мозгов с рабочего стола от разрыва головы пока я писал скрипт?

cirus
Цитата
То break выведет скрипт и из двух последних End тоже?

break прерывает цикл.
Levo222
Цитата(cirus @ 21.6.2020, 4:02) *

break прерывает цикл.

То есть в if он не будет работать и сразу выведет за ближайший end "while/for"?

--Upd--
Кажется я знаю зачем придумали
Код
Repeat
Levo222
почему мне
Код
log (count[i])

Выдаёт nil?
Как его проверить?
cirus
Цитата
Выдаёт nil?

Значит нет такой переменной.
Levo222
Мне надо чтобы гоняло цикл пока count полностью не будет перебран

Цитата(cirus @ 21.6.2020, 4:47) *

Значит нет такой переменной.

Так и count[H] тоже выдаёт nil

МММ угу
cirus
Цитата
Так и count[H] тоже выдаёт nil

Ответ тот же.
Цитата
Мне надо чтобы гоняло цикл пока count полностью не будет перебран

Где скрипт?
Levo222
Цитата(cirus @ 21.6.2020, 4:56) *

Где скрипт?

Вроде дошло
Цитата


Код

while count[i] = 0 do

end
Levo222
еще одна проблема
Код

Угу

Если одно окно выпало, то скрипт споткнётся на таком коде, как проверить в этом же цикле существование каждого из них?
cirus
Цитата
workwindow (W[i][1], W[i][2], W[i][3], W[i][4], W[i][5], W[i][6])

Что это за бред. Можно только одно окно сделать рабочим.
Код
for i=0, 6 do

В луа индексация массива начинается с 1.
Цитата
как проверить в этом же цикле существование каждого из них?

Код
--lua
local W = {111, 222, nil, 444}

for i=1, #W do
    if W[i] then
        log (W[i])
    end
end
Levo222
ууууууууууууууууууу
cirus
Цитата
Тоже самое что и это:
move (H[i][1], H[i][2])

С такой логикой если будет 50 окон, то в функцию будете передавать 50 параметров? Хоть немного-то думать надо.
Levo222
Цитата(Levo222 @ 21.6.2020, 5:41) *

Код
workwindow (W[i][1], W[i][2], W[i][3], W[i][4], W[i][5], W[i][6])

Бред.

Тогда как мне следующее окно то из таблицы тыкнуть?
Levo222
l;kj;lk'l
Levo222
Цитата(cirus @ 21.6.2020, 1:45) *

Вместо log использовать move.

Почему для
Код
 log (H[i][1], H[i][2])
А так мы координаты передавали или # переменной, чё-т оя не понял?
move годится

А workwindow нет?

Так то одновременно и мышь не может в 2-х точках находится, как и workwindow быть привязанным к 2-м окнам.

Цитата(cirus @ 21.6.2020, 5:47) *

то в функцию будете передавать 50 параметров?

А что с ней от этого будет? С функцией? Она же неживая) Вытерпит и 100 параметров
Levo222
Вобщем ошибка такая:
43:
Код
attemp to compare number with table

А с этим я разобрался. Правда у меня цикл счетчика на 3 круга проверяет. Не могу понять почему так

и почему-то
Код
Kleft (H[i][1], H[i][2])


не работает
Ну хоть left работает. Х с ним
cirus
Код
не работает 

Кусок кода не может работать.
Цитата
Так то одновременно и мышь не может в 2-х точках находится, как и workwindow быть привязанным к 2-м окнам

Точка это 2 координаты, поэтому move принимает 2 параметра.
Levo222
Вот это вот не работает почему-то?
Исходный код
local w1 = findwindow("W1")
local w2 = findwindow("W2")
local w3 = findwindow("W3")
local w4 = findwindow("W4")
local w5 = findwindow("W5")
local w6 = findwindow("W6")
local W = {w1, w2, w3, w4, w5, w6}
local Wcount = {0, 0, 0, 0, 0, 0}
function ActivW(x, y) return(color (x, y)) end -- (317, 81) == 0 --Другие окна
alarm ("Начинаю процедуру выхода.wav")
for k=1, #W do
if W[k] then
log (W[k])
while Wcount[e] == 0 do
for e=0, 6 do
hint ("Выхожу")
workwindow (W[e][1])
if ActivW(317, 81) == 0 then --окно активно
--Глушим его
send217 ("5")
alarm ("выхожу.wav")
else
Wcount[e] = 1 -- записываем если неактивно
hint ("Окно неактивно")
end
end
end
else
msg ("Окно W[e]) не найденоВозможно оно потеряноХотите вернуть его состояние?")
--и присваеваем потерявшемуся окну 1 в счетчике, чтобы его больше не искало
wait (200)
Wcount[e] = 1
end
end
end
cirus
Цитата
while Wcount[e] == 0 do

Переменная e не объявлена.
Цитата
for e=0, 6 do

С 1 надо начинать цикл.
Levo222
Цитата(cirus @ 21.6.2020, 15:23) *

Переменная e не объявлена.

Код

while Wcount[e] == 0 do
                for e=0, 6 do
                workwindow (W[e][1])
                    if ActivW(317, 81) == 0 then --окно активно
                    send217 ("5")
                    alarm ("выхожу.wav")
                    else
                    Wcount[e] = 1  -- записываем если неактивно
                    hint ("Окно неактивно")
                    end
                end
            end

Ну так как его объявить чтобы этот цикл был бесконечным до for а не после?
cirus
Опишите что вообще надо сделать. Или предлагаете по коду с ошибками догадываться?
Levo222
Цитата(cirus @ 21.6.2020, 19:26) *

Опишите что вообще надо сделать. Или предлагаете по коду с ошибками догадываться?

Так я уже тут 10 раз писал. Нужно пачку окон закрыть если они существуют вообще, но в цикле перебора их имён

Эм. ну ладно, а так будет работать?

Исходный код
local w1 = findwindow("W1")
local w2 = findwindow("W2")
local w3 = findwindow("W3")
local w4 = findwindow("W4")
local w5 = findwindow("W5")
local w6 = findwindow("W6")
local W = {w1, w2, w3, w4, w5, w6}
local Wcount = {0, 0, 0, 0, 0, 0}
function ActivW(x, y) return(color (x, y)) end -- (317, 81) == 0 --если окна активны
alarm ("выход.wav")
for k=1, #W do --цикл для каждого окна из таблицы W
if W[k] then -- если каждое из них существует
log (W[k])

for e=0, 6 do --то перебираем каждое из них и закрываем
while Wcount[e] == 0 do --пока какое-то окно из W активно
hint ("Выхожу")
workwindow (W[e][1])
if ActivW(317, 81) == 0 then --если окно активно
--Глушим его
send217 ("5")
alarm ("выхожу.wav")
else
Wcount[e] = 1 -- записываем что неактивно
hint ("Окно неактивно")
end
end
end
else -- если окно не найдено
msg ("Окно W[e]) не найденоВозможно оно потеряноХотите вернуть его состояние?")
--и присваеваем потерявшемуся окну 1 в счетчике, чтобы его больше не искало
wait (200)
Wcount[e] = 1
end
end
end

Я конечно могу на каждое окно писать 20+ строк закрытия, но чёт мне кажется так покомпактнее будет
А зачем вообще использовать for в таком случае? Если можно использовать if и бесконечный цикл внутри него на проверку истинности этого if?
А счётчик же нужен...
cirus
Цитата
А счётчик же нужен

Зачем? Findwindow возвращает массив, размер которого известен.
Levo222
Цитата(cirus @ 21.6.2020, 20:39) *

Зачем? Findwindow возвращает массив, размер которого известен.

То есть мне что-то выше поставить?

Вот так чтоли?
Код
local W = {w1, w2, w3, w4, w5, w6}
local Wcount = {0, 0, 0, 0, 0, 0}
local w1 = findwindow("W1")
  local w2 = findwindow("W2")
  local w3 = findwindow("W3")
  local w4 = findwindow("W4")
  local w5 = findwindow("W5")
  local w6 = findwindow("W6")
cirus
Цитата
Нужно пачку окон закрыть если они существуют вообще, но в цикле перебора их имён

Код
--lua
local WM_CLOSE = 0x0010
local window_name = {'Блокнот', 'Калькулятор', 'Lineage2'}    -- имена окон

log 'clear'  log 'mode compact'

for i=1, #window_name do
    local W = findwindow(window_name[i])
    log('Имя окна: ' .. window_name[i])
    if W then
        log('Найдено окон: ' .. tostring(#W))
        for j=1, #W do
            sendmessage (W[j][1], WM_CLOSE, 0, 0)     -- закрыть окно
        end
    else
        log('Найдено окон: 0')
    end
    log()
end
Levo222
Мда. Туплю сегодня. Только понял что for i=0 вызывал лишний круг проверки таблицы

Как точно определить на каком шаге находится в данный момент цикл "for c=1, 3 do"?
cirus
Цитата
Как точно определить на каком шаге находится в данный момент цикл "for c=1, 3 do"?

Вывести в лог переменную c.
Levo222
Цитата(cirus @ 22.6.2020, 14:01) *

Вывести в лог переменную c.

Я имел ввиду порядковый номер в цикле for, а не его значение.
Levo222
Цитата(cirus @ 21.6.2020, 22:48) *

Код
--lua
local window_name = {'Блокнот', 'Калькулятор', 'Lineage2'}    -- имена окон

log 'clear'  log 'mode compact'

for i=1, #window_name do
    local W = findwindow(window_name[i])
    log('Имя окна: ' .. window_name[i])
    if W then
        log('Найдено окон: ' .. tostring(#W))
        for j=1, #W do
            send (x)     -- Тут не совсем закрыть окно, а убрать в нём признаки жизни - там есть специальные клавиши
        end
    else
        log('Найдено окон: 0')
    end
    log()
end



И вот теперь мне снизу понадобилось обратно активировать их, чтобы после паузы продолжить работу:
Код
--lua
local window_name = {'Блокнот', 'Калькулятор', 'Lineage2'}    -- имена окон

log 'clear'  log 'mode compact'

for i=1, #window_name do
    local W = findwindow(window_name[i])
    log('Имя окна: ' .. window_name[i])
    if W then
        log('Найдено окон: ' .. tostring(#W))
        for j=1, #W do
            send (x)     -- вернуть обратно активность окну
        end
    else
        log('Найдено окон: 0') --у меня ощущение, что else должна стоять после end - for j=1, #W do... что-то тут не так?
    end
    log()
end


Мне нужно перед новым циклом for обнулять переменную i? Или она не видна уже в этом пространстве?

Т.е. получается то тоже самое кодом ниже после паузы, но уже на обратную активацию окон.
Тут непонятно, если он не найдёт окно, ему не присвоится 1 в счетчике? И он так и будет гонять верхний цикл по кругу? Или бросит поиск окон и они так и останутся неактивированными?...

--------- Короче он ошибку выдаёт, если не находит достаточное количество окон.
пишет Table index is nil

П.С.: Можно как-то изменить дефолт расположения звуков проигрываемым пилотом? А то там такая музыкальная коллекция собралась, что ничего другого не видно уже.
cirus
Цитата
обнулять переменную i? Или она не видна уже в этом пространстве?

Вывести значение переменной в лог и посмотреть.
Цитата
Короче он ошибку выдаёт

Где скрипт, который выдаёт такую ошибку?
Levo222
Цитата(cirus @ 27.6.2020, 15:42) *

Где скрипт, который выдаёт такую ошибку?

Вобщем нагородил говна, а в какой очередности его воспроизводить незнаю.

-

Код
--lua
log 'clear'  log 'mode compact'
----------------Convert_Time---------------
function time (t)
  local m = math.floor( (math.floor(t) % 3600) / 60)
  local s = (math.floor(t) % 3600) % 60
  return string.format("%02d:%02d", m, s)
end
--- FIX --------
  end
end

Вобщем есть 3 основных параметра в которые упирается скрипт - Это
1. Оставшееся время
2. Заполненность всех контейнеров(их разрушение индентично заполненности)
3. И проверка текущего статуса Окна(Т.е. идентификация что мы и где мы)
При любом нарушении условий одного из этих параметров должен происходить выход.
Но в то же время внутри них должен находиться рабочий цикл

Я взял за основу время

Код
while t > os.clock() do

end --while t > os.clock() do


И в него поместил счетчик событий

Код
while t > os.clock() do
for forcount=1, 3 do
      log (count[forcount])
      if  count [forcount] == 0 then
        left (H[forcount][1], H[forcount][2])
        --если нету свободных (все count = 1)
        break --выход из for и далее цикл процесса
      end --
end

end --while t > os.clock() do


А перед ним проверку статуса окна, но она же стоит и после, для выхода из основного рабочего цикла для пуска на новый круг проверки статуса окна и проверки значения счётчика

Код

while t > os.clock() do
if WindowLoad (441, 561) == 3026224
for forcount=1, 3 do
      log (count[forcount])
      if  count [forcount] == 0 then -- если какой-то контейнер пуст
        --Выбор (H[forcount][1], H[forcount][2])
        break --выход из for в случае и далее цикл процесса
else --текущий контейнер полон???
      end --
else
end
end
while 1 do -- основной рабочий процесс
--в случае нарушения каких-либо параметров из него выкидывает
if u = 0 then
break
else
end
end
end --while t > os.clock() do

И вот получилось то - что получилось вверху.
Но сам процесс находится после него, и у меня скрипт постоянно выдаёт ошибку из-за разбросанности end-ов, т.к. циклы и вложенные в них проверки не совпадают по закрытию. Склоняюсь что команда break работает не так, как я думаю и переводит скрипт не в те места где я ожидаю.
cirus
Цитата
Вобщем нагородил

Надо не городить, а понимать что в каком порядке должно выполняться.
Цитата
if count == {0, 0, 0} then

Это что?
Levo222
Цитата(cirus @ 28.6.2020, 14:45) *

Код
if count == {0, 0, 0} then

Это что?

А, одно = лишнее)) Исправил
А вот и не лищнее. Это проверка наличия свободных контейнеров при запуске скрипта.

Но там не в этом проблема, а в том что цепочка циклов запуталась.

Очень мало примеров и практического применения repeat, хотя мне как кажется в таких случаях она бы очень хорошо пригодилась.

Цитата(cirus @ 28.6.2020, 14:45) *

Надо не городить, а понимать что в каком порядке должно выполняться.

Было бы чем понимать.
Levo222
Не могу понять,
Вот такая конструкция:

Код

while do

if then
else
end

if then
else
end

end


Не работает чтоли?

Цитата(cirus @ 28.6.2020, 14:45) *

if count == {0, 0, 0} then
Это что?

А разве таким образом нельзя получать состояние переменных в таблице?
cirus
Цитата
Вот такая конструкция:
Не работает чтоли?

Работает.
Цитата
А разве таким образом нельзя получать состояние переменных в таблице?

Нет.
Levo222
Код
   local W = findwindow(window_name[i])
    log('Имя окна: ' .. window_name[i])
    if W then

Что означает в данном случае if W then ?
Если окно существует? Но ведь это может означать и = 0, и > 0, и > 10, Это ведь не точная команда?
cirus
Цитата
Что означает в данном случае if W then ?

Тоже самое что:
Код
if W ~= nil then
Fors1k
Цитата(Levo222 @ 5.7.2020, 2:13) *
if W then ?

Это выражение срабатывает, если W не nil.
Это выражение срабатывает, если W не false.
Код
--lua
a = 4
c = 7 > 3
if a then log("А существует") end
if b then log("В существует") end
if c then log("Выражение 'С' истинно") end
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Русская версия Invision Power Board © 2001-2024 Invision Power Services, Inc.