Кибор » Кибор - Интегрированная среда разработки ботов » Вопросы и решение проблем » Как найти координаты нужного слова ?

Страниц (3): « 1 [2] 3 »
 

11. Zireael - 30 Апреля, 2023 - 13:00:43 - перейти к сообщению
 Цитата:
Каждый промежуток считается за один символ. Даже если он имеет несколько пробелов.

Это тут причём если удаляем пробелы.
Да, в X_S и Y_S записались координаты правильные. Дальше удаляем пробелы.
CODE:
if (dp) regexreplace(-1, #text, text, " ", "");

Сколько пробелов при этом удалилось неизвестно. И что получилось, теперь символ находится в другой позиции, если перед ним удалились пробелы.
К примеру, был символ 10й, в массивах X_S и Y_S тоже 10й элемент, но мы же удалили пробелы, допустим 3 пробела, теперь символ в строке не 10й, а 7й. А вот в массивах X_S и Y_S его координаты так и остались на том же месте.
Кстати, обычно функции замены возвращают количество замен, а не 1 или 0.
12. Kibor - 30 Апреля, 2023 - 13:15:02 - перейти к сообщению
 Zireael пишет:
Сколько пробелов при этом удалилось неизвестно. И что получилось, теперь символ находится в другой позиции, если перед ним удалились пробелы.

Какое нам имеет значение сколько удалилось символов в тексте для клика по нужному символу на экране?
Надо кликнуть по десятому символу на экране? Посмотрели как текст выглядит на экране, посчитали каждый символ за один символ и каждый промежуток между ними (не смотря на его размер) за один символ и кликнули по нужному символу.
Эта галка только для удаления пробелов в конечном тексте.

Такой тест
1     2 3   4 5678 9


будет распознан так
1пробел2пробел3пробел4пробел5678пробел9

По тому клик по 8 элементу массива будет по 5

А галка Удалить пробелы действительна только для получения самого текста.
При ней он будет таким
123456789

Но при расчете координат надо промежутки считать символами. Не зависимо от расстояние. Любой промежуток считается одним пробелом. Одним символом.
13. Zireael - 30 Апреля, 2023 - 13:26:41 - перейти к сообщению
CODE:
string text = "123 45 да";
// буква д имеет индекс 7

regexreplace(-1, #text, text, " ", ""); // удалить пробелы
regexsearch(1, #text, text, "да"); // найти слово да
int pos;
regexstart(#pos);
messagebox(pos); // 5
// X_S[5] и Y_S[5] на какой символ будет клик?
14. Kibor - 30 Апреля, 2023 - 13:58:52 - перейти к сообщению
 Zireael пишет:
удалить пробелы

Вы намешали одно с другим.
readtext сам удаляет не нужные пробелы, при этом правильно составляя массив координат для каждого экранного символа. Давая нам понять что любой промежуток - один символ.
Если вы произвели какую то деформацию текста, то деформацию координат относительно деформации текста вы тоже должны произвести сами.
Если вы не будете делать не нужную операцию
CODE:
regexreplace(-1, #text, text, " ", ""); // удалить пробелы

то ДА начнется с 7 индекса.

Когда то я снимал видео где был перенос координат в вашем случае. Но зачем оно тут? Найдите свое Да без вашего удаления пробелов. За вас то сделал readtext. И по найденной позиции кликайте.

То есть текст на экране
123     45 да
будет для программы
123пробел45пробелда
Этот текст будет в результате в text
text = "123 45 да";
И как на экране, так и для регулярного выражения
CODE:
string text = "123 45 да";
regexsearch(1, #text, text, "да"); // найти слово да
messagebox (regexstart(0));//7

это будет седьмой символ.
Зачем что то еще деформировать?

Код распознает текст 123     45 да и кликнет ровно перед Д. В нижний левый его угол.
 Цитата:
string Text;
loadsymbolbase ("C:\Program Files (x86)\Kibor\basetext.sib");
readtext (NUM | RU, #Text, 2, 1, -1, -1, -1, -1, -1, 0, 50, 53, 346, 135, 361, -1);
//messagebox (Text);//тест
regexsearch(1, #Text, Text, "да"); // найти слово да
mousemove(53+symbolxpos(regexstart(0)), 346+symbolypos(regexstart(0)));
messagebox (regexstart(0));//7


И не надо никаких своих regexreplace
В визуальном редакторе это только удаляет пробелы в выводе текста в переменную.
Проверяйте этот код (или код с виз редактора) на блокноте с поиском слова ДА или другого в строке с любым количеством пробелов между словами.

Короче.. Посмотрели на экран, увидели что Д является 7 индексом (учитывая пробелы) и учитывая что первый символ - 0. Распознали текст с помощью readtext. Он сам сделает текст что Д будет как и выглядит - 7. Нашли его позицию с помощью regexsearch. Она и вернет на 7.
И по седьмому и кликнули.
(Добавление)
Можно конечно сделать в виз редакторе, что бы при этой галке не учитывались пробелы для координат..
А пока можно найти ДА с помощью регулярки, учитывающей что Могут быть пробелы между буквами Д и А.. Но не удаляя их.
(Добавление)
CODE:
string Text="Код распознает текст 123 45 да и кликнет ровно перед Д. В нижний левый его угол.";//да слитно
//string Text="Код распознает текст 123 45 д а и кликнет ровно перед Д. В нижний левый его угол.";//да раздельно
messagebox (Text);//тест
regexsearch(1, #Text, Text, "д(\s|)а"); // найти слово да или д а
messagebox (regexstart(0));//28
15. Kibor - 30 Апреля, 2023 - 23:10:57 - перейти к сообщению
 Код рас        ает текст 123 45 да и кликнет ровно п и это нужноедане    В ни     его угол.
 К многодададаслитно   распознает т       ст 123 45 д а и кликнет ровно перед Д. В нижний лев   угол.

И если удалить все пробелы, то начнутся проблемы, которые приведут что найдутся слова входящие в состав других слов.
Красные тоже найдутся. А должны найтись только зеленые.

Указать свою зону поиска надо...

 Цитата:
string Text;
loadsymbolbase ("C:\Program Files (x86)\Kibor\basetext.sib");
readtext (NUM | RU | MARK, #Text, 2, 1, -1, -1, -1, -1, -1, 0, 50, 221, 286, 897, 330, -1);
messagebox (Text);//тест

//Буквы в составе числа на цифры
loop(5)
{
while(regexreplace(-1, #Text, Text, "(?<=\d)о", "0", MULTILINE)){}
while(regexreplace(-1, #Text, Text, "о(?=\d)", "0", MULTILINE)){}
while(regexreplace(-1, #Text, Text, "(?<=\d)з", "3", MULTILINE)){}
while(regexreplace(-1, #Text, Text, "з(?=\d)", "3", MULTILINE)){}
}

//Цифры в составе слова на буквы
loop(5)
{
while(regexreplace(-1, #Text, Text, "(?<=[а-я|А-Я])0", "о", MULTILINE)){}
while(regexreplace(-1, #Text, Text, "0(?=[а-я|А-Я])", "о", MULTILINE)){}
while(regexreplace(-1, #Text, Text, "(?<=[а-я|А-Я])3", "з", MULTILINE)){}
while(regexreplace(-1, #Text, Text, "3(?=[а-я|А-Я])", "з", MULTILINE)){}
}

messagebox (Text);//тест

string Texts[2];

regexsearch(2, #Texts[0], Text, "(?<=\s)д(\s|)а(?=\s)"); // найти слово да или д а

mousemove(221+symbolxpos(regexstart(0)), 286+symbolypos(regexstart(0)));
messagebox ("Мышь на первом настоящем ДА "+format(regexstart(0)));
mousemove(221+symbolxpos(regexstart(1)), 286+symbolypos(regexstart(1)));
messagebox ("Мышь на втором настоящем ДА "+format(regexstart(1)));
16. Zireael - 01 Мая, 2023 - 03:22:46 - перейти к сообщению
Можно подправить ReadText в виз. редакторе, добавив смещение координат и остальных параметров при удалении пробелов. Пример:
CODE:
// допустим это координаты символов
int x_sim[99]={10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
int y_sim[99]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

string text = "ab cd e fg"; // распознаая строка

// удаление пробелов
string temp;
int Pos, i;
while(regexsearch(1, #temp, text, " ")) // пока найден пробел
{
regexstart(#Pos);
//messagebox(Pos);
int Len = size(text);
for(i=Pos; i<Len; i++)
{
x_sim[i] = x_sim[i+1]; // сдвигаем координаты
y_sim[i] = y_sim[i+1];
}
regexreplace(1, #text, text, " ", ""); // удаляем пробел
}
///////////

Len = size(text);
string result = "";
for(i=0; i<Len; i++)result = result +format(x_sim[i])+" "+format(y_sim[i])+"^r^n";
messagebox(text+"^r^n^r^n"+result);

Пробелы удалены, координаты в массивах x_sim и y_sim соответствуют позиции символа в строке.
17. Kibor - 01 Мая, 2023 - 03:56:47 - перейти к сообщению
Почти так..
Для однострочного текста
18. konctantin777 - 01 Мая, 2023 - 23:53:18 - перейти к сообщению
А можно попросить в виз редактор, после галки убрать пробелы, добавить "нажать на 1й символ, если найдено такое то слово +- координаты" ? )
Который раз уже в играх приходиться по поиску текста проверять "где мы". Всё чаще встречается, что поиском картинки стабильно не найти...
(Добавление)
(или просто записать его координаты)
19. konctantin777 - 03 Мая, 2023 - 11:35:46 - перейти к сообщению
 Kibor пишет:
Если вы произвели какую то деформацию текста, то деформацию координат относительно деформации текста вы тоже должны произвести сами

Так узнаю, что нужное слово есть
CODE:
if (regexsearch(1, #text_KIB2, text_KIB, "да")) // если слово найдено

А как правильно, чтобы текст не деформировался ?
20. Zireael - 03 Мая, 2023 - 11:38:39 - перейти к сообщению
 Цитата:
А как правильно, чтобы текст не деформировался ?

Не ставить галку удалять пробелы. Либо исправить код в функции ReadText.

Powered by ExBB FM 1.0 Final