1 (изменено: alalivanovivanov, 2022-04-29 01:24:51)

Тема: AHK: Как остановить цикл в нужный момент

Здравствуйте! Скрипт ищет несколько вариантов пикселей и когда находит совершает разные действия. Нужно, чтобы цикл остановился после того, как нашел нужные пиксели заданное количество раз. То есть остановить цикл после семи успешных попыток поиска.

Пробовал много разных вариантов, но безуспешно. Голова уже кипит и нервы на пределе, но хочу разобраться.



!9::
Loop
{
   PixelGetColor, check, 365, 254
   if(check = 0x000000)
   { 
        PixelGetColor, k_one, 245, 345  
        PixelGetColor, k_two, 659, 517
        if (k_one = 0xFFFFFF, k_two = 0xFFFFFF) 
        {
            loop, 2
            {
            MsgBox привет
            }
            sleep 200
            MsgBox снова привет
            sleep 350
        } 

        PixelGetColor, j_one, 359, 852
        PixelGetColor, j_two, 654, 357
        if (j_one = 0xFFFFFF, j_two = 0xFFFFFF) 
        {
            loop, 2
            {
            MsgBox здравствуйте
            }
            sleep 200
            MsgBox снова здравствуйте
            sleep 350
        }   
   }   
}
Return

2

Re: AHK: Как остановить цикл в нужный момент

alalivanovivanov, добро пожаловать на форум! Ознакомьтесь, пожалуйста, с Правилами, отредактируйте свой пост. Обратите внимание на оформление кода.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3 (изменено: alalivanovivanov, 2022-04-29 01:15:26)

Re: AHK: Как остановить цикл в нужный момент

.

4

Re: AHK: Как остановить цикл в нужный момент

alalivanovivanov пишет:

На оформление кода обратил внимание, но ничего не заметил

Читайте внимательнее, там есть ссылка на теги.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5 (изменено: alalivanovivanov, 2022-04-29 01:15:38)

Re: AHK: Как остановить цикл в нужный момент

.

6

Re: AHK: Как остановить цикл в нужный момент

Если не можете разобраться в оформлении постов, этот форум, скорее всего, не для вас, сожалею.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7 (изменено: alalivanovivanov, 2022-04-29 01:27:05)

Re: AHK: Как остановить цикл в нужный момент

С оформлением постов разобрался). Можете помочь по моей теме?

8

Re: AHK: Как остановить цикл в нужный момент

alalivanovivanov пишет:

С оформлением постов разобрался

Поздравляю, но не нужно было удалять другие посты, на которые было отвечено.

alalivanovivanov пишет:

Голова уже кипит и нервы на пределе, но хочу разобраться

Честно говоря, вы не были близки к решению. Во-первых, такие выражения

if (k_one = 0xFFFFFF, k_two = 0xFFFFFF)

в AHK не поддерживаются, нужно

if (k_one = 0xFFFFFF and k_two = 0xFFFFFF)

или

if (k_one = 0xFFFFFF && k_two = 0xFFFFFF)

Кроме того вообще не факт, что ищутся нужные пиксели, смотрите команду CoordMode.
Если я правильно понял задачу, нужно что-то вроде этого:

!9::
count := 0
Loop
{
   found := true
   PixelGetColor, check, 365, 254
   if(check = 0x000000)
   { 
        PixelGetColor, k_one, 245, 345  
        PixelGetColor, k_two, 659, 517
        if (k_one = 0xFFFFFF && k_two = 0xFFFFFF) 
        {
            loop, 2
            {
            MsgBox привет
            }
            sleep 200
            MsgBox снова привет
            sleep 350
        }
        else {
            found := false
        }
        PixelGetColor, j_one, 359, 852
        PixelGetColor, j_two, 654, 357
        if (j_one = 0xFFFFFF && j_two = 0xFFFFFF) 
        {
            loop, 2
            {
            MsgBox здравствуйте
            }
            sleep 200
            MsgBox снова здравствуйте
            sleep 350
        }
        else {
            found := false
        }
   }
   else {
      found := false
   }
   if found
      count++
} until count = 7
Return
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

9

Re: AHK: Как остановить цикл в нужный момент

Задачу вы поняли правильно. Код красивый, но работает также как и мой. Ищет пиксели без остановки.

10

Re: AHK: Как остановить цикл в нужный момент

Не могу сказать в чём проблема, технически ошибок вроде нет.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

11

Re: AHK: Как остановить цикл в нужный момент

Может здесь:

until count = 7

.. лучше использовать "=="?

Win10: LTSC (21H2); AHK: ANSI (v1.1.36.02)

12

Re: AHK: Как остановить цикл в нужный момент

Нет, при сравнении чисел эти операторы равнозначны. Оператор == используется при сравнении строк, чтобы оно было регистрозависимым.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

13

Re: AHK: Как остановить цикл в нужный момент

Просто я никогда не использовал "=" в условиях, ибо привычка с JS, что это присваивание. Буду знать.

Win10: LTSC (21H2); AHK: ANSI (v1.1.36.02)

14

Re: AHK: Как остановить цикл в нужный момент

Может все дело во флаге "found" попробуй без него.

!9::
count := 0
Loop
{
  PixelGetColor, check, 365, 254
  if(check = 0x000000)
  { 
    PixelGetColor, k_one, 245, 345  
    PixelGetColor, k_two, 659, 517
    if (k_one = 0xFFFFFF && k_two = 0xFFFFFF) 
    {
        loop, 2
        {
        MsgBox привет
        }
        sleep 200
        MsgBox снова привет
        sleep 350
        count++
    }
    PixelGetColor, j_one, 359, 852
    PixelGetColor, j_two, 654, 357
    if (j_one = 0xFFFFFF && j_two = 0xFFFFFF) 
    {
        loop, 2
        {
        MsgBox здравствуйте
        }
        sleep 200
        MsgBox снова здравствуйте
        sleep 350
        count++
    }
  }
} until count = 7
Return
Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

15

Re: AHK: Как остановить цикл в нужный момент

Видимо дело не во флаге "found" без него тоже самое.  Решил поколдовать над тем, что мне предложили. И вот что получилось.


!9::
count := 0
Loop
{
   found := true
   PixelGetColor, check, 365, 254
   if(check = 0x000000)
   { 
        PixelGetColor, k_one, 245, 345  
        PixelGetColor, k_two, 659, 517
        if (k_one = 0xFFFFFF && k_two = 0xFFFFFF) 
        {
            loop, 2
            {
            MsgBox привет
            }
            sleep 200
            MsgBox снова привет
            sleep 350
        }
        else {
            found := false
        }
        PixelGetColor, j_one, 359, 852
        PixelGetColor, j_two, 654, 357
        if (j_one = 0xFFFFFF && j_two = 0xFFFFFF) 
        {
            loop, 2
            {
            MsgBox здравствуйте
            }
            sleep 200
            MsgBox снова здравствуйте
            sleep 350
        }
        
   }
   else {
      found := false
   }
   if found
      count++
} until count = 7
Return

Я убрал из кода  "else {
                           found := false
                                             }"
В таком виде скрипт останавливается когда нужно, если находит пиксели K. Но вот пиксели j находит без остановки.
Чувствую истина где-то рядом.

16 (изменено: pixel75, 2022-08-07 20:29:30)

Re: AHK: Как остановить цикл в нужный момент

Понимаю, что реализация выглядит крайне дремуче и вызывает, как минимум, снисходительную улыбку с морщинками вдоль прищуренных глаз профессионалов, потому прошу не судить строго, ибо забыл я об AHK на годы, но с дня сегодняшнего пытаюсь вспоминать хоть что то. Надеюсь, хотелку я интерпретировал верно в той части, что скрипт после 7 удачных попыток нахождения цвета, должен становиться просто на паузу. Наверное в разы аскетичнее и изящнее сей плод спутанного сознания выглядел бы с использованием массива с перечислением цветов внутри, избавления от кенгуриных прыжков с помощью сатанинского Goto, но напомню, это мой первый Буратино после разлуки с AHK и вспоминать о правилах Break, азы выхода из цикла по условию, пока тяжеловато мимоходом из сиюминутного желания помочь. Всё, бездарь оправдался! ).

+ открыть спойлер
!9::
c := 0
count := 0

Loop
{
	ST:
	while count <= 7
	{
		c = 0
		PixelGetColor, check, 365, 254
		if(check = 0x000000)
		{ 
			PixelGetColor, k_one, 245, 345  
			PixelGetColor, k_two, 659, 517
			if (k_one = 0xFFFFFF && k_two = 0xFFFFFF) 
			{
				loop, 2
				{
					MsgBox привет
				}
				Sleep 200
				MsgBox снова привет
				Sleep 350
				c++
				Goto, EXT
			}
			
			PixelGetColor, j_one, 359, 852
			PixelGetColor, j_two, 654, 357
			if (j_one = 0xFFFFFF && j_two = 0xFFFFFF) 
			{
				loop, 2
				{
					MsgBox здравствуйте
				}
				Sleep 200
				MsgBox снова здравствуйте
				Sleep 350
				c++
				Goto, EXT				
			}

		}
		Sleep, 10
	}

	if count > 7
	{
		Tooltip, цикл поиска окончен
		Sleep 1000
		Tooltip
		count = 0
		pause
	}
	
	EXT:
	if c > 0
	{
		count++
		Goto, ST
	}
} 
Return

17

Re: AHK: Как остановить цикл в нужный момент

pixel75, оформите, пожалуйста, код, как положено.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder