Автор Тема: Clickermann в Битве Замков.(Castle Clash) Распознавание ников  (Прочитано 195 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Alexlab

  • Зашел в гости
  • *
  • Сообщений: 8
    • Просмотр профиля
Появилась необходимость распознавать игроков по никам (правый верхний угол).
Так вот не могу сообразить за что зацепиться?
В общем есть необходимость пропускать игроков с определенными никами (белый список). На остальных нападать...
Определять по картинкам - не реально - ники у всех имеют разный фон.

Думал вести подсчет количества белых пикселе - делая так - они каждый раз разные

GETSCREEN
SCREENSHOTEX (1500,0,1920,100)
WAITMS(50)
$count = PXLCOUNT (1500,0,1920,100, 16777215)
WAITMS(200)
logwrite("Белых пикселей в нике: ", $count)
#logfile
WAITMS(50)

Незнаю - может определять по 3 пикселям...
Но тогда как их все сверять?
заводить в массив?
« Последнее редактирование: Август 20, 2019, 04:40:59 pm от Alexlab »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Сообщений: 3610
  • Котэ
    • Просмотр профиля
Определять по картинкам - не реально - ники у всех имеют разный фон.

В функции IF_PICTURE_IN можно указать цвет прозрачности. В своей картинке закрась этим цветом то что не нужно и оно будет игнорироваться.

Alexlab

  • Зашел в гости
  • *
  • Сообщений: 8
    • Просмотр профиля
В общем нашел более оптимальный способ...
Определять игроков по 2м пикселям - заранее присвоенным им...

На практике это выглядит - так:
GETSCREEN
IF(PXL(1889,33) = 16777215)      //Белый пиксель в левом верхнем углу ника
   IF(PXL(1899,60) = 16777215) //Белый пиксель в правом нижнем углу ника
   BEEP(800,200)
   WAITMS(100)
   ELSE
   END_IF
END_IF

GETSCREEN
IF(PXL(1889,33) = 16777215)      //Белый пиксель в левом верхнем углу ника
   IF(PXL(1898,61) = 16777215) //Белый пиксель в правом нижнем углу ника
   BEEP(800,200)
   WAITMS(100)
   ELSE
   END_IF
END_IF

GETSCREEN
IF(PXL(1889,33) = 16777215)      //Белый пиксель в левом верхнем углу ника
   IF(PXL(1899,53) = 16777215) //Белый пиксель в правом нижнем углу ника
   BEEP(800,200)
   WAITMS(100)
   ELSE
   END_IF
END_IF

GETSCREEN
IF(PXL(1889,30) = 16777215)      //Белый пиксель в левом верхнем углу ника
   IF(PXL(1899,55) = 16777215) //Белый пиксель в правом нижнем углу ника
   BEEP(800,200)
   WAITMS(100)
   ELSE
   END_IF
END_IF

GETSCREEN
IF(PXL(1889,34) = 16777215)      //Белый пиксель в левом верхнем углу ника
   IF(PXL(1899,62) = 16777215) //Белый пиксель в правом нижнем углу ника
   BEEP(800,200)
   WAITMS(100)
   ELSE
   END_IF
END_IF


а вот как это облагородить?
как завернуть в массив - не пойму...
Тут - пример на 5 ников - а их может быть и больше...
Подскажите как это сделать по компактнее.
Заранее спасибо  :)
« Последнее редактирование: Август 20, 2019, 04:46:03 pm от Alexlab »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Сообщений: 3322
  • Лечу куда хочу. cman 4.13.014x32, W10, W7
    • Просмотр профиля
А действия при совпадении одинаковые? Или у каждого свои?


Alexlab

  • Зашел в гости
  • *
  • Сообщений: 8
    • Просмотр профиля
Действия на данный момент одинаковые - или пропустить игрока или выйти из боя.

Если оставить все как есть - тоже не совсем плохо - просто код длинный... Но работает.
Много времени ушло на создание базы данных из 2х координат.
Но свои ребята не так часто меняются - чтоб это было совсем напряжно добавить строчку (10 строк)
Просто подозреваю что читать такой длинный код будет дольше...

Вот как замутить проверку по 2м пикселям с перебором этих самых пикселей из списка ???
« Последнее редактирование: Август 21, 2019, 11:17:02 am от Alexlab »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Сообщений: 3322
  • Лечу куда хочу. cman 4.13.014x32, W10, W7
    • Просмотр профиля
Способов много. Кому как удобнее

Код: Clickermann
  1. UNDEFINE($friends)
  2. ARRPUSH($friends, "1889,33,1899,60,Вася Пупкин")
  3. ARRPUSH($friends, "1889,33,1898,61,Владимир Ленин")
  4. ARRPUSH($friends, "1889,33,1899,53,Лёня Голубков")
  5. ARRPUSH($friends, "1889,30,1899,55,Вова Путин")
  6. ARRPUSH($friends, "1889,34,1899,62,Эрнесто Че Гевара")
  7.  
  8. FOR($fr = 0, $fr < ARRSIZE($friends))
  9.    UNDEFINE($friend)
  10.    STRSEPARATE($friends[$fr], ",", $friend)
  11.    GETSCREEN
  12.    IF(PXL($friend[0],$friend[1]) = 16777215)
  13.        IF(PXL($friend[2],$friend[3]) = 16777215)
  14.            LOGWRITE("--- ", $friend[4], " ---")
  15.            LOGWRITE("точки: ", $friend[0], "/", $friend[1], "  ", $friend[2], "/", $friend[3])
  16.            BEEP(800,200)
  17.            WAITMS(100)
  18.        ELSE
  19.        END_IF
  20.    END_IF
  21. END_CYC
  22. HALT


Alexlab

  • Зашел в гости
  • *
  • Сообщений: 8
    • Просмотр профиля
Спасибо большое !
Обкатаю - отпишусь...
Этот код куда короче моих простыней  :)

Alexlab

  • Зашел в гости
  • *
  • Сообщений: 8
    • Просмотр профиля
В общем все работает...
Но есть одно но!!!

Находя 2 пикселя в нике - программа почемуто думает что нашла как одного - так и другого игрока

Вот отчет программы:
log:
найден
23:42:40 --- Вася Пупкин ---
23:42:40 точки: 1776/67  1752/35
23:42:42 --- 777777 ---
23:42:42 точки: 1831/46  1883/35
находит как одного так и другого
хотя координаты разные и я нахожусь на странице только одного игрока!!!
и фон в заданном квадрате не белый - чтоб реагировал на него

Чего он вобщего нашел то в них???
и что может быть не так в коде...

Проверял работу на друзьях, а когда зашёл к недругу - клинкер сказал что и он найден но под другим именем. После чего я догадался...
Сравнение идёт не по паре координат а по всем координатам что есть в массиве и найдя хоть одно совпадение - звучит сигнал.
То есть массив берет первую координату и давай перебирать вторую в итоге находит совпадение по второй и отчитывается что первая координата принадлежит игроку номер1 а вторая игроку номер2

Я мечтал делать поиск сразу по 2м координатам - подставляя эти координаты по очереди
« Последнее редактирование: Август 22, 2019, 01:44:34 am от Alexlab »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Сообщений: 3322
  • Лечу куда хочу. cman 4.13.014x32, W10, W7
    • Просмотр профиля
Я в поиске ничего не менял. Поиск ты писал. Он как работал, так и работает  :)
Значит и раньше так было, но у тебя выводов в лог нет и просто не замечал.
Мне кажется по 2 точки - это очень мало. Прям мало-мало. При большом количестве будет путать.


Alexlab

  • Зашел в гости
  • *
  • Сообщений: 8
    • Просмотр профиля
В общем спасибо огромное.
Придется делать больше точек для отслеживания - совпадения были все таки...

Теперь бы научиться лог файл обрабатывать.