Author Topic: Нужна помощь в написании цикла с поиском картинок  (Read 14109 times)

0 Members and 4 Guests are viewing this topic.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Профессионалы. Помогите в общих чертах со скриптом.
Есть много мелких блоков, отдельно они работают. А вот как их собрать в один большой скрип?!
Есть задания которые надо выполнить 1 раз за день (но есть задания только утром, есть только вечером), не которые 2-3 раза в день.
можно ли сделать так:
1-ый поток - все что надо выполнить 1 раз, выполнился 1 раз и закончился
2-ой поток - следит за рекламой, ошибками связи, и прочими редкими окнами и как там внутри организовать проверки этих событий? зациклить поиск 2-3 картинок?
3-ий потом - можно сделать, чтоб он стартовал по времени и работал к примеру с 12 до 13
а как сделать повтор тех заданий, которые повторяются 2-3 раза, но на их выполнения требуется время, т.е. их выполнение разнесено по времени.

И в дополнение: если все это надо выполнить для 2-3 разных учеток, как можно организовать?
Да что же вы все потоки лепите куда надо и куда не надо. То привязку лепили, теперь потоки ещё :-\
Потоки нужны для распараллеливания задач, их одновременного выполнения.
Для выделения куска кода использующегося несколько раз - существуют подпрограммы.

В твоём случае потоки нужны только для указанного тобой "2-ой поток".
Остальные действия выделяем в свои подпрограммы.
В основном скрипте будет такой себе шедулер, который крутится в цикле и в зависимости от времени и прочего запускает ту или иную подпрограмму.

Т.к. всё абстрактно, покажу пример из одного моего скрипта

Code: (clickermann) [Select]
// Здесь запускаем то, что нужно выполнить 1 раз в начале
// первый старт
IF($first_start = 1)
   // запуск копателя
   IF($digger = 1)
      IF($run_main = 1)
         reload()
         digger()
         reload()
      END_IF
   END_IF
   
   IF(($akk_main = 1) & ($run_main = 0)) // основной
      main()
      WAIT(15)
   END_IF
   IF($akk_bill = 1) // bill
      bill()
      WAIT(7)
   END_IF
   IF($akk_fake = 1) // fake
      fayk()
      WAIT(7)
   END_IF
END_IF

// --- основной цикл ---
$time_start = $_ms
$time_reload = $_ms + 1800000
$loop_all = 0
WHILE($loop_all = 0)
   // перезапуск
   IF(($time_reload < $_ms) & ($run_main = 1) & ($run_bill = 0) & ($run_fake = 0))
      reload()
      $time_reload = $_ms + 1800000
   END_IF
   
   // сброс привязки таймера
   IF(($run_ontime = 1) & ($_time_h = 1) & ($_time_m > 6))
      $run_ontime = 0
   END_IF
   IF(($run_ontime = 1) & ($_time_h = 4) & ($_time_m > 6))
      $run_ontime = 0
   END_IF
   IF(($run_ontime = 1) & ($_time_h = 9) & ($_time_m > 6))
      $run_ontime = 0
   END_IF
   IF(($run_ontime = 1) & ($_time_h = 12) & ($_time_m > 6))
      $run_ontime = 0
   END_IF
   IF(($run_ontime = 1) & ($_time_h = 16) & ($_time_m > 6))
      $run_ontime = 0
   END_IF
   IF(($run_ontime = 1) & ($_time_h = 20) & ($_time_m > 6))
      $run_ontime = 0
   END_IF
   
   // запуск копателя
   IF($digger = 1)
      IF($run_main = 1)
         reload()
         digger()
         reload()
         $time_reload = $_ms + 1800000
      END_IF
   END_IF
   
   // запуск основного
   IF(($akk_main = 1) & ($run_main = 0))
      main()
   END_IF
   
   // Запускаем в 01:00
   IF(($run_ontime = 0) & ($_time_h = 1) & ($_time_m < 5))
      $run_ontime = 1
      IF(($akk_bill = 1) & ($run_bill = 0)) // bill
         bill()
      END_IF
     
      IF(($akk_fake = 1) & ($run_fake = 0)) // fake
         fayk()
      END_IF
   END_IF
   
   // Запускаем в 05:00
   IF(($run_ontime = 0) & ($_time_h = 5) & ($_time_m < 5))
      $run_ontime = 1
      IF(($akk_bill = 1) & ($run_bill = 0)) // bill
         bill()
      END_IF
     
      IF(($akk_fake = 1) & ($run_fake = 0)) // fake
         fayk()
      END_IF
   END_IF
   
   // Запускаем в 09:00
   IF(($run_ontime = 0) & ($_time_h = 9) & ($_time_m < 5))
      $run_ontime = 1
      IF(($akk_bill = 1) & ($run_bill = 0)) // bill
         bill()
      END_IF
     
      IF(($akk_fake = 1) & ($run_fake = 0)) // fake
         fayk()
      END_IF
   END_IF
   
   // Запускаем в 12:00
   IF(($run_ontime = 0) & ($_time_h = 12) & ($_time_m < 5))
      $run_ontime = 1
      IF(($akk_bill = 1) & ($run_bill = 0)) // bill
         bill()
      END_IF
     
      IF(($akk_fake = 1) & ($run_fake = 0)) // fake
         fayk()
      END_IF
   END_IF
   
   // Запускаем в 16:00
   IF(($run_ontime = 0) & ($_time_h = 16) & ($_time_m < 5))
      $run_ontime = 1
      IF(($akk_bill = 1) & ($run_bill = 0)) // bill
         bill()
      END_IF
     
      IF(($akk_fake = 1) & ($run_fake = 0)) // fake
         fayk()
      END_IF
   END_IF
   
   // Запускаем в 20:00
   IF(($run_ontime = 0) & ($_time_h = 20) & ($_time_m < 5))
      $run_ontime = 1
      IF(($akk_bill = 1) & ($run_bill = 0)) // bill
         bill()
      END_IF
     
      IF(($akk_fake = 1) & ($run_fake = 0)) // fake
         fayk()
      END_IF
   END_IF
   
   WAIT(60)
END_CYC
HALT

Здесь при запуске запускаем main() и через небольшую задержку, параллельно ему,  запускаем последовательно bill() и fayk().
Подпрограмма main() запускается в начале и работает всегда.
Раз в 30 минут запускается его принудительная перезагрузка reload() точнее убийство и происходит перезапуск main()
При запуске 1 раз сразу (в любое время) и по расписанию в 1, 5, 9, 12, 16, 20 часов запускаются последовательно
bill() и fayk()

Во время работы, если запущены и работают  bill() или fayk() перезагрузка reload() не срабатывает. Иначе вместе с мэйном убъёт только начавшиеся и не отработанные bill() или fayk()
« Last Edit: February 19, 2015, 11:55:33 AM by Vint »


Andrey_13

  • Освоившийся
  • **
  • Posts: 28
    • View Profile
Я только всему учусь, в программировании вообще не силен  :( , делаю для себя бот, чтобы не делать очень много однотипных действий. попозже напишу, что хочу от бота, чтобы было понятнее

Andrey_13

  • Освоившийся
  • **
  • Posts: 28
    • View Profile
есть игра Легенды Галактики. надо много занудных действий делать каждый день.
в 0-00 по серверу (в 3-0 по Москве) происходит перегрузка сервера и надо сначала выполнять по кругу задания.
Работа скрипта должна начаться в 2-50, чтобы до перегрузки сервера истратить снабжение (ходы).

1. запустить БлюСтакс
2. запустить игру
3. выбор персонажа (есть три аккаунта, надо по очереди зайти ко всем по очереди (сокланы отдали погонять)) (пока не знаю как подступиться)

4. при входе бывает "рекламное окно", бывает получить "приз за вход" (есть призы, которые дают вот таким способом: зашел в игру, через 15 мин загорается ! знак, заходишь туда, берешь приз, запускается таймер для другого, и так время постоянно растет, т.е. типа так 15мин, 30, 1час, 1,5 часа)

5. зайти в Альянс: (это обязательно сделать первым делом, так как после этого убыстряется прокачка персонажей)
внутри вкладки альянс есть еще три вкладки, в которые надо зайти, нажать на кнопки и выйти опять в альянс, зайти во вторую, и так далее. выполняется 1 раз
5.1 внести пожертвования (тут хитрость такая, у разных аккаунтах разные пожертвования, не совсем соображу как это сделать, типа имя А - то жми сюда, если имя Б - то жми туда?
5.2 отправить экспедицию (тут если ты последний в очереди, то будет небольшой ролик, который нельзя пропустить, надо подождать и потом выйти)
5.3 позвать союзников (тут все просто)

6 вход в лабораторию.
внутри тоже не сколько окошек в которые надо зайти
6.1 рулетка (1 раз) (тут просто)
6.2 добыча (3 раза) (на добычу тратится от 40 мин до 1,5 часа) (надо выбрать руду, где больше денег, различаются по цвету)
6.3 грабеж (4 раза) (грабить можно через 5 мин, но своих грабить нельзя, желательно чужой альянс, но тех, кто по зубам (по общей мощности флота) (думаю пока пропустить данный шаг) и при грабеже надо искать более дорогие источники, отличаются по цвету)
6.4 боевая тренировка (1 раз)

Code: (clickermann) [Select]
WAITMS(500)
LOGWRITE("начало боевой подготовки")
GETSCREEN
COLORMODE(8)
SCREENSHOT
IF_PICTURE_IN (0,0, 1100,600, "textures\batl_tren.bmp", -1, 90)
   LOGWRITE("изображение batl_tren найдено")
   LOGWRITE("x: ", $_return1," y: ", $_return2)
   LCLICK($_return1+50, $_return2-10)
   WAIT(8) //         зашли в подготовку
   // есть 5 целей, которые надо уничтожить, но вторая цель появляется после уничтожения первой
   FOR ($i=0, $i<6)
      GETSCREEN
      COLORMODE(8)
      IF_PICTURE_IN (0,0, $_xmax,$_ymax, "textures\target4.bmp", -1, 85)
         LOGWRITE("изображение target найдено")
         LOGWRITE("x: ", $_return1," y: ", $_return2)
         LCLICK($_return1-83, $_return2) // нажимает на корабли
         WAIT(7) //зашли в Инфо Противника
         // надо нажать на кнопку
         GETSCREEN
         COLORMODE(8)
         IF_PICTURE_IN (0,0, $_xmax,$_ymax, "textures\sragenie.bmp", -1, 80)
            LOGWRITE("изображение sragenie найдено")
            LOGWRITE("x: ", $_return1," y: ", $_return2)
            LCLICK($_return1, $_return2) // нажимает на кнопку сражение
            WAIT(10) //зашли в  расстановку флота
            GETSCREEN
            COLORMODE(8)
            IF_PICTURE_IN (0,0, $_xmax,$_ymax, "textures\sragenie_2ur.bmp", -1, 90)
               LOGWRITE("изображение sragenie_2ur найдено")
               LOGWRITE("x: ", $_return1," y: ", $_return2)
               LCLICK($_return1, $_return2) //  вступаем в бой
               WAIT(50) // идет бой
               // должна быть проверка
               // если Выграли - идем дальше
               // если проиграл - оставновка и выход
               // пока без проверки, идем дальше
               GETSCREEN
               COLORMODE(8)
               IF_PICTURE_IN (0,0, $_xmax,$_ymax, "textures\2strelki-2.bmp", -1, 82)
                  LOGWRITE("изображение 2strelki найдено")
                  LOGWRITE("x: ", $_return1," y: ", $_return2)
                  LCLICK($_return1, $_return2) //  вышли из просмотра результатов
                  // там где 5 целей
                  WAIT(5)
               ELSE
                  LOGWRITE("изображение 2strelki НЕнайдено")
               END_IF
            ELSE
               LOGWRITE("изображение sragenie_2ur НЕнайдено")
            END_IF
         ELSE
            LOGWRITE("изображение sragenie НЕнайдено")
         END_IF
      ELSE
         LOGWRITE("изображение target НЕнайдено")
         $i = 10
      END_IF
   END_CYC
ELSE
   LOGWRITE("изображение batl_tren НЕнайдено")
END_IF

LOGWRITE(" конец боевой подготовки")

WAIT(5)
HALT

7. зарядить Портал
Code: (clickermann) [Select]
GETSCREEN
   COLORMODE(8)
   IF_PICTURE_IN (0,0, 1100,600, "textures\CITADEL-2.bmp", -1, 90)
      LOGWRITE("изображение Цитадель найдено")
      LOGWRITE("x: ", $_return1," y: ", $_return2)
      $sav_X = $_return1
      $sav_Y = $_return2
      LCLICK($sav_X+230, $sav_Y-56)
      WAIT(3)
      LCLICK($sav_X+230, $sav_Y+317)
      WAIT(3)
      LCLICK($sav_X-142, $sav_Y-93)
      WAIT(3)
      LCLICK($sav_X+512, $sav_Y+177)
      WAIT(3)
      LCLICK($sav_X+512, $sav_Y+177)
      WAIT(3)
      LCLICK($sav_X+177, $sav_Y+350)
      WAIT(6)
      LCLICK($sav_X+57, $sav_Y+363)
      WAIT(3)
      LCLICK($sav_X+609, $sav_Y-118) //выход
   else
      LOGWRITE("изображение Цитадель НЕнайдено")
   end_IF

8. получить галактонит (тут росто)
9. зайти в хоз центр (тут просто)

10. зайти на арену
10.1 забрать приз (тут просто)
10.2 кого-то стукнуть (для разных акков по разному, пока не буду делать)

11. собрать деньги в Цитадели (ресурсы восстанавливаются, поэтому лучше заходить через 6-8 часов) (сам сбор сделал, надо сделать чтоб с периодичностью заходил)
12. истратить снабжение (сложная задача, часть сделал, пока не стабильно работает), снабжение копится 20 ходов (это максимум) за 10 часов.

13. бой с Праймусом (большой корабль, БОсс, начинается в 18-00, но надо зайти пораньше, сделать подготовку, бой идет максимум до 18-30).

14. в конце дня еще один блок, это сбор наград, за выполнения заданий
/

Code: (clickermann) [Select]
sub(sbor_prizov)
/== подпрограмма сбор наград в ежедневнике ==//   
GETSCREEN
   COLORMODE(8)
   IF_PICTURE_IN (0,0, 1100,600, "textures\NAGRADA-2.bmp", -1, 90)
      LOGWRITE("изображение награда найдено")
      LOGWRITE("x: ", $_return1," y: ", $_return2)
      LCLICK($_return1+10, $_return2)
      WAIT(5)
   ELSE
      LOGWRITE("изображение награда НЕнайдено")
   END_IF
   WAIT(1)
   
   FOR ($i=0, $i<7)
      GETSCREEN
      COLORMODE(8)
      IF_PICTURE_IN (0, 0, 1100, 700, "textures\POLUCHIT-4.bmp", -1, 80)
         LOGWRITE("изображение ПОЛУЧИТЬ найдено")
         LOGWRITE("x: ", $_return1," y: ", $_return2)
         LCLICK($_return1, $_return2)
         WAIT(6)
      ELSE
         LOGWRITE("изображение ПОЛУЧИТЬ НЕнайдено")
         $i = 10
      END_IF
   END_CYC
end_sub

//сама программа
GETSCREEN
COLORMODE(8)

IF_PICTURE_IN (0,0, 1100,600, "textures\LISTOK-2.bmp", -1, 90) //
   LOGWRITE("изображение Листок найдено")
   LOGWRITE("x: ", $_return1," y: ", $_return2)
   LCLICK($_return1+10, $_return2+10)
   WAIT(5)
ELSE
   LOGWRITE("изображение Листок НЕнайдено")
END_IF

//== попадаем на вкладку Бизнес

sbor_prizov()

//== надо попасть на вкладку ФЛОТ

GETSCREEN
COLORMODE(8)

IF_PICTURE_IN (0,0, $_xmax,$_ymax, "textures\FLOT-2.bmp", -1, 90)
   LOGWRITE("изображение ФЛОТ найдено")
   LOGWRITE("x: ", $_return1," y: ", $_return2)
   LCLICK($_return1, $_return2)
   WAIT(3)
ELSE
   LOGWRITE("изображение ФЛОТ НЕнайдено")
END_IF

// попадаем на вкладку ФЛОТ

sbor_prizov()

//== надо попасть на вкладку ОПЫТ

GETSCREEN
COLORMODE(8)

IF_PICTURE_IN (0,0, $_xmax,$_ymax, "textures\OPIT-2.bmp", -1, 90)
   LOGWRITE("изображение ОПЫТ найдено")
   LOGWRITE("x: ", $_return1," y: ", $_return2)
   LCLICK($_return1, $_return2)
   WAIT(3)
ELSE
   LOGWRITE("изображение ОПЫТ НЕнайдено")
END_IF

// попадаем на вкладку ОПЫТ

sbor_prizov()


Вот что хочется от бота. Вынес на обозрения пару блоков, самых больших, остальные меньше.
Так как игра очень "цветная" делаю  колормод8. ищу базовую точку, от нее идет отсчет координат, а так же идет поиск кнопок, куда надо нажать. Если надо скрины то завтра могу их приложить, для полного понятия.
Помогите со структурой скрипта, так как по примеру, приведенному Vint я не пойму. Ну и может еще можно оптимизировать и улучшить код.

Andrey_13

  • Освоившийся
  • **
  • Posts: 28
    • View Profile
старт и работа по времени лежат на форуме.
я много тем посмотрел, но пока не играл эти игры то не совсем понятен алгоритм, так же как и я сейчас Вас прошу.
Если один игрок, то я вроде бы понял как делать, но мне надо, чтобы было переключение между тремя (5-7) акаунтов, хотя бы 1 раз чтобы прошелся по всем.

Andrey_13

  • Освоившийся
  • **
  • Posts: 28
    • View Profile
Добрый день, Vint.
Не совсем понял Вас.
В игре нельзя одновременно играть двумя игроками. Тут получается, что надо зайти игроком А, выполнить часть действий, выйти, зайти игроком В, выполнить часть действий, выйти, зайти игроком С, выполнить часть действий, выйти, потом через 15 минут опять зайти А, выполнить задание, выйти, зайти В, выполнить задание, выйти, зайти С, выполнить задание.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Значит нужно выходить и заходить.
Создать список аккаунтов иходить по нему. Хочешь по кругу, хочешь выборочно.
Пишешь подпрограмму перелогинивающую на следующего игрока и где нужно вызываешь.


Andrey_13

  • Освоившийся
  • **
  • Posts: 28
    • View Profile
Доброй ночи.
Встретился со странной ошибкой или глюком.
Вот кусочек скрипта.
Code: (clickermann) [Select]
GETSCREEN
COLORMODE(8)
SCREENSHOT
IF_PICTURE_IN (0,0, 1100,600, "textures\batl_tren.bmp", -1, 90)
   LOGWRITE("изображение batl_tren найдено")
   LOGWRITE("x: ", $_return1," y: ", $_return2)
   LCLICK($_return1+50, $_return2-10)
 
У меня работает нормально. Все находит, на все кнопки жмет.

Принес все знакомому, пробую - пишет, что изображение не найдено и самое странное, что командой SCREENSHOT создаются совершенно чисто белые скрины. А если включить Лупу и посмотреть, то в окошечке видно увеличенное изображение.

Andrey_13

  • Освоившийся
  • **
  • Posts: 28
    • View Profile
Я знаю, что колормод8 это черно-белое изображение, но почему-то скрины получаются как просто белый лист. Все текстуры естественно перенес. Просто колормод работат, получаются полноцветные скрины.
а могут какие-то настройки экрана, видеокарты или еще чего-то так повлиять?!
« Last Edit: March 13, 2015, 10:24:10 AM by Andrey_13 »

123

  • Освоившийся
  • **
  • Posts: 31
    • View Profile
А можно сделать поиск в заданной области всех картинок с любыми именами из определённой папки?

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
А можно сделать поиск в заданной области всех картинок с любыми именами из определённой папки?
Лень двигатель прогресса.

Можно. Но оно тебе точно нужно?
неужели тяжело имена подготовить. Подсказать пакетный переименователь?

Если только ради спортивного интереса... Создаешь бат файл который будет формировать в текстовый файл список из имен файлов в каталоге. Скрипт вызывает этот батник, и в цикле ищет картинки по считанным именам.

Тебе нужны сразу все  результаты по всем картинкам в одном массиве?
Или поиск до первого совпадения?
« Last Edit: April 07, 2015, 10:43:49 PM by Vint »


123

  • Освоившийся
  • **
  • Posts: 31
    • View Profile
Интересно, как делается такой поиск. Это на случай, если картинки будут нестабильно распознаваться по образцам, а уменьшение процента совпадения пикселей опять же с некоторого значения вызовет неточности и количество образцов придётся увеличивать, причём, постепенно, в процессе испытаний. Чтобы можно было накидать их в одну папку и не заморачиваться с написанием имени каждого файла образца в тексте программы.
С бат файлами никогда не приходилось возиться, и такое для меня вообще тёмный лес.  :(
До первого совпадения. А если ни одного не будет - в логе надпись об этом и создание скриншота, чтобы вырезать с него ещё один образец и сохранить к остальным в папку.

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Вот тебе пример.

Code: (clickermann) [Select]
// картинки находятся в папке Текстуры рядом со скриптом.
// формат
// "Текстуры\Image_1.bmp"
// "Текстуры\Image_2.bmp"
// ...
// "Текстуры\Image_10.bmp"

$count = 10 // количество картинок

GETSCREEN
FOR($num=1,$num<$count+1) // Ищем картинки от начала до конца
   IF_PICTURE_IN(0,0, $_xmax,$_ymax, STRCONCAT("Текстуры\Image_",$num,".bmp"), -1, 100)
      LCLICK($_return1+1, $_return2+1)
      WAITMS(100)
      $num = 9999 // прерываем цикл если есть совпадение
   END_IF
END_CYC

HALT

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Вот на... если не хочешь переименовывать и считать файлы.

Code: (clickermann) [Select]
$pref = "Текстуры\" // префикс отдельной папки с картинками"
$cmd = STRCONCAT($pref,"cmd.bat")
$dir = STRCONCAT($pref,"dir.txt")

TFWRITE($cmd, "chcp 1251>nul")
TFWRITE($cmd, STRCONCAT("cd ", $pref))
TFWRITE($cmd, "dir *.bmp /b /on >dir.txt")
TFWRITE($cmd, "del /F /S cmd.bat")
EXECUTE($cmd)
WAIT(1)

GETSCREEN
FOR($i=0, $i < TFCOUNT($dir))
   $name = TFREAD($dir, $i+1)   
   IF_PICTURE_IN(0,0, $_xmax,$_ymax, STRCONCAT($pref,$name))
      LOGWRITE ("Найдена картинка:  ", $name)
      MOVE($_return1, $_return2)
      WAITMS(10)
      $i = 9999 // прерываем цикл если есть совпадение
   END_IF
END_CYC

IF($i ! 10000)
   LOGWRITE ("Ничего не найдено")
   //SCREENSHOTEX(100,100, 150,150, "Image_", 0)
END_IF
HALT

Немножко всё усложнилось из-за имён на русском. Если только англ. - создание списка проще. И если картинки не в отдельной папке, а в папке скрипта - ещё упростится.
пример:
Code: (clickermann) [Select]
// вариант попроще, если без папки и только Английский
EXECUTE("cmd.exe", STRCONCAT(" /C dir *.bmp /b /on >dir.txt"))
WAIT(1)

GETSCREEN
FOR($i=0, $i < TFCOUNT("dir.txt"))
   $name = TFREAD("dir.txt", $i+1)   
   IF_PICTURE_IN(0,0, $_xmax,$_ymax, $name)
      LOGWRITE ("Найдена картинка:  ", $name)
      MOVE($_return1, $_return2)
      WAITMS(10)
      $i = 9999 // прерываем цикл если есть совпадение
   END_IF
END_CYC

IF($i ! 10000)
   LOGWRITE ("Ничего не найдено")
   //SCREENSHOTEX(100,100, 150,150, "Image_", 0)
END_IF
HALT


123

  • Освоившийся
  • **
  • Posts: 31
    • View Profile
Спасибо за исчерпывающие ответы. Получаются удобные програмки для помощи при создании образцов для поиска, когда всё сложно с изображениями. А после получения его нормальной работы они же с небольшими изменениями могут использоваться, как блоки и большая часть программы для поиска изображений с последующими разными действиями, в зависимости от того, какая из картинок или их комбинация найдена. Halt останавливает работу всей программы, где бы он ни находился и куда бы ни был вложен? А если надо сначала определиться с параметром №1, перебрав кучу картинок №1 до совпадения и присвоить переменной параметра №1 значение, в зависимости от того, какая из картинок нашлась (среди них есть как бы несколько групп, обозначающих разное, а внутри групп похожие картинки, обозначающие одно и тоже), потом остановить перебор и перейти к перебору кучи картинок №2 для определения параметра №2 до совпадения и присвоить переменной параметра №2 значение, в зависимости от того, какая из картинок нашлась, потом остановить перебор и CASEом из комбинации значений переменных параметров №1 и №2 выбрать дальнейшие действия и сделать их. Тут с помощью GOTO оптимально "прыгать" от первого досрочно завершённого перебора ко второму и от второго дальше?

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Не нужно никуда досрочно прыгать по GOTO. Нужно просто прервать перебор и завершить штатно.

Halt останавливает работу всей программы, где бы он ни находился и куда бы ни был вложен

Да. Если если он выполнился.

потом остановить перебор и CASEом из комбинации значений переменных параметров №1 и №2 выбрать дальнейшие действия ...

CASE, точнее SWITCH, для этого не подойдёт, нужно использовать группы условий.
« Last Edit: April 09, 2015, 11:31:18 AM by Vint »