Что нового

Обьединение циклов и мелкие ошибки

MyBB

Новичок
Сообщения
20
Репутация
0
Версия AutoIT: v3.0
Описание:
1.Первый циккл скрипта, при нахождении кнопки(пикселя) на экране воспроизводит точный клик n-количество раз в определенных областях тем самым выставляет лот товара - задача первостепенная
письмо

2.Второй цикл, ждет появления сигнала т.е писма(пикселя) на экране, после появления кликает и попадает в вкладку с письмами, далее попадаем:

Подцикл. Во внутренний цикл, где проверяем входящее письмо (если письмо не торговое закрываем окно с входящими письмами) если торговое нажимаем и ищем две точки - первое совпадение есть двигаем мышку на кнопку (т.к кнопка меняет цвет) кнопка нужного цвета нажимаем купить/ не нужного закрываем окно входящих писем.
Повторяем внутрений цикл пока условия верны/ нет закрываем окно вздящий сообщений
Переходим в начало 2 цикла ждем пикселя.

Все это по кругу не мешая друг другу как 1 цикл так и 2рой

Примечания:
Код:
#Include <File.au3>
AdlibRegister("_Mail", 900000)

;---------------------------------------------------------------------------
$title = "[The Settlers Онлайн - Beta: Тандрия [Realm 1] - Google Chrome]"
While 1
   WinActivate($title)
$coord = Pixelsearch(150,550,170,570, 0xA69779,10)
If Not @error Then
   MouseClick ( "left",$coord[0], $coord[1], 1, 0 )
   Sleep(Random(2000,7000))
Else
   Sleep(100)
   ContinueLoop
EndIf
   _ClikEx(488, 563)
   _ClikEx(589, 553)
   _ClikEx(492, 405)
   _ClikEx(796, 633)
   _ClikEx(823, 563)
   _ClikEx(813, 407)
   _ClikEx(553, 637)
   _ClikEx(798, 633)
   _ClikEx(656, 498)
   WEnd
   
   Func _ClikEx($iX=0, $iY=0)
    MouseClick('left', $iX, $iY)
    Sleep(Random(2000, 5000, 1))
 EndFunc
 
;---------------------------------------------------------------------------
While _Mail()
   WinActivate($title)
$coord = Pixelsearch(120,100,150,120, 0x691310,10) ; Поиск писма
If Not @error Then
   Sleep(Random(2000,7000))
   MouseClick ( "left",$coord[0], $coord[1], 1, 0 )
   Else
   Sleep(100)
   ContinueLoop
EndIf
;---------------------------------------------------------------------------
;Вложенный цикл
While 1
; Часть 2 - Окно входящих писем
$coord = Pixelsearch(540,315,570,330, 0x69441E,10) ; Третья строчка входящих писем
If Not @error Then
   MouseClick ( "left",$coord[0], $coord[1], 1, 0 )
   Sleep(Random(2000,7000))
Else
   MouseClick('left', 950, 220) ; Закрываем окно
   Sleep(Random(2000,7000))
   EndIf
$coord = Pixelsearch(600,500,625,520, 0x69441E,10) ; Поиск
MouseMove( 620, 560 ,20 )
$coord = Pixelsearch(615,560,625,580, 0xF5E7B5,10) ; Покупка разрешена
If Not @error Then
   MouseClick ( "left",$coord[0], $coord[1], 2, 0 ) ; Покупаем
   Sleep(Random(2000,7000))
Else
   MouseClick('left', 950, 220) ; Закрываем окно
   Sleep(Random(2000,7000))
EndIf
WEnd
WEnd
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
MyBB, и почитай про
Код:
while
и может поймешь при каких условиях он выполняется.
 
Автор
M

MyBB

Новичок
Сообщения
20
Репутация
0
Вот не могу понять так представляю все а в коде выразить не могу 2 цикла получилось сделать соединить тестируется пока ничего, а вот как сделать что бы подцикл был true когда все действия выполняются а когда 1 из действий не выполняется отключается и ждет Пиксель ситч во втором цикле старшем.

В справке нет сложных примеров с циклами
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Как нибудь так.

Код:
$title = "[The Settlers Онлайн - Beta: Тандрия [Realm 1] - Google Chrome]"
WinActivate($title)

While 1
	$coord = Pixelsearch(150,550,170,570, 0xA69779,10)
	If Not @error Then
			;Тут выставляем лот товара
			
	EndIf


	$coord = Pixelsearch(120,100,150,120, 0x691310,10) ; Поиск письма
	If Not @error Then
			;Тут все дейсвтия с письмом
	EndIf

	Sleep(200)
WEnd


Выйти из цикла можно командой
Код:
ExitLoop
 
Автор
M

MyBB

Новичок
Сообщения
20
Репутация
0
И чем это отличается выше выложенного? действия с письмом - каждый пиксель ситч это новая вкладка, это 2 разный действия она не будет корректно работать если в 1 цикле...
 
Автор
M

MyBB

Новичок
Сообщения
20
Репутация
0
Ну вот я обьединил все циклы вложил 1 в другой: помогите сделать условие для 3 цикла если все выполнено правильно он возвращается к 3 циклу, а если нет то ожидает выполнение 2рого цикла.
Тогда просто получается 1 и 2 цикла одному сделать приоритет если находит противоричения т.е выполнение сразу и 1 и 2рого цикла...
Ещк вопрос не знаю как замедлить 2 цикл полностью движение вышки целканье все слишком быстро такое ошушение что он Sleep просто игнарирует т.к Sleep тут ждет пока данные подгрузятся:
Если можно примеры а там уже буду сам копатся...

Код:
;---------------------------------------------------------------------------
$title = "[The Settlers Онлайн - Beta: Тандрия [Realm 1] - Google Chrome]"
While 1
   WinActivate($title)
$coord = Pixelsearch(150,550,170,570, 0xA69779,10)
If Not @error Then
   Sleep(Random(2000,7000))
   MouseClick ( "left",$coord[0], $coord[1], 1, 0 )
Else
   Sleep(100)
   ContinueLoop
EndIf
   _ClikEx(488, 563)
   _ClikEx(589, 553)
   _ClikEx(492, 405)
   _ClikEx(796, 633)
   _ClikEx(823, 563)
   _ClikEx(813, 407)
   _ClikEx(553, 637)
   _ClikEx(798, 633)
   _ClikEx(656, 498)
;---------------------------------------------------------------------------
While 1
   WinActivate($title)
$coord = Pixelsearch(120,100,150,120, 0x691310,10) ; Поиск писма
If Not @error Then
   Sleep(Random(2000,7000))
   MouseClick ( "left",$coord[0], $coord[1], 1, 0 )
   Else
   Sleep(100)
   ContinueLoop
EndIf
;---------------------------------------------------------------------------
;Вложенный цикл (Окно входящих писем)
While 1
$coord = Pixelsearch(540,315,570,330, 0x69441E,10) ; Третья строчка входящих писем
If Not @error Then
   Sleep(Random(2000,7000))
   MouseClick ( "left",$coord[0], $coord[1], 1, 0 )
Else
   MouseClick('left', 950, 220) ; Закрываем окно
   EndIf
$coord = Pixelsearch(600,500,625,520, 0x69441E,10) ; Поиск
MouseMove( 620, 560 ,20 )
$coord = Pixelsearch(615,560,625,580, 0xF5E7B5,10) ; Покупка разрешена
If Not @error Then
   Sleep(Random(2000,7000))
   MouseClick ( "left",$coord[0], $coord[1], 2, 0 ) ; Покупаем
Else
   MouseClick('left', 950, 220) ; Закрываем окно
EndIf
WEnd
WEnd
WEnd


   Func _ClikEx($iX=0, $iY=0)
    MouseClick('left', $iX, $iY)
    Sleep(Random(2000, 5000, 1))
 EndFunc
 

ggzgamer

Осваивающий
Сообщения
134
Репутация
23
Все циклы можно оформить в виде функций, которые будут вызываться из основной программы.
Программу оформляешь бесконечным циклом Wile 1 .. Wend

Код:
While 1
	; блок сбора данных для работы уловий $fCond_1, $fCond_2 и т.д.
	If $fCond_1 Then
		_Func_1()
	EndIf
	If $fCond_2 Then
		_Func_2()
	EndIf
	; и т.д.
WEnd

Func _Func_1()
	; тело первой ф.-ии
EndFunc

Func _Func_2()
	; тело второй ф.-ии
EndFunc


Изменение скорости перемещения мыши при MouseClick(..) задаётся 5-м параметром - http://autoit-script.ru/autoit3_docs/functions/MouseClick.htm
 
Автор
M

MyBB

Новичок
Сообщения
20
Репутация
0
Спасибо полезно, т.е любой цикл можно сделать функцией... Насчет скорости перемешения 1 цикл работает хорошо Sleep без проблем а вот в

Код:
;---------------------------------------------------------------------------
While 1
   WinActivate($title)
$coord = Pixelsearch(120,100,150,120, 0x691310,10) ; Поиск писма
If Not @error Then
   Sleep(Random(2000,7000))
   MouseClick ( "left",$coord[0], $coord[1], 1, 0 )
   Else
   Sleep(100)
   ContinueLoop
EndIf
;---------------------------------------------------------------------------
;Вложенный цикл (Окно входящих писем)
While 1
$coord = Pixelsearch(540,315,570,330, 0x69441E,10) ; Третья строчка входящих писем
If Not @error Then
   Sleep(Random(2000,7000))
   MouseClick ( "left",$coord[0], $coord[1], 1, 0 )
Else
   MouseClick('left', 950, 220) ; Закрываем окно
   EndIf
$coord = Pixelsearch(600,500,625,520, 0x69441E,10) ; Поиск
MouseMove( 620, 560 ,20 )
$coord = Pixelsearch(615,560,625,580, 0xF5E7B5,10) ; Покупка разрешена
If Not @error Then
   Sleep(Random(2000,7000))
   MouseClick ( "left",$coord[0], $coord[1], 2, 0 ) ; Покупаем
Else
   MouseClick('left', 950, 220) ; Закрываем окно
EndIf
WEnd
WEnd


Все пролетает как молния такое ошушение что Sleep просто не срабатывает...
 

Asshaker

Знающий
Сообщения
150
Репутация
17
http://autoit-script.ru/autoit3_docs/functions/MouseClick.htm
Код:
MouseClick ( "left",$coord[0], $coord[1], 1, 0 )

speed=0 у тебя.
Есть какая-то полная последовательность действий? М.б. скрины с вкладками и "письмами" покажешь :smile: ?
 
Автор
M

MyBB

Новичок
Сообщения
20
Репутация
0
Вот так для 2рого цикла и под цикла
Если писмо есть кликаем по нему/ если нет ждем появления
S0z7cWAH.png


Для подцикла - повторяются до тех пор пока условия верны, т.е есть совпадения:
Писмо найдено (черный квадрат) - кликаем по нему 2 раза/ если нет писма (кликаем по красному квадрату) закрываем окно.
VkCDZ521.png


Если желтый квадрат найден наводим мышку на кнопку принять, если кнопка принять меняет цвет, кликаем по ней, если нет совпадений (красный квадрат) закрываем окно
21k5Zps1.png


Возвращаемся к 2 циклу ждем появления писма

Все что описал это вот это:

Код:
While 1
   WinActivate($title)
$coord = Pixelsearch(120,100,150,120, 0x691310,10) ; Поиск писма
If Not @error Then
   Sleep(Random(2000,7000))
   MouseClick ( "left",$coord[0], $coord[1], 1, 0 )
   Else
   Sleep(100)
   ContinueLoop
EndIf
;---------------------------------------------------------------------------
;Вложенный цикл (Окно входящих писем)
While 1
$coord = Pixelsearch(540,315,570,330, 0x69441E,10) ; Третья строчка входящих писем
If Not @error Then
   Sleep(Random(2000,7000))
   MouseClick ( "left",$coord[0], $coord[1], 1, 0 )
Else
   MouseClick('left', 950, 220) ; Закрываем окно
   EndIf
$coord = Pixelsearch(600,500,625,520, 0x69441E,10) ; Поиск
MouseMove( 620, 560 ,20 )
$coord = Pixelsearch(615,560,625,580, 0xF5E7B5,10) ; Покупка разрешена
If Not @error Then
   Sleep(Random(2000,7000))
   MouseClick ( "left",$coord[0], $coord[1], 2, 0 ) ; Покупаем
Else
   MouseClick('left', 950, 220) ; Закрываем окно
EndIf
WEnd
WEnd
 

Asshaker

Знающий
Сообщения
150
Репутация
17
Мне видится такой вариант:
Код:
Dim $exit[2]=[123,456] ;координаты красного крестика
while 1
	Sleep(5000)
	$NewMail=PixelSearch(1,1,2,2,0x000000) ; ищем значек новых писем около аватарки
	If not @error Then
		MouseClick('left',$NewMail[0],$NewMail[1],2,40) ; 2 клика на иконке значка
		Sleep(1000)
		$Mail=PixelSearch(1,1,2,2,0xFFFFFF) ; ищем новое письмо
		if not @error Then
			MouseClick('left',$Mail[0],$Mail[1],2,40) ; открываем письмо
			Sleep(1000)
			$Button=PixelSearch(1,1,2,2,0x000FFF) ;ищем желтый
			If Not @error Then
				MouseClick('left',$Button[0],$Button[1],2,40) ; жмем принять
				Sleep(1000)
			Else
				MouseClick('left',$exit[0],$exit[1],1,40) ; жмем крест
				Sleep(1000)
			EndIf
		Else
			MouseClick('left',$exit[0],$exit[1],1,40) ; жмем крест
			Sleep(1000)
		EndIf
	EndIf
WEnd
 

ggzgamer

Осваивающий
Сообщения
134
Репутация
23
Код:
While 1
    WinActivate($title)
    $coord = Pixelsearch(120,100,150,120, 0x691310,10) ; Поиск писма
    If Not @error Then
	    Sleep(Random(2000,7000))
        MouseClick ( "left",$coord[0], $coord[1], 1, 50)
		While 1
			Sleep(500)
			$coord = Pixelsearch(540,315,570,330, 0x69441E,10) ; Третья строчка входящих писем
            If Not @error Then
                Sleep(Random(2000,7000))
                MouseClick ( "left",$coord[0], $coord[1], 1, 0 )
		    Else
                MouseClick('left', 950, 220) ; Закрываем окно
				ExitLoop
	    	EndIf
            $coord = Pixelsearch(600,500,625,520, 0x69441E,10) ; Поиск
            MouseMove( 620, 560 ,20 )
            $coord = Pixelsearch(615,560,625,580, 0xF5E7B5,10) ; Покупка разрешена
            If Not @error Then
    			Sleep(Random(2000,7000))
                MouseClick ( "left",$coord[0], $coord[1], 2, 0 ) ; Покупаем
            Else
    			MouseClick('left', 950, 220) ; Закрываем окно
				ExitLoop
            EndIf
        WEnd
	Else
       Sleep(100)
	EndIf
WEnd
 
Автор
M

MyBB

Новичок
Сообщения
20
Репутация
0
Спасибо разбираю изменения и читаю о новых функциях ExitLoop получается завершает цикл понял
 
Автор
M

MyBB

Новичок
Сообщения
20
Репутация
0
Посматрите код подправил так работать будет?

Код:
$title = "[The Settlers Онлайн - Beta: Тандрия [Realm 1] - Google Chrome]"
While 1
   WinActivate($title)
$coord = Pixelsearch(150,550,170,570, 0xA69779,10)
If Not @error Then ; Если выражение справедлтво то оно выполняется!
   MouseClick ( "left",$coord[0], $coord[1], 1, 30 )
   Sleep(Random(2000,7000))
Else ; А если нет выключаем цикл, 
   Sleep(100)
   ExitLoop
EndIf
   _ClikEx(488, 563) ; Все функциии выполняются если If справедливо
   _ClikEx(589, 553)
   _ClikEx(492, 405)
   _ClikEx(796, 633)
   _ClikEx(823, 563)
   _ClikEx(813, 407)
   _ClikEx(553, 637)
   _ClikEx(798, 633)
   _ClikEx(656, 498)
   WEnd
   
   Func _ClikEx($iX=0, $iY=0)
    MouseClick('left', $iX, $iY)
    Sleep(Random(2000, 5000, 1))
EndFunc


И еще вопрос это 1 часть кода выше выложенна вторая их можно теперь через If...ElseIf...Else...EndIf или
If...Then
оьединить что бы они не вызывали противоречий у друг друга, т.е если 1 работает 2 спит или если 2 работает 1 спит, правельно я понял 1 и 2 части присвоить функции и что выше написал через это и в 1 цикл вложить
 
Верх