|
|
|
Помогите разобраться с поиском в массиве. |
|
|
KotMC |
30.1.2021, 13:36
|
Neophyte
Сообщений: 34
Регистрация: 10.1.2021 Группа: Пользователи Наличность: 0
Пользователь №: 19.851
Возраст: 36
|
Есть массив (таблица) из множества строк. Двух и более столбцов. В первом столбце находятся данные для переменной, во втором "ключ" который говорит нужно ли использовать данные из первого столбца. Как мне выполнить поиск по массиву во втором столбце и присвоить данные из первого столбца той строки в которой нашлось совпадения "ключа"? Помогите примером. Использовать хочу в этом скрипте: скрипт
--lua local hw = require'arduino' hw.com = hw.get_port (2341, 8036) -- указать vid и pid ардуино if hw.com < 1 then -- если номер порта меньше 1 log ('error = ' .. tostring(hw.com)) -- код ошибки, если 0 значит устройство с указанными vip и pid не найдено end_script () end hw.set_delay_mouse (200) -- установить паузу между нажатиями клавиш мыши hw.set_random_delay_mouse(50) -- установить рандом между нажатиями клавиш мыши от 200 до 249 мсек -- т. е. между нажатием и отпусканием кнопки мыши будет пауза от 20 до 29 мсек. hw.set_offset_mousemove(1) -- шаг перемещения курсора, чем больше тем быстрее перемещается hw.set_delay_mousemove(2) -- установить паузу между каждый шагом перемещения мыши, -- чем меньше, тем быстрее перемещается ::poisk_logina:: while true do local read_logins_from_file=[[C:\not\list_login.txt]] -- путь к файлу local arrLogin={} -- массив log "clear" log "mode compact" function loadarray(array, read) local file= io.open(read, "r") if file then for v in file:lines() do array[#array+1]={} for k, v1 in string.gmatch(v,"[^\t]+") do table.insert(array[#array], k) end end file:close() return 1 end return nil end if loadarray(arrLogin, read_logins_from_file) then -- если функция выполнена успешно log (arrLogin[1][1]) log (arrLogin[1][1]) else log ("Файл не найден") end local startX, startY, endX, endY = 530, 180, 757, 254 -- координаты поиска local path = arrLogin[1][1] -- путь к картинке, bmp 24 бита берется из массива findoffsetx (10 + math.random (50)) -- смещение вправо на 50 пикселей findoffsety (5 + math.random (20)) -- смещение вниз на 30 пикселей local login, a = findimage (startX, startY, endX, endY, {path}, 2) -- поиск картинки hint (a) -- результат поиска, подсказка в правом --нижнем углу if login then -- если найдена --log ("Изображение найдено в координатах X= " .. login[1][1] .. " Y= " .. login[1][2]) hw.mouse.move (login[1][1], login[1][2]) -- переместить мышь с учетом уставки findoffsetx + findoffsetу wait (500 + math.random (1000)) hw.mouse.left () else while true do --цикл поиска пикселя + смещение логинов findoffsetx (1 + math.random (5)) -- смещение вправо на 1+-5 пикселей findoffsety (2 + math.random (20)) -- смещение вниз на 2+-20 пикселей local b = findcolor([[800 170 828 400 (13421772) %arr]]) -- параметры передаются в виде строки -- [[800 170 828 400-это координаты поиска цвета -- (00000000)-это искомый цвет -- %arr название массива поиска функции ]] hint ("Найдено пикселей " .. (IMG: style_emoticons/default/cool.gif) if b > 0 then -- если найдены hw.mouse.move (arr[1][1], arr[1][2]) -- переместить мышь в наденные координаты -- с учетом findoffsetx (1 + math.random (5)) -- findoffsety (2 + math.random (20)) wait (500 + math.random (500)) hw.mouse.left_down () -- зажать (не отжимая) левую кнопку мыши wait (500 + math.random (100)) hw.mouse.move (arr[1][1], arr[1][2] - 1) -- переместить мышь на -1 пиксель по оси у координаты wait (500 + math.random (100)) hw.mouse.left_up () -- отжать левую кнопку мыши break end end end end фаил list_login.txt имеет следующий вид: [["C:\not\img00001.bmp"]] y [["C:\not\img00002.bmp"]] n [["C:\not\img00003.bmp"]] n
|
|
|
|
KotMC |
30.1.2021, 15:49
|
Neophyte
Сообщений: 34
Регистрация: 10.1.2021 Группа: Пользователи Наличность: 0
Пользователь №: 19.851
Возраст: 36
|
От скрипта хочу добиться примерно того же, как в теме: https://forum.uokit.com/index.php?showtopic=70421За одним исключение что хочу управлять скриптом (в плане выбора аккаунта, аккаунтов) из текстового файла. Заход и прохождение построено будет на findimage. При завершении прохождения одного аккаунта из списка аккаунтов хотел менять "y" на "n", в массиве. Запись в массив в нужное место вроде понял как делать, а вот поиск по массиву не удается понять. (
|
|
|
|
KotMC |
30.1.2021, 17:43
|
Neophyte
Сообщений: 34
Регистрация: 10.1.2021 Группа: Пользователи Наличность: 0
Пользователь №: 19.851
Возраст: 36
|
При заходе в игру, на окне логина бывает крит, повторный заход под этим логином возможен через некоторый промежуток времени, чтоб не ждать пока "отпустит" хочу добавить еще один "ключ" в третий столбец "p" который будет учитываться.
Как я вижу работу ищем во втором столбце "ключ" если находим, проверяем третий столбец если находим "p", пропускаем, и делаем только те строки в которых нет "ключа" "p", после прохождения всех строк без "p", проходим строки где есть оба "ключа" "y+p".
Просил пример или объяснение поиска в массиве - на примере множества строк и двух столбцов, чтоб можно было понять принцип и синтаксис (на малом) написания такого кода, и в последствии при необходимости расширить на другое количество столбцов.
Для меня все это в новинку учусь на примерах.
|
|
|
|
cirus |
30.1.2021, 17:59
|
Elder
Сообщений: 3.480
Регистрация: 18.8.2014 Группа: Пользователи Наличность: 26576
Пользователь №: 16.971
Возраст: 29
|
Цитата пример или объяснение поиска в массиве Код --lua log 'clear' log 'mode compact'
local array = { {'image1.bmp', 'n', 'p'}, {'image2.bmp', 'y', 'p'}, {'image3.bmp', 'n', ''}, {'image4.bmp', 'y', 'p'}, {'image5.bmp', 'n', 'p'}, {'image6.bmp', 'y', ''} }
for i=1, #array do if array [i][2] == 'y' and array [i][3] == 'p' then log (array [i][1]) end end
|
|
|
|
Fors1k |
30.1.2021, 18:30
|
Journeyman
Сообщений: 497
Регистрация: 19.12.2017 Группа: Пользователи Наличность: 2419
Пользователь №: 18.746
|
Цитата(KotMC @ 30.1.2021, 18:16) А какой командой могу остановить For на первом найденном совпадении.
Использовать break: --lua log 'clear' log 'mode compact'
local array ={ {'image1.bmp', 'n', 'p'}, {'image2.bmp', 'y', 'p'}, {'image3.bmp', 'n', ''}, {'image4.bmp', 'y', 'p'}, {'image5.bmp', 'n', 'p'}, {'image6.bmp', 'y', ''} }
for i=1, #array do if array [i][2] == 'y' and array [i][3] == 'p' then log (array [i][1]) break end end Сообщение отредактировал Fors1k - 30.1.2021, 18:31
--------------------
Для связи
|
|
|
|
cirus |
30.1.2021, 18:36
|
Elder
Сообщений: 3.480
Регистрация: 18.8.2014 Группа: Пользователи Наличность: 26576
Пользователь №: 16.971
Возраст: 29
|
Цитата или как понять в каком из множества найдены "i" есть совпадение чтоб использовать только одно. код
Код --lua log 'clear' log 'mode compact'
local array = { {'image1.bmp', 'n', 'p'}, {'image2.bmp', 'y', 'p'}, {'image3.bmp', 'n', ''}, {'image4.bmp', 'y', 'p'}, {'image5.bmp', 'n', 'p'}, {'image6.bmp', 'y', ''} }
function find() for i=1, #array do if array [i][2] == 'y' and array [i][3] == 'p' then return i end end return nil end
local index = find() if index then log (index) log(array[index][1]) end
|
|
|
|
KotMC |
6.2.2021, 20:27
|
Neophyte
Сообщений: 34
Регистрация: 10.1.2021 Группа: Пользователи Наличность: 0
Пользователь №: 19.851
Возраст: 36
|
Опять, я в тупике Начал разбираться с примером от Сirus: код
--lua log 'clear' log 'mode compact'
local array = { {'image1.bmp', 'n', 'p'}, {'image2.bmp', 'y', 'p'}, {'image3.bmp', 'n', ''}, {'image4.bmp', 'y', 'p'}, {'image5.bmp', 'n', 'p'}, {'image6.bmp', 'y', ''} }
function find() for i=1, #array do if array [i][2] == 'y' and array [i][3] == 'p' then return i end end return nil end
local index = find() if index then log (index) log(array[index][1]) end
Объясните правильно ли понимаю, Вы объявили переменную index и сказали, что она ровна функции find(). С помощью return i вернули присвоили первое совпадение function find() ? Для чего нужна "return nil" и как она работает(в какой момент)? Не могу понять как переписать код чтоб искало другие совпадения в этом же массиве, если по первому условию совпадений не нашло. Прошу, Вашей помощи.
|
|
|
|
Fors1k |
6.2.2021, 21:08
|
Journeyman
Сообщений: 497
Регистрация: 19.12.2017 Группа: Пользователи Наличность: 2419
Пользователь №: 18.746
|
Цитата(KotMC @ 6.2.2021, 20:27) как переписать код чтоб искало другие совпадения в этом же массиве, если по первому условию совпадений не нашло
script
--lua log 'clear';log 'mode compact'
array = { {'image1.bmp', 'n', 'p'}, {'image2.bmp', 'y', 'p'}, {'image3.bmp', 'n', '' }, {'image4.bmp', 'y', 'p'}, {'image5.bmp', 'n', 'p'}, {'image6.bmp', 'y', '' } }
function find(con) for i = 1, #array do if array [i][2] == con[1] and array [i][3] == con[2] then return array [i][1] end end return nil end
search = { {'y', 'x'}, {'n', 'p'}, {'n', 'z'} }
for i, v in ipairs(search) do result = find(v) if result then break end end if not result then result = 'Ничего не нашлось' end log (result) В массиве search перечислите условия поиска. В данном примере: 'y', 'x' - не найдено, ищет дальше 'n', 'p' - найдено, поиск остановлен, имя первой найденной картинки в переменной result. 'n', 'z' - не использовалось для поиска, так как был успех ранее. Сообщение отредактировал Fors1k - 6.2.2021, 21:16
--------------------
Для связи
|
|
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|