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

 
Ответить в эту темуОткрыть новую тему
> Переписывание скрипта на lua
lnaqqa
сообщение 3.8.2020, 6:50
Сообщение #1


*

Registred
Сообщений: 7
Регистрация: 26.1.2016
Группа: Пользователи
Наличность: 0
Пользователь №: 17.818
Возраст: 30



Пытаюсь переписать скрипт для браузерки на lua и на части отвечающим за поиск зоны с пикселями нужного цвета возникла сложность, т.к. не нашел аналогов gosub попытки переписать скрипт без этого приводят к его зависанию, скорее из-за не понимания как это нужно делать.
Вот часть скрипта на пилоте:
code
Код

:color
if_not 973, 712  16711653   and 979, 706  16711653   and   985, 713 16645860 // белые пиксели
set #color 9932392
gosub zona
end_if
if_not 973, 712  16711653   and 979, 706  16711653   and   985, 713 16645860 // белые пиксели
set #color 10783022
gosub zona
end_if
//таких ещё штук 20
:zona
set #t 4  //кол-во точек нужного цвета во второй областе поиска
set #m 1 //кол-во пикселей для смещения

if 118, 242 7554320 and 59, 246 7554320 //кнопка home
set #a findcolor (190 250 820 585 5 5 (#color) %a) //ищем координаты цветов
if #a > 1                          
    for #i 1 size(%a)
        if 243, 602 16753445  and 198, 599 16753445   //синий пиксель ready
        sort_array %a dec
set #x %a [#i 1]
set #y %a [#i 2]
set #x1 #x - #m
set #y1 #y - #m
set #x2 #x + #m
set #y2 #y + #m
set #zn findcolor (#x1, #y1   #x2, #y2   1 1 (#color) %arr 2)
if #zn >= #t
        move 77, 653
        wait 500
        kleft_down 77, 653
        wait 500
    wait 500
    move  #x #y
    wait 500
    kleft_up  #x #y
    wait 500
        wait 100
        end_if
        end_if
    end_for
end_if
end_if
gosub over
return

Суть этой части: находим координату с нужным цветом, (начиная с последней найденной) и вокруг неё в зоне +1 пиксель вверх и вниз ищем наличие 4 и более таких же, если есть делаем несколько кликов. Если с первым цветом таких зон не находится ищет со следующем и так около 20 раз.
Подскажите как это написать используя lua и возможно избавиться от такого кол-ва строчек с цветами.

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


****

Apprentice
Сообщений: 282
Регистрация: 19.11.2019
Группа: Пользователи
Наличность: 8296
Пользователь №: 19.451
Возраст: 32



Вместо gosub, напиши функцию в которой описаны необходимые действия каждый раз когда перехаодишь по метке, и просто вызывай эту функцию или использовать goto https://uopilot.uokit.com/wiki/index.php?title=Goto_(Lua)

Код

local function zona(color)
  -- тело функции, переписываешь на луа все что в выполняется в метке 'zona', аргумент color будет педеаваться при вызове функции
end

while true do -- вечный цикл
  if (not (color(973, 712) == 16711653)) then
    zona(9932392) -- вызываем функцию и передаем в нее переменную 'set #color 9932392'
  end
  -- тут штук 20 ифов
end


Чтобы избавиться от такого кол-ва строчек с цветами, поместить цвета в массив, и перебирать в цикле for.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 3.8.2020, 11:11
Сообщение #3


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26540
Пользователь №: 16.971
Возраст: 29



Что ищете таким способом? Скрин скиньте, может есть способ попроще.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
lnaqqa
сообщение 3.8.2020, 11:44
Сообщение #4


*

Registred
Сообщений: 7
Регистрация: 26.1.2016
Группа: Пользователи
Наличность: 0
Пользователь №: 17.818
Возраст: 30



https://i.imgur.com/FOq1vST.png
Эта одна из многих карт, тут надо ставить юнитов за зеленоватые полоски, других юнитов может быть очень много и нужно искать небольшие зоны куда можно поставить.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 3.8.2020, 11:56
Сообщение #5


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26540
Пользователь №: 16.971
Возраст: 29



Не проще искать полоски через findimage?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
lnaqqa
сообщение 3.8.2020, 12:06
Сообщение #6


*

Registred
Сообщений: 7
Регистрация: 26.1.2016
Группа: Пользователи
Наличность: 0
Пользователь №: 17.818
Возраст: 30



Там придется делать ещё больше картинок, а результат вряд ли лучше. Если ставить accuracy и deviation, то на части карт может пытаться ставить на недоступные для поставки зоны.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
lnaqqa
сообщение 3.8.2020, 23:08
Сообщение #7


*

Registred
Сообщений: 7
Регистрация: 26.1.2016
Группа: Пользователи
Наличность: 0
Пользователь №: 17.818
Возраст: 30



Madeus, Попробовал сделать так как вы предложили, столкнулся с проблемой, что при такой конструкции findcolor выдает ошибку -1 вот код, который у меня получился:
code
Код
        
local function zona(color)
          local t = 4
          local m = 1
              local a = findcolor([[190, 250, 820, 585, 5, 5 (color), %arr]])
        log (a) -- ошибка -1 описание ошибки: '-1' упало при поиске, точная причина не известна.
        log (color)
            if a > 0 then
                for i = 1, #arr do
                --log (arr[i][1], arr[i][2])
                local x, y = arr[i][1], arr[i][2]
                local x1 = x - m
                local y1 = y - m
                local x2 = x + m
                local y2 = y + m
                    local az = findcolor([[x1, y1, x2, y2 (color), %arr]])
                        if az >= t then
                        move (77, 653)
                        wait (500)
                        kleft_down (77, 653)
                        wait (500)
                    move (x, y)
                    wait (500)
                    kleft_up (x, y)
                    wait (500)
                        end
                end
            end
         end

    while true do -- вечный цикл
             if (not (color(973, 712) == 16711653)) then
      zona(9932392)
      wait (100)
             end
             if (not (color(973, 712) == 16711653)) then
      zona(7499539)
      wait (100)
             end
    end

Если "color" заменяю на номер цвета, всё нормально ищет. Что я делаю не так?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 4.8.2020, 1:51
Сообщение #8


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26540
Пользователь №: 16.971
Возраст: 29



Цитата
if (not (color(973, 712) == 16711653)) then

Зачем так усложнять. Тоже самое:
Код
if color(973, 712) ~= 16711653 then

Цитата
local az = findcolor([[x1, y1, x2, y2 (color), %arr]])

Нормальный синтаксис для findcolor не доделали, так что в таком виде использовать:
Код
local az = findcolor(x1, y1, x2, y2, 1, 1, "(" .. color .. ")", "%arr", 2, -1)


Лучше бы не использовать имена переменных, совпадающих с именами функций. А то получается переменная color и функция color.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Madeus
сообщение 4.8.2020, 2:00
Сообщение #9


****

Apprentice
Сообщений: 282
Регистрация: 19.11.2019
Группа: Пользователи
Наличность: 8296
Пользователь №: 19.451
Возраст: 32



Все таки lua творит чудеса, вообще lua не умеет findcolor, НО при такой странной записи вполне работает, на сколько я понял просто вызывает функции пилота внутри lua.

Тебе надо помнеять строчку

Код

local a = findcolor([[190, 250, 820, 585, 5, 5 (color), %arr]])

на такую
Код

local a = findcolor([[190, 250, 820, 585, 5, 5, ]] .. color .. [[, %arr]])


Тут я вспомнил что недавно сошлись на том что lua не умеет prompt, и там были костыли с luaposh
Вот с такой записью вполне работает

Код

--lua
local a = prompt ('первый "второй выбор" третий')
log(a)


Цитата(cirus @ 4.8.2020, 1:51) *

Зачем так усложнять.

Там в принципе много что изменить можно, я просто писал в точности как было, чтоб автор понял что к чему
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
lnaqqa
сообщение 4.8.2020, 10:55
Сообщение #10


*

Registred
Сообщений: 7
Регистрация: 26.1.2016
Группа: Пользователи
Наличность: 0
Пользователь №: 17.818
Возраст: 30



Благодарю, проблема решилась
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

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

 

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