Author Topic: Clickermann в Битве Замков.(Castle Clash) Распознавание ников  (Read 3220 times)

0 Members and 2 Guests are viewing this topic.

Alexlab

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

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

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

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

Oraven

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

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

Alexlab

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

На практике это выглядит - так:
Code: [Select]
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 ников - а их может быть и больше...
Подскажите как это сделать по компактнее.
Заранее спасибо  :)
« Last Edit: August 20, 2019, 04:46:03 PM by Alexlab »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
А действия при совпадении одинаковые? Или у каждого свои?


Alexlab

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

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

Вот как замутить проверку по 2м пикселям с перебором этих самых пикселей из списка ???
« Last Edit: August 21, 2019, 11:17:02 AM by Alexlab »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Способов много. Кому как удобнее

Code: (clickermann) [Select]
UNDEFINE($friends)
ARRPUSH($friends, "1889,33,1899,60,Вася Пупкин")
ARRPUSH($friends, "1889,33,1898,61,Владимир Ленин")
ARRPUSH($friends, "1889,33,1899,53,Лёня Голубков")
ARRPUSH($friends, "1889,30,1899,55,Вова Путин")
ARRPUSH($friends, "1889,34,1899,62,Эрнесто Че Гевара")

FOR($fr = 0, $fr < ARRSIZE($friends))
    UNDEFINE($friend)
    STRSEPARATE($friends[$fr], ",", $friend)
    GETSCREEN
    IF(PXL($friend[0],$friend[1]) = 16777215)
        IF(PXL($friend[2],$friend[3]) = 16777215)
            LOGWRITE("--- ", $friend[4], " ---")
            LOGWRITE("точки: ", $friend[0], "/", $friend[1], "  ", $friend[2], "/", $friend[3])
            BEEP(800,200)
            WAITMS(100)
        ELSE
        END_IF
    END_IF
END_CYC
HALT


Alexlab

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

Alexlab

  • Зашел в гости
  • *
  • Posts: 8
    • View Profile
В общем все работает...
Но есть одно но!!!

Находя 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м координатам - подставляя эти координаты по очереди
« Last Edit: August 22, 2019, 01:44:34 AM by Alexlab »

Vint

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


Alexlab

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

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