Что нового

Проблема с циклами While

Andeangl

Новичок
Сообщения
62
Репутация
4
Доброго всем дня! Написал скрипт, он работает, но переодически вылетает, не могу разобраться в чём проблема :( Помогите пожалуйста!
Код:
Run("C:\Users\acer\AppData\Local")
Sleep(5000)
MouseClick("primary", 504, 474)
Sleep (10000)
MouseClick("primary", 201, 377)
Send('{ENTER}')
Sleep (5000)
MouseClick("primary", 418, 126)
Sleep(2000)
Send('{F7}')
Sleep(2000)
Send('{F11}')
Sleep(1000)
Dim $x, $y, $x15, $y15, $coord, $d, $f, $x1, $y1, $a, $b
$d = 2
$f = 0
HotKeySet('^s', '_Quit') 
While $d>0
While PixelGetColor(796, 382) <> 0xF8DEA4
$coord = PixelSearch ( 130, 140, 880, 730, 0x5B0D0A)
If Not @error Then
$x = $coord[0]
$y = $coord[1]
Sleep(100)

$coord1 = PixelSearch ( $x-25, $y-25, $x+25, $y+25, 0x906B00)
If @error Then
MouseClick("primary", $x, $y) 
Sleep(100)
MouseClick("primary", $x, $y)
Sleep(10000)
$a = $a+1
EndIf
If PixelGetColor(600, 450) = 0xFFEFC0 Then
   MouseClick("primary", 513, 496)
   Sleep(100)
   $f = 1
   $b = $b+1
EndIf
If PixelGetColor(482, 392) = 0x760000 Then
   MouseClick("primary", 505, 455)
   Sleep(100)
   $f = 1
   $b = $b+1
EndIf
If $f = 0 Then 
   Sleep(50000)
EndIf
Sleep(Random(1000, 5000))
If PixelGetColor(600, 450) = 0xFFEFC0 Then
   MouseClick("primary", 513, 496)
   $b = $b+1
EndIf
If PixelGetColor(482, 392) = 0xFFE1BA Then
   MouseClick("primary", 505, 455)
   $b = $b+1
EndIf
$f = 0
EndIf

$coord = PixelSearch ( 130, 140, 880, 730, 0x5B0D0A)
 While @error
 If $d=1 Then
 MouseClick("primary", 417, 29)
 Sleep(3000)
 MouseClick("primary", 520, 93)
 Sleep(500)
 $d = $d+1
 EndIf
  If $d=2 Then
 MouseClick("primary", 417, 29)
 Sleep(3000)
 MouseClick("primary", 460, 91)
 Sleep(500)
 $d = $d+1
 EndIf
  If $d=3 Then
 MouseClick("primary", 417, 29)
 Sleep(3000)
 MouseClick("primary", 457, 114)
 Sleep(500)
 $d = $d+1
 EndIf
  If $d=4 Then
 MouseClick("primary", 417, 29)
 Sleep(3000)
 MouseClick("primary", 529, 113)
 Sleep(500)
 $d = $d+1
 EndIf
   $d = 1 
WEnd
WEnd
While PixelGetColor(796, 382) = 0xF8DEA4
Sleep(Random(90000, 120000,1))
   MouseClick("primary", 360, 30) 
Sleep(Random(1000, 2000))
   MouseClick("primary", 490, 300) 
Sleep(Random(3000, 4500))
   MouseClick("primary", 515, 495) 
Sleep(Random(2000, 4000))
   MouseClick("primary", 820, 160)
Sleep(Random(1000, 2000))
   MouseClick("primary", 805, 160)
MouseClick("primary", 415, 29)
WEnd
WEnd
Func _Quit()
    MsgBox(64, 'Отчет', 'Всего сделано: ' & $a & @CR & 'Ошибок: ' & $b)
    Exit
EndFunc


Конструктивная критика приветствуется :ok:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Andeangl сказал(а):
Написал скрипт, он работает, но переодически вылетает...

Что значит вылетает? Заканчивается с ошибкой или нормально?
 
Автор
A

Andeangl

Новичок
Сообщения
62
Репутация
4
Заканчивается ошибками, к примеру просто останавливается в одной точке после выполнения этого цикла около 2-3 раз:
Код:
$coord = PixelSearch ( 130, 140, 880, 730, 0x5B0D0A)
 While @error
 If $d=1 Then
 MouseClick("primary", 417, 29)
 Sleep(3000)
 MouseClick("primary", 520, 93)
 Sleep(500)
 $d = $d+1
 EndIf
  If $d=2 Then
 MouseClick("primary", 417, 29)
 Sleep(3000)
 MouseClick("primary", 460, 91)
 Sleep(500)
 $d = $d+1
 EndIf
  If $d=3 Then
 MouseClick("primary", 417, 29)
 Sleep(3000)
 MouseClick("primary", 457, 114)
 Sleep(500)
 $d = $d+1
 EndIf
  If $d=4 Then
 MouseClick("primary", 417, 29)
 Sleep(3000)
 MouseClick("primary", 529, 113)
 Sleep(500)
 $d = $d+1
 EndIf
   $d = 1 
WEnd


С остальными ошибками я более-менее разбираюсь, но с этой не могу- не пойму из-за чего такое =(

Да, и если не затруднит посмотрите пожалуйста, правильно ли я вставил функцию которую Вы посоветовали здесь:
http://autoit-script.ru/index.php?topic=10063.new;topicseen
А то как-то не очень получается :(

Спасибо! :beer: :IL_AutoIt_1:
 

running-frag

why me?
Сообщения
441
Репутация
60
Не правильно (последний код). Почитай описание
Код:
PixelSearch ()
@error


В кратце это выглядит так.
Если ничего не нашёл (подробней в описании) тогда @error будет True. Отсюда получается, что у нас цикл будет всегда
Код:
While True

или
Код:
While False

и значение @error НЕ будет "перезаписан", а значит цикл повесится (или никогда не исполнится).
Надо по другому делать, к примеру

Код:
While True
	PixelSearch ()			; ищем пиксель
	If @error Then
		_error_action()		; если PixelSearch выдал ошибку, нихрена не нашёл
		;ContinueLoop		; он тут не обязателен, но тоже почитай описание
	Else
		_grand_action()		; если нашёл тогда делаем что нужно
		;ExitLoop 			; после "покидаем" цикл если это нужно, тыкни для описания
	EndIf
	
WEnd

Func _error_action ()
	; тут опред. действия если ненашло пиксель
EndFunc

Func _grand_action ()
	; тут действия если пиксель нашло
EndFunc
 
Верх