Что нового

Рестарт циклов

EviLo4ek

Новичок
Сообщения
9
Репутация
3
День добрый, есть цикл который выполняет функции при совпадении условий, как сделать так, что бы цикл перезапускался, а не выполнял все функции из списка до конца при исчезновении условия.

Код:
If что-то == чему-то Then          
	           _функция1()
		  Sleep(Random(400,600))
	           _функция2()
		   Sleep(Random(400,600))
		  _функция3()
	          EndIf


В данном варианте, после исчезновения условия во время функции 1, затем выполняться 2я и 3я, а хотелось бы сбросить последовательное выполнение и при появлении условия начать выполнять цикл заново.

Думаю это можно сделать примерно так, только чем перезапускать цикл?
Код:
If что-то == чему-то Then          
	           _функция1()
		  Sleep(Random(400,600))
	           _функция2()
		   Sleep(Random(400,600))
		  _функция3()
                  ElseIF 
                  что-то перезапускающее
	          EndIf


П.С поискал на форуме, пробовал _ScriptRestart() - не получается, да и криво как-то будет, тем более что помимо этих условий в цикле есть другие.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
EviLo4ek,
Код:
$i = 0
While $i < 20
	Sleep(500)
	$i += 1
	ConsoleWrite('До: ' & $i & @LF)
	If $i > 10 Then ContinueLoop
	ConsoleWrite('После: ' & $i & @LF)
WEnd
 

running-frag

why me?
Сообщения
441
Репутация
60
Код:
For $i = 1 To 20
	Local $_result = somecheck()
	
	Select
		Case $_result == "some1"						; чего то сработало
			ConsoleWrite ("this is some1 case"&@CR)
			
		Case $_result == "some2"						; чего то другое сработало
			ConsoleWrite ("this is some2 case"&@CR)
		
		EndSelect
Next


Ну как "в профиль" скрипта выше. Но Select исполнит по умолчанию одно условие (где Case отдаст True). В прицепи тут до зведы ContinueLoop. Но для наглядности видно как это работает.

Так же из функция должна нам отдат уникальное значение которые у нас будет в Case. В противном случае выполнится Case Else (который я не написал :rofl:).

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


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

По аналогу можно так же использывать Switch ().
 
Автор
E

EviLo4ek

Новичок
Сообщения
9
Репутация
3
Я извиняюсь, может я что-то напутал, но сделав при помощи case следующее:
Код:
While 1

        Local $sColorGet1 = StringLower(Hex(PixelGetColor(151, 65), 6))  ; координаты для проверки 1 
	Local $sColorGet2 = StringLower(Hex(PixelGetColor(634, 65), 6))  ; координаты для проверки 2
	Local $sColorGet3 = StringLower(Hex(PixelGetColor(595, 540), 6)) ; координаты для проверки 3
	Local $sColorGet4 = StringLower(Hex(PixelGetColor(121, 85), 6))  ; координаты для проверки 4
	Local $sColorGet5 = StringLower(Hex(PixelGetColor(105, 100), 6)) ; координаты для проверки 5
	Local $sColorGet6 = StringLower(Hex(PixelGetColor(635, 65), 6)) ; координаты для проверки 6
   

        Local $sColorGetCD1 = StringLower(Hex(PixelGetColor(388, 620), 6)) ; координаты скила номер 1
	Local $sColorGetCD2 = StringLower(Hex(PixelGetColor(442, 620), 6)) ; координаты скила номер 2
	Local $sColorGetCD3 = StringLower(Hex(PixelGetColor(495, 620), 6)) ; координаты скила номер 3
        Local $sColorGetCD4 = StringLower(Hex(PixelGetColor(548, 620), 6)) ; координаты скила номер 4
	Local $sColorGetCD5 = StringLower(Hex(PixelGetColor(600, 620), 6)) ; координаты скила номер 5
	
	
    Select
         Case $sColorGet1 <> $sColor1                        
            ToolTip('Здоровье на низком уровне',622,250)
	        _heal()
            
         Case $sColorGet2 == $sColor2                        
            ToolTip('Начинаю атаковать',622,250)
		    _attack()
		    _skill1()
		    _skill2()
		    _skill3()
		   
		   
		 Case $sColorGet4 <> $sColor4  ; 
		    ToolTip('Мана',622,250)
	            _energy()
		   
	     Case $sColorGet3 == $sColor3  ;
		ToolTip('Ваш персонаж погиб',622,250)
	        MouseMove (595, 540)
	        Sleep (500)
	        mouseclick("left")
	        Sleep(Random(1400,3000))
	        Send ('!{F4}')
	        StopBot()
			
		 Case $sColorGet6 <> $sColor6  
			_loot()
        
    EndSelect
WEnd


Я получаю тоже самое, _skill1() _skill2() _skill3() все равно выполняются когда $sColorGet2 == $sColor2 вдруг становится $sColorGet2 <> $sColor2...
 

running-frag

why me?
Сообщения
441
Репутация
60
running-frag [?]
Но Select исполнит по умолчанию одно условие (где Case отдаст True).
Это первый момент. Второй момент тот что "дальше" первого (если он сработал) ничего выполнятся не будет.



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

Если ты хочешь что б проверялись и выполнялись все случаи тогде тебе в сторону
Код:
While True
	If $_pixel1 == "000000" Then somefunc0()
	If $_pixel2 == "000001" Then somefunc1()
	If $_pixel3 == "000002" Then somefunc2()
WEnd



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

OffTopic:
И это полный изврат проверять пикселя так как ты это делаешь. Сделай пару функций которые будут тебе отдавать внятный результат в виде значений\слов типо "low health", "can attack", "in attack". Тогда ты просто будет пробегаться по всем возможным вариантам действий и отдавать данные в функцию где и будет данный Select. Таким образом у тебя будет и цикл и "логика". Сейчас последний вариант тебя походу устроит, но имхо конечно личное. :D
 

ggzgamer

Осваивающий
Сообщения
134
Репутация
23
Что, кстати означает двойное равенство '=='
Отличия существенные от просто одинарного? '='
 
Автор
E

EviLo4ek

Новичок
Сообщения
9
Репутация
3
running-frag, а будет ли это:
Код:
While True
    If $_pixel1 == "000000" Then somefunc0()
    If $_pixel1 == "000000" Then somefunc1()
    If $_pixel1 == "000000" Then somefunc2()
WEnd

Тоже самое, что и:
Код:
While True
     If $_pixel1 == "000000" Then 
     somefunc0()
     somefunc1()
     somefunc2()
WEnd


?
Если да, то получается когда тригер сработал, запустилась somefunc0() и допустим она выполняется секунд 5, но на 4й секунде тригер (If $_pixel1 == "000000" Then) изменился, стал <>, функции 1 и 2 все равно выполняться 1н раз.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
EviLo4ek
ну так поставь дополнительно в самих функциях условия на выполнение. функции будут срабатывать только начально
 

running-frag

why me?
Сообщения
441
Репутация
60
Код:
While True
    If $_pixel1 == "000000" Then somefunc0()
    If $_pixel2 == "000001" Then somefunc1()
    If $_pixel3 == "000002" Then somefunc2()
WEnd

Внимательней к коду, тут не то что ты написал выше. У меня тут переменные все разные. У тебя одинаковые (если одинаковые то да, одного условия достаточно). Тут проверка идёт к каждому пикселу. Но блин это писалось наглядно. В идеале это смотрится вот так.

Код:
While True
    If _check_agro () Then action_1()
    If _check_cargo() Then action_2()
	;. . .
WEnd

Func _check_agro ()
	If PixelGetColor (...) == "000000" Then Return True
		
	Return False
EndFunc

Func _check_cargo ()
	If PixelGetColor (...) == "000001" Then Return True
		
	Return False
EndFunc


Таким образом мы проверяем пиксель, если он тот что нужен - выполняем действие. После чего мы проверяем другой пиксель (это уже _check_cargo)... Таким образом перед каждым действием мы делаем проверку "нужно ли нам что то делать". При этом нам обсолютно до звезды сколько будет длится действие action_1 или action_2, потому что у нас есть проверки перед ними.


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

Плюс к этому накладывается небольшая логика "что где лежит". Т.е. если правильно всё написать и расписать зарание. То при каком либо изменении игрового интерфейса тебе достаточно просто изменить координаты в соотв. функции. А не рытся в том (простите) говне в виде стенки из PixelGetColor()...
 
Верх