Что нового

[Рыбное место] Бот для игры (Майл.ру, одноклассники, ВК)

From_Russia

Новичок
Сообщения
8
Репутация
0
Нашел в интернете код бота для приложения "Рыбное место" и решил его переделать под себя.
Начиная с 74 строки начинается проверка цвета в прямоугольнике, не могу понять логики работы.

1. Там проверяется 6 цветов в этом прямоугольнике и когда в этом прямоугольнике нету хотя бы одного из указанных цветов, скрипт делает то, что дальше написано (а именно подсекает рыбу нажатием пробела и выуживает).
Я правильно понял?
_________________________________________________
2. Хотел бы узнать, как сделать, чтобы цвет проверялся только в одной координате и когда бы этот цвет менялся, то скрипт бы делал то, что дальше написано(а именно подсекать рыбу нажатием пробела и выуживать)

Для ясности покажу пример на программеUoPilot. Проверка цвета в одной координате делалась так:
1 :blum:oplavok
2 while #Sx, #Sy #Sc
3 if 275, 328 12691860 // Если указанная координата заданного цвета
4 goto Poplavok // то перейти к проверке еще раз
5 else // Если же координата указанная в строке 3 изменила цвет,
6 left 500, 329 // то подсечь рыбу нажатием левой кнопкой мишки на кнопке в игре "Подсечь рыбу"
7 goto Loviti // После подсечки перейти в вылавливавний
8 end_if
9 end_while


Код:
oundPlay(EnvGet("WINDIR") & "\Media\Windows Notify.wav", 0)
$exit = 0
$refresh = 0
$pause = 0
HotKeySet("{Pause}", "TogglePause")
HotKeySet("{F10}", "Quit") 
Func Quit()
    SoundPlay(EnvGet("WINDIR") & "\Media\Windows Hardware Remove.wav", 0)
    MsgBox(0, "Bye!!!", "See you later )))", 1)
    Exit
EndFunc
Func TogglePause() 
    If $pause = 0 Then 
        $pause = 1
        SoundPlay(EnvGet("WINDIR") & "\Media\Speech On.wav", 0)
        MsgBox(0, "Pause", "Paused", 1)
    Else
        $pause = 0
        SoundPlay(EnvGet("WINDIR") & "\Media\Speech Off.wav", 0)
        MsgBox(0, "Pause", "Continue", 1)
    EndIf
EndFunc
;Главный цикл программы
WHILE $exit <> 1
    WinActive("«Рыбное место» - Приложения - Мой Мир@Mail.Ru - Google Chrome");Заголовок окна
    WinActivate("«Рыбное место» - Приложения - Мой Мир@Mail.Ru - Google Chrome");Заголовок окна
    MouseClick("left", 10, 70) ;Сфокусировались на странице
    SLEEP(200)
    Send("{Home}");Передвинули страницу на самый верх
    SLEEP(200)
    MouseClick("left", 451, 273);Сфокусировались на приложении
    ;Закрыли все оповещалки
    Send("{Esc}")
    SLEEP(200)
    Send("{Esc}")
    SLEEP(200)
    Send("{Esc}")
    SLEEP(200)
    
    ;Забросили удочку
    Send("{Space}")
    SLEEP(3000)
    
    ;Если не получилось
    ;Проверка - на обводке кнопки.
    ;Если кнопка есть, то можно забрасывать
    ;Так бывает когда закончились снасти
    ;или если сервер не доступен
    IF Hex(PixelGetColor(891,533), 6) <> "563A12" THEN
            ;С каждым разом ждем дольше
            SLEEP($refresh * 20000)
            $refresh += 1
            ;что-то случилось, перезагружаем страницу
            MouseClick("left", 70, 40)
            ;Ждем загрузки приложения
            SLEEP(20000)
            ;Перезапуск главного цикла
            ContinueLoop
    EndIf
    $refresh = 0
    ;Ждем поклевку
    $bite = 0;
    WHILE $bite=0
            $bite1 = False
            $bite2 = False
            $bite3 = False
            $bite4 = False
            $bite5 = False
            $bite6 = False
            $bite7 = False
            ;Если удочка, то смотрим на поплавок
            ;При необходимости добавляем цвета на поверхности поплавка
                                ;координаты прямоугольника, в котором ищем поплавок и цвет, который ищем
            $coord = PixelSearch(624, 480, 680, 560, 0xFF8000)
            IF NOT @ERROR THEN
                    $bite1 = True
            EndIf
            $coord = PixelSearch(624, 480, 680, 560, 0xD50202)
            IF NOT @ERROR THEN
                    $bite2 = True
            EndIf
            $coord = PixelSearch(624, 480, 680, 560, 0xFF9F00)
            IF NOT @ERROR THEN
                    $bite3 = True
            EndIf
            $coord = PixelSearch(624, 480, 680, 560, 0xD0661E)
            IF NOT @ERROR THEN
                    $bite4 = True
            EndIf
            $coord = PixelSearch(624, 480, 680, 560, 0xFFCC00)
            IF NOT @ERROR THEN
                    $bite5 = True
            EndIf
            $coord = PixelSearch(624, 480, 680, 560, 0xBF9900)
            IF NOT @ERROR THEN
                    $bite6 = True
            EndIf
            $coord = PixelSearch(624, 480, 680, 560, 0xFF0000)
            IF NOT @ERROR THEN
                    $bite7 = True
            EndIf
            IF $bite1 OR $bite2 OR $bite3 OR $bite4 OR $bite5 OR $bite6 OR $bite7 THEN
                    ;нет поклевки, поплавок найден
                    $bite = 0
            ELSE
                    ;поклевка
                    $bite = 1  
            EndIf
            SLEEP(25)
    WEND
    
    ;Когда поплавок ушел под воду при поклевке
    ;или рыбачим на спининг (поплавка нет вовсе)
    ;запоминаем цвет под шкалой (закрашено шкалой или нет)
    
    $str = 496 + 140;позиция шкалы по оси Х, где начинаем тянуть
    $end = 883 - 140;позиция шкалы по оси X, где заканчиваем тянуть

    ;первое слагаемое - координата края шкалы
    ;второе - отступ от края
    ;по идее, чем мощнее тачка, тем меньше можно делать отступ

    $lvl = 738;позиция шкалы по оси У
    
    $drag = Hex(PixelGetColor($str, $lvl), 6);запоминаем цвет подложки слева
    $drop = Hex(PixelGetColor($end, $lvl), 6);запоминаем цвет подложки справа
    
    ;Клюет, вытаскиваем!!!
    ;настройка ввода с клавиатуры
    AutoItSetOption("SendKeyDelay", 1)
    AutoItSetOption("SendKeyDownDelay", 100)
    AutoItSetOption("SendCapslockMode", 1)

    ;подсекаем
    Send("{Space}");решил, что это будет лишним. При желании, раскомментируйте
    
    $flag = 1    ;0 - отпускаем, 1 - тащим
    WHILE Hex(PixelGetColor(891,533), 6) = "563A12";пока есть кнопка
            IF Hex(PixelGetColor($str, $lvl), 6) = $drag THEN;шкала ушла левее левой отметки, тащим
                    $flag = 1
            EndIf
            IF Hex(PixelGetColor($end, $lvl), 6) <> $drop THEN;шкала закрасила правую отметку, отпускаем
                    $flag = 0
            EndIf
            IF $flag = 1 THEN
                    Send("{Space}");тащим
            ELSE
                    SLEEP(25);отпускаем
            EndIf
    WEND
    ;смотрим на улов
    ;или любуемся надписью "Рыба сорвалась" или что-либо другое
    SLEEP(3000)
    While $pause = 1
        Sleep(3000)
    WEnd
WEND
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Re: [Автоматизация] Как сделать проверку на цвет одного пикселя? PixelSearch

1. Вообщето наоборот - скрипт проверяет 6 контрольных точек и если нашел хоть одну, то считает что поплавок на поверхности, а если не нашел ни одной - значит клюет.
Ответ: НЕТ, понял неправильно.

2. Наверное (в эту игру я не играл, так что просто рассуждаю логически...) Наверное скрипт писал неглупый человек и он заметил что поплавок не статичен и для него (поплавка) существует 6 вариантов картинки, вот он и проверил 6 точек для каждого из вариантов.
Ответ: наверное НЕТ, так сделать нельзя (у автора бота, как видите, не получилось). Но, если вы найдёте точку в изображении поплавка, которая всегда одного и того же цвета. то, конечно, можно. :smile:
 
Автор
F

From_Russia

Новичок
Сообщения
8
Репутация
0
Re: [Автоматизация] Как сделать проверку на цвет одного пикселя? PixelSearch

Не знаю почему автор скрипта ориентировался на поплавок (зачем проверять аж 6 точек), когда можно ориентироваться чуть ниже поплавка на воду (вода неподвижная и всегда имеет в каждой координате один цвет.
Когда идёт поклевка от поплавка идут волны (поплавок двигается только горизонтально, а волны от него распространяются во все стороны). Так вот достаточно сделать проверку только одного пикселя чуть ниже поплака, если цвет изменится, значит клюёт и пора подсекать рыбу

Так что вопрос открыт: как сделать проверку одной точки и если её цвет изменился, то выполнять условия дальше
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Re: [Автоматизация] Как сделать проверку на цвет одного пикселя? PixelSearch

Повторяю что эту игру я не видел, но
поплавок двигается только горизонтально, а волны от него распространяются во все стороны
наверное автор бота подсекает только когда поплавок ушел под воду, а все горизонтальные движения поплавка он отлавливает проверкой 6-ти точек и ждёт (ну я рыбу в детстве именно так ловил :smile:)


Добавлено:
Сообщение автоматически объединено:

кстати да, в боте в коментариях так и написано: когда поплавок ушел под воду

Причем автор бота довольно крут - он объединил две ситуации в одно действие: если нет поплавка, то тянуть. Тем самым он тянет удочку, когда попалавок ушел под воду, и тянет спининг, когда не видит поплавка.
:ok:
 
Автор
F

From_Russia

Новичок
Сообщения
8
Репутация
0
Re: [Автоматизация] Как сделать проверку на цвет одного пикселя? PixelSearch

Ты меня немного не понимаешь. Автор бота сделал лишнюю работу, он проверяет поплавок в 6 точках и потом подсекает.
В UoPilot'e я делал проверку не по поплавку, а по волнам, которые идут при поклёвке и всё просто отлично работало. Вот и тут я хочу сделать такую проверку. Вот пример с пилота:
:blum:oplavok
if 275, 328 12691860 // Если точка 275, 328 цвета 12691860
goto Poplavok // то перейти к проверке еще раз
else // если точка уже не цвета 12691860, то перейти дальше
... ... ...


Добавлено:
Сообщение автоматически объединено:

Причем автор бота довольно крут - он объединил две ситуации в одно действие: если нет поплавка, то тянуть. Тем самым он тянет удочку, когда попалавок ушел под воду, и тянет спининг, когда не видит поплавка.

Думаю это не правильно, т.к. в игре на спининг ловить также как и на удочку, закинул и ждёшь, а в жизни спинингом нужно постоянно тянуть


Добавлено:
Сообщение автоматически объединено:

А при поклёвке что на спининг, что на удочку идут волны. Поэтому и спрашиваю как сделать проверку одной точки
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Re: [Автоматизация] Как сделать проверку на цвет одного пикселя? PixelSearch

Не понимаю. Ещё раз отмечаю что саму игру я не видел.

1. Твой бот не работает со спинингом (насколько я понимаю код - бот на autoit сразу начнет тянуть когда закинет спининг)

2. Твой бот подсекает просто при поклёвке, а приведенный код autoit подсекает когда поплавок нырнул - ситуации разные.

3. Если твой алгоритм тебя устраивает, то вопрос в чем? Поменяй 6 проверок на одну (координаты ты знаешь, цвет тоже) и вперёд.
;D
 
Автор
F

From_Russia

Новичок
Сообщения
8
Репутация
0
Re: [Автоматизация] Как сделать проверку на цвет одного пикселя? PixelSearch

1. Как раз мой бот будет работать со спинингом, а его нет (прочитай сообщение выше, я обновил там)
2. Поплавок нырнул и поклёвка разве не одно и тоже? :smile:
3. Раз нужно просто 6 проверок поменять на одну, то вопрос: как это будет выглядеть в готовом виде?

Оригинал
Код:
$bite = 0;
    WHILE $bite=0
            $bite1 = False
            $bite2 = False
            $bite3 = False
            $bite4 = False
            $bite5 = False
            $bite6 = False
            $bite7 = False
            ;Если удочка, то смотрим на поплавок
            ;При необходимости добавляем цвета на поверхности поплавка
                                ;координаты прямоугольника, в котором ищем поплавок и цвет, который ищем
            $coord = PixelSearch(624, 480, 680, 560, 0xFF8000)
            IF NOT @ERROR THEN
                    $bite1 = True
            EndIf
            $coord = PixelSearch(624, 480, 680, 560, 0xD50202)
            IF NOT @ERROR THEN
                    $bite2 = True
            EndIf
            $coord = PixelSearch(624, 480, 680, 560, 0xFF9F00)
            IF NOT @ERROR THEN
                    $bite3 = True
            EndIf
            $coord = PixelSearch(624, 480, 680, 560, 0xD0661E)
            IF NOT @ERROR THEN
                    $bite4 = True
            EndIf
            $coord = PixelSearch(624, 480, 680, 560, 0xFFCC00)
            IF NOT @ERROR THEN
                    $bite5 = True
            EndIf
            $coord = PixelSearch(624, 480, 680, 560, 0xBF9900)
            IF NOT @ERROR THEN
                    $bite6 = True
            EndIf
            $coord = PixelSearch(624, 480, 680, 560, 0xFF0000)
            IF NOT @ERROR THEN
                    $bite7 = True
            EndIf
            IF $bite1 OR $bite2 OR $bite3 OR $bite4 OR $bite5 OR $bite6 OR $bite7 THEN
                    ;нет поклевки, поплавок найден
                    $bite = 0
            ELSE
                    ;поклевка
                    $bite = 1  
            EndIf
            SLEEP(25)
    WEND


Переделал
Код:
$bite = 0;
    WHILE $bite=0
            $bite1 = False
            
            ;Если удочка, то смотрим на поплавок
            ;При необходимости добавляем цвета на поверхности поплавка
                                ;координаты прямоугольника, в котором ищем поплавок и цвет, который ищем
            $coord = PixelSearch(624, 480, 680, 560, 0xFF8000)
            IF NOT @ERROR THEN
                    $bite1 = True
            EndIf
            IF $bite1 THEN
                    ;нет поклевки, поплавок найден
                    $bite = 0
            ELSE
                    ;поклевка
                    $bite = 1  
            EndIf
            SLEEP(25)
    WEND

Всё правильно обрезал?



Добавлено:
Сообщение автоматически объединено:

Только я вот не понимаю, зачем перелопачивать весь прямоугольник, когда лучше следить только за одним пикселем?
Вот так прокатит?
Код:
$coord = PixelSearch(624, 480 0xFF8000)
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Re: [Автоматизация] Как сделать проверку на цвет одного пикселя? PixelSearch

Ну конечно лучше следить за одним пикселем!
Я бы вот так написал
Код:
; переводим твой скрипт на AutoIt
;  if 275, 328 12691860  // Если точка 275, 328 цвета 12691860
$x = 275 ; проверка значения на тебе
$y = 328 ; проверка значения на тебе
$color = 0x...... ; перевод цвета 12691860 на тебе

; goto Poplavok           // то перейти к проверке еще раз
; else // если точка уже не цвета 12691860, то перейти дальше
While PixelGetColor( $x, $y) = $color
	Sleep(25)
WEnd
 
Автор
F

From_Russia

Новичок
Сообщения
8
Репутация
0
Re: [Автоматизация] Как сделать проверку на цвет одного пикселя? PixelSearch

Сейчас начинаю переделывать скрипт и буду потихоньку задавать вопросы, может кто ответит)))
Вот первый, как сделать чтобы нажатие кнопки отправить 4 раза, вместо того, чтобы каждый раз прописывать команду
Код:
Send("{Down}")
    SLEEP(100)
	Send("{Down}")
    SLEEP(100)
	Send("{Down}")
    SLEEP(100)
	Send("{Down}")
    SLEEP(100)
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Re: [Автоматизация] Как сделать проверку на цвет одного пикселя? PixelSearch

Ты такие вопросы лучше не задавай...
Почитай что-нибудь по программированию вообще.
Код:
For $i=1 To 4
    Send("{Down}")
    SLEEP(100)
Next
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Re: [Автоматизация] Как сделать проверку на цвет одного пикселя? PixelSearch

Предупреждение За нарушение правил форума (пункт Б.5):
Имя темы должно нести смысловую нагрузку (отражать суть вопроса/проблемы)
Правильно сформулированное название темы привлекает больше внимания, и шансы получить конкретный ответ увеличиваются.


Данные правила могут пополняться локальными правилами раздела.
Как правильно называть темы

"[Автоматизация] Как сделать проверку на цвет одного пикселя? PixelSearch" - это неприемлемое название темы, переименуйте тему иначе она будет закрыта, а вам возможно будет выдан бан на несколько дней.

С уважением, ваш Модератор.
 
Автор
F

From_Russia

Новичок
Сообщения
8
Репутация
0
Почти всё сделал, работает нормально, теперь осталось доделать одну штуку.

Нужно чтобы в заданном прямоугольнике по всем координатам (или лучше с интервалом 10 пикселей по X и Y) нажималась 1 раз левая кнопка мышки. Как это реализовать?
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Код:
AdvClick("left", 1, 10, 200, 300, 500, 600, 10, 100)
Func AdvClick($button, $clicks, $speed, $x1, $y1, $x2, $y2, $Step, $Sleep)
	For $x = $x1 To $x2 Step $Step
		For $y = $y1 To $y2 Step $Step
			MouseClick($button, $x, $y, $clicks, $speed)
			ToolTip($x&", "&$y)
			Sleep($Sleep)
		Next
	Next
EndFunc
Как-то так.
 
Автор
F

From_Russia

Новичок
Сообщения
8
Репутация
0
Вроде всё сделал, теперь хочу графический интерфейс прикрутить
http://autoit-script.ru/index.php/topic,8922.0.html
 
Верх