Author Topic: Три в ряд  (Read 23408 times)

0 Members and 1 Guest are viewing this topic.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Три в ряд
« on: February 11, 2014, 11:41:35 AM »
Основа для автоматизации игр типа "три в ряд".
 "Сокровища Мантесумы", бой в "Небеса" и т.п.


вопрос возникал здесь http://crapware.aidf.org/forum/index.php?topic=359.0
и ВКонтакте http://vk.com/topic-14410794_29283841

Захотелось решить хотя бы основы. Базис для подобных игр.

Скрипт писался для версии Clickermann v4.9 004
Пробовал и отлаживал на Небеса-х.
Скрипт ищет и выстраивает элементы в комбинации. Проходит последовательно по каждому рисунку и определяет возможный ход. По нахождению определяется "вес" хода - сколько фишек совпало. Вес "сквозной" через все изображения, т.е. итоговый ход будет по элементу с большим весом и встретившийся раньше.
Возможно применение общего COLORMODE и % совпадения для каждого.

Оптимизации:
  • один GETSCREEN,
  • при нахождении большего веса, варианты с меньшим уже не анализируются,
  • поиск начинается с большего веса, чтобы отбросить возможно ненужный поиск меньшего,
  • при предварительном отборе вариантов хода, во избежании повторений и заходов в одну комбинацию с разных сторон, отобрал только необходимые и сделал основной поиск парной клетки только вправо-вниз (за исключением 2-х трёшек которые ищутся отдельно),
  • в переменные не определяются элементы за краем поля.

Как работает:
  • Если нужно, определяем положение поля.
  • Делаем скрин, если необходимо применяем COLORMODE.
  • По очереди обрабатываем все типы элементов (цвета):
    • Производим поиск в массив всех элементов данного типа.
    • Определяем в какую клетку попадает каждый найденный элемент и формируем псевдо-двумерный массив-карту для элемента. (остановился на этом варианте, т.к. удобнее задавать возможные комбинации, вычислять ход и в дальнейшем масштабировать решения)
    • Обходим по очереди все занятые места на поле-карте и в каждой ищем возможные варианты комбинаций. При этом переходим на "локальные" координаты-смещения относительно главной сканируемой клетки.
    • Если находим записываем в глобальные переменные значения "массы" и хода (пересчитанное в глобальное смещение
  • Пересчитываем глобальные смещения хода в конкретные координаты
  • Делаем ход.

Зачем заносил поля вокруг главной анализируемой клетки в переменные когда они и так в переменных массива? Чтобы не пересчитывать необходимый индекс массива для каждого опорного случая. Попробовал сразу на прямую, но после написания проверочных условий на 2 самых простейших комбинации из 3 элементов код выглядел жутко и уже начал немного путаться. Испугавшись того, что будет дальше, решил ввести дополнительные лишние действия для упрощения восприятия. И редактировать/дополнять будет намного проще.
Код модульный разбил на подпрограммы.

Болванку кода можно дописывать под конкретную игру с её особенностями и желание выбора приоритетов в очерёдности ходов. Для мантесумы можно ввести на поле универсальные элементы, которые подходят всем цветам или не подходят никому. Можно отдать предпочтение ходам подряд одного цвета и т.д.

Сам код:
Code: (clickermann) [Select]
#name "Три в ряд"
// Author: Vint
// Version: 0.4 (09.02.2014)
// For Clickermann v4.9 004

//===== ОПЦИИ ==========================//
//////////////////////////////////////////

// выводить окно лога  (1 - Выводить, 0 - Не выводить)
$log = 0

// Размер поля
$max_X = 6
$max_Y = 6

// Размер ячейки
$step = 41

// Координаты левого верхнего угла (или находить потом)
$startcoord_X = 518
$startcoord_Y = 413

// Имена картинок участников
$bmp_1 = "skull.bmp"
$bmp_2 = "kross.bmp"
$bmp_3 = "red.bmp"
$bmp_4 = "green.bmp"
$bmp_5 = "yellow.bmp"

// Префикс. Папка с картинками
$prefix = "textures\"
$colormode = 0        // режим колормода

// " строка для правильного отображения на форуме. Убрать!
//////////////////////////////////////////


// автоопределение ЛВУ в игре
//MOVE($_xmax, $_ymax)
//WAITMS(30)
//GETSCREEN
//IF_PICTURE_IN (0,0, $_xmax,$_ymax, STRCONCAT($prefix,"base.bmp"))
//   $startcoord_X = $_return1-119
//   $startcoord_Y = $_return2+93
//ELSE
//   LOGWRITE ("Не привязались")
//   HINTPOPUP("Не привязались", "Внимание!")
//   HALT
//END_IF


//==============================================================================
SUB(LOG_c)  //==== переменные "с" в лог. Отладка ===============================
   LOGWRITE ("$c1 = ", $c1)
   LOGWRITE ("$c2 = ", $c2)
   LOGWRITE ("$c3 = ", $c3)
   LOGWRITE ("$c4 = ", $c4)
   LOGWRITE ("$c5 = ", $c5)
   LOGWRITE ("$c6 = ", $c6)
   LOGWRITE ("$c7 = ", $c7)
   LOGWRITE ("$c8 = ", $c8)
   LOGWRITE ("$c9 = ", $c9)
   LOGWRITE ("$c10 = ", $c10)
   LOGWRITE ("$c12 = ", $c12)
   LOGWRITE ("$c13 = ", $c13)
   LOGWRITE ("$c15 = ", $c15)
   LOGWRITE ("$c16 = ", $c16)
   LOGWRITE ("$c17 = ", $c17)
   LOGWRITE ("$c18 = ", $c18)
   LOGWRITE ("$c19 = ", $c19)
   LOGWRITE ("$c20 = ", $c20)
   LOGWRITE ("$c21 = ", $c21)
   LOGWRITE ("$c22 = ", $c22)
   LOGWRITE ("$c25 = ", $c25)
   LOGWRITE ("$c26 = ", $c26)
   LOGWRITE ("$c27 = ", $c27)
END_SUB

//==============================================================================
SUB(FIND, $name_image, $percent, $num)  //==== поиск картинки ==================
   SCANPICTURE($arr_find, $startcoord_X,$startcoord_Y,$startcoord_X+($max_X*$step), $startcoord_Y+($max_Y*$step), STRCONCAT($prefix,$name_image), -1, $percent)
   IF($log=1)
      LOGWRITE ("найдено ", $num, "-х элементов:  ", ARRSIZE($arr_find)/2)
   END_IF
   //UNDEFINE($arr_find)
END_SUB

//==============================================================================
SUB(GET, $dif_X, $dif_Y)  //==== проверка клетки ===============================
   $target_X = $main_X+$dif_X
   $target_Y = $main_Y+$dif_Y
   IF(($target_X > -1) & ($target_Y > -1) & ($target_X < $max_X) & ($target_Y < $max_Y))
      $ret = $map[$target_X+$target_Y*$max_X]  // читаем ячейку
   ELSE
      $ret = -1  // вышли за край поля
   END_IF
END_SUB

//==============================================================================
SUB(SET, $tmass, $trun_X,$trun_Y,$trunin_X,$trunin_Y)  //=== установка хода ====
   IF($tmass > $mass)
      $mass = $tmass
      $run_X = $trun_X + $main_X
      $run_Y = $trun_Y + $main_Y
      $runin_X = $trunin_X + $main_X
      $runin_Y = $trunin_Y + $main_Y
      IF($log=1)
         LOGWRITE ("$mass ", $mass)
         LOGWRITE ("$main ", $main_X, " / ", $main_Y)
         LOGWRITE ("Относит. ", $trun_X, " / ", $trun_Y, ", ", $trunin_X, " / ", $trunin_Y)
      END_IF
   END_IF
END_SUB

//==============================================================================
SUB(OBRABOTKA_CELL)  //==== обработка ячейки главная ===========================
   // формат хода (вес, откудаX,Y, кудаX,Y)
   
   // пропускаем поиск, когда уже лучший вариант
   IF($mass < 7)
      //SET(0,0,0,0,0)  // сбрасываем массу
      $c1 = 0
      $c2 = 0
      $c3 = 0
      $c4 = 0
      $c5 = 0
      $c6 = 0
      $c7 = 0
      $c8 = 0
      $c9 = 0
      $c10 = 0
      $c12 = 0
      $c13 = 0
      $c15 = 0
      $c16 = 0
      $c17 = 0
      $c18 = 0
      $c19 = 0
      $c20 = 0
      $c21 = 0
      $c22 = 0
      $c25 = 0
      $c26 = 0
      $c27 = 0
     
      GET(1,0)
      $c1 = $ret
      IF($c1 ! -1)
         GET(2,0)
         $c2 = $ret
         GET(3,0)
         $c3 = $ret
         GET(4,0)
         $c4 = $ret
      END_IF
     
      GET(-1,0)
      $c9 = $ret
      IF($c9 ! -1)
         GET(-2,0)
         $c10 = $ret
      END_IF
     
      GET(0,1)
      $c15 = $ret
      IF($c15 ! -1)
         GET(0,3)
         $c17 = $ret
         GET(0,4)
         $c18 = $ret
      END_IF
     
      GET(0,-1)
      $c12 = $ret
      IF($c12 ! -1)
         GET(0,-2)
         $c13 = $ret
      END_IF
     
      IF(($c1 ! -1) & ($c15 ! -1))
         GET(2,1)
         $c7 = $ret
         GET(2,2)
         $c8 = $ret
         GET(1,2)
         $c26 = $ret
      END_IF
     
      IF(($c1 ! -1) & ($c12 ! -1))
         GET(2,-1)
         $c5 = $ret
         GET(2,-2)
         $c6 = $ret
         GET(1,-1)
         $c25 = $ret
      END_IF
     
      IF(($c9 ! -1) & ($c12 ! -1))
         GET(-1,-1)
         $c19 = $ret
         GET(-1,-2)
         $c20 = $ret
      END_IF
     
      IF(($c9 ! -1) & ($c15 ! -1))
         GET(-1,1)
         $c21 = $ret
         GET(-1,2)
         $c22 = $ret
      END_IF
     
      // горизонтальные
      IF($c1 = 1)
         IF($mass < 7)
            IF(($c5=1) & ($c6=1) & ($c7=1) & ($c8=1) & ($c3=1))
               SET(7,3,0,2,0)
            ELSE
               IF(($c19=1) & ($c20=1) & ($c21=1) & ($c22=1) & ($c10=1))
                  SET(7,-2,0,-1,0)
               ELSE
                  IF(($c3=1) & ($c4=1) & ($c7=1) & ($c8=1) & ($c5=1))
                     SET(7,2,-1,2,0)
                  ELSE
                     IF(($c3=1) & ($c4=1) & ($c5=1) & ($c6=1) & ($c7=1))
                        SET(7,2,1,2,0)
                     END_IF
                  END_IF
               END_IF
            END_IF
         END_IF
         
         IF($mass < 6)
            IF(($c5=1) & ($c6=1) & ($c3=1) & ($c7=1))
               SET(6,3,0,2,0)
            ELSE
               IF(($c19=1) & ($c20=1) & ($c10=1) & ($c21=1))
                  SET(6,-2,0,-1,0)
               ELSE
                  IF(($c7=1) & ($c8=1) & ($c3=1) & ($c5=1))
                     SET(6,3,0,2,0)
                  ELSE
                     IF(($c21=1) & ($c22=1) & ($c19=1) & ($c10=1))
                        SET(6,-2,0,-1,0)
                     END_IF
                  END_IF
               END_IF
            END_IF
         END_IF
         
         IF($mass < 5)
            IF(($c5=1) & ($c7=1) & ($c3=1))
               SET(5,3,0,2,0)
            ELSE
               IF(($c19=1) & ($c21=1) & ($c10=1))
                  SET(5,-2,0,-1,0)
               ELSE
                  IF(($c3=1) & ($c4=1) & ($c5=1))
                     SET(5,2,-1,2,0)
                  ELSE
                     IF(($c3=1) & ($c4=1) & ($c7=1))
                        SET(5,2,1,2,0)
                     ELSE
                        IF(($c5=1) & ($c6=1) & ($c3=1))
                           SET(5,3,0,2,0)
                        ELSE
                           IF(($c5=1) & ($c6=1) & ($c7=1))
                              SET(5,2,1,2,0)
                           ELSE
                              IF(($c19=1) & ($c20=1) & ($c10=1))
                                 SET(5,-2,0,-1,0)
                              ELSE
                                 IF(($c19=1) & ($c20=1) & ($c21=1))
                                    SET(5,-1,1,-1,0)
                                 ELSE
                                    IF(($c7=1) & ($c8=1) & ($c3=1))
                                       SET(5,3,0,2,0)
                                    ELSE
                                       IF(($c7=1) & ($c8=1) & ($c5=1))
                                          SET(5,2,-1,2,0)
                                       ELSE
                                          IF(($c21=1) & ($c22=1) & ($c10=1))
                                             SET(5,-2,0,-1,0)
                                          ELSE
                                             IF(($c21=1) & ($c22=1) & ($c19=1))
                                                SET(5,-1,-1,-1,0)
                                             END_IF
                                          END_IF
                                       END_IF
                                    END_IF
                                 END_IF
                              END_IF
                           END_IF
                        END_IF
                     END_IF
                  END_IF
               END_IF
            END_IF
         END_IF
         
         IF($mass < 4)
            IF(($c3=1) & ($c5=1))
               SET(4,2,-1,2,0)
            ELSE
               IF(($c3=1) & ($c7=1))
                  SET(4,2,1,2,0)
               ELSE
                  IF(($c10=1) & ($c19=1))
                     SET(4,-1,-1,-1,0)
                  ELSE
                     IF(($c10=1) & ($c21=1))
                        SET(4,-1,1,-1,0)
                     END_IF
                  END_IF
               END_IF
            END_IF
         END_IF
         
         IF($mass < 3)
            IF(($c3=1))
               SET(3,3,0,2,0)
            ELSE
               IF(($c5=1))
                  SET(3,2,-1,2,0)
               ELSE
                  IF(($c7=1))
                     SET(3,2,1,2,0)
                  ELSE
                     IF(($c10=1))
                        SET(3,-2,0,-1,0)
                     ELSE
                        IF(($c19=1))
                           SET(3,-1,-1,-1,0)
                        ELSE
                           IF(($c21=1))
                              SET(3,-1,1,-1,0)
                           END_IF
                        END_IF
                     END_IF
                  END_IF
               END_IF
            END_IF
         END_IF
      END_IF
     
      // вертикальные
      IF($c15 = 1)
         IF($mass < 5)
            IF(($c22=1) & ($c26=1) & ($c17=1))
               SET(5,0,3,0,2)
            ELSE
               IF(($c19=1) & ($c25=1) & ($c13=1))
                  SET(5,0,-2,0,-1)
               ELSE
                  IF(($c17=1) & ($c18=1) & ($c22=1))
                     SET(5,-1,2,0,2)
                  ELSE
                     IF(($c17=1) & ($c18=1) & ($c26=1))
                        SET(5,1,2,0,2)
                     END_IF
                  END_IF
               END_IF
            END_IF
         END_IF
         
         IF($mass < 4)
            IF(($c17=1) & ($c22=1))
               SET(4,-1,2,0,2)
            ELSE
               IF(($c17=1) & ($c26=1))
                  SET(4,1,2,0,2)
               ELSE
                  IF(($c13=1) & ($c19=1))
                     SET(4,-1,-1,0,-1)
                  ELSE
                     IF(($c13=1) & ($c25=1))
                        SET(4,1,-1,0,-1)
                     END_IF
                  END_IF
               END_IF
            END_IF
         END_IF
         
         IF($mass < 3)
            IF(($c13=1))
               SET(3,0,-2,0,-1)
            ELSE
               IF(($c19=1))
                  SET(3,-1,-1,0,-1)
               ELSE
                  IF(($c25=1))
                     SET(3,1,-1,0,-1)
                  ELSE
                     IF(($c17=1))
                        SET(3,0,3,0,2)
                     ELSE
                        IF(($c22=1))
                           SET(3,-1,2,0,2)
                        ELSE
                           IF(($c26=1))
                              SET(3,1,2,0,2)
                           END_IF
                        END_IF
                     END_IF
                  END_IF
               END_IF
            END_IF
         END_IF
      END_IF
     
      IF($mass < 3)
         GET(1,1)
         $c27 = $ret
         GET(0,2)
         $c16 = $ret
         // уникальная тройка гор.
         IF(($c2=1) & ($c25=1))
            SET(3,1,-1,1,0)
         ELSE
            IF(($c2=1) & ($c27=1))
               SET(3,1,1,1,0)
            ELSE
               // уникальная тройка вер.
               IF(($c16=1) & ($c21=1))
                  SET(3,-1,1,0,1)
               ELSE
                  IF(($c16=1) & ($c27=1))
                     SET(3,1,1,0,1)
                  END_IF
               END_IF
            END_IF
         END_IF
      END_IF
//      IF(($main_X=4) & ($main_Y=2))
//         LOGWRITE ("$main ", $main_X, " / ", $main_Y)
//         LOG_c()
//      END_IF
   END_IF
END_SUB

//==============================================================================
SUB(RUN)  //=== ход ============================================================
   $CStart_X = ($startcoord_X + $run_X*$step) + RND(10,$step-10)
   $CStart_Y = ($startcoord_Y + $run_Y*$step) + RND(10,$step-10)
   $CEnd_X = ($startcoord_X + $runin_X*$step) + RND(10,$step-10)
   $CEnd_Y = ($startcoord_Y + $runin_Y*$step) + RND(10,$step-10)
   LCLICK($CStart_X,$CStart_Y)
   WAITMS(200)
   LCLICK($CEnd_X,$CEnd_Y)
   WAITMS(200)
   MOVE($_xmax, $_ymax)
   WAITMS(300)
END_SUB

//==============================================================================
SUB(PROCESSING)  //==== обработка полученного массива ==========================
   // заполняем массив 0
   UNDEFINE($map)
   FOR($i,$i < $max_X*$max_Y)
      ARRPUSH($map, 0)
   END_CYC
   //LOGWRITE ("размер $map  ", ARRSIZE($map))
   
   // строим карту найденных
   FOR($i, $i < ARRSIZE($arr_find), 2)
      $find_X = $arr_find[$i]
      $find_Y = $arr_find[$i+1]
     
      $sost_X = INT(($find_X-$startcoord_X)/$step)
      $sost_Y = INT(($find_Y-$startcoord_Y)/$step)
      //LOGWRITE ("ячейка ",$sost_X+$sost_Y*$max_X)
      //LOGWRITE ("коорд. ",$sost_X, " / ", $sost_Y)
      $map[$sost_X+$sost_Y*$max_X] = 1
   END_CYC
   
   // выводим поле в лог
   IF($log=1)
      FOR($i, $i < ARRSIZE($map), $max_X)
         LOGWRITE ($map[$i],$map[$i+1],$map[$i+2],$map[$i+3],$map[$i+4],$map[$i+5])
      END_CYC
      LOGWRITE (" ")
   END_IF
   UNDEFINE($arr_find)
   
   // обходим поле
   FOR($cell, $cell < ARRSIZE($map))
      $main_Y = INT($cell/$max_X)
      $main_X = $cell-$main_Y*$max_X
      //LOGWRITE ("ячейка ", $main_X, " / ", $main_Y)
     
      IF($map[$cell] = 1)
         OBRABOTKA_CELL()
      END_IF
   END_CYC
   IF($log=1)
      LOGWRITE ("$mass ", $mass)
      LOGWRITE ("Лучший на цвет ", $run_X, " / ", $run_Y, ", ", $runin_X, " / ", $runin_Y)
   END_IF
END_SUB

//==============================================================================


//===== ПРОГРАММА ==============================================================

LOGCLEAR
IF($log=1)
   LOGSHOW (1,$_xmax-335,28) // отображение окна лога
   WNDSIZE(WNDFIND("Clickermann - Лог"),336,560) // изменения размеров окна лога 260
END_IF

$start = $_ms
$mass = 0
$run_X = 0
$run_Y = 0
$runin_X = 0
$runin_Y = 0
$ret = 0

// делаем скрин
MOVE($_xmax, $_ymax)
WAITMS(30)
GETSCREEN
IF($colormode ! 0)
   COLORMODE($colormode, $startcoord_X,$startcoord_Y,$startcoord_X+($max_X*$step), $startcoord_Y+($max_Y*$step))
END_IF

// ищем все первые элементы и заносим в массив
FIND($bmp_1, 100, 1)
PROCESSING()

// ищем все вторые элементы и заносим в массив
FIND($bmp_2, 75, 2)
PROCESSING()

// ищем все третьи элементы и заносим в массив
FIND($bmp_3, 100, 3)
PROCESSING()

// ищем все четвёртые элементы и заносим в массив
FIND($bmp_4, 100, 4)
PROCESSING()

// ищем все пятые элементы и заносим в массив
FIND($bmp_5, 100, 5)
PROCESSING()

LOGWRITE ("Время выполнения ", $_ms-$start, " мс")

IF($mass ! 0)
   RUN()
END_IF

HALT

Схемы отобранных комбинаций и скрипт во вложении.
Некоторые тесты, на которых тренировался из "небеса" здесь: http://yadi.sk/d/i-qJoA5jHgcNo

« Last Edit: May 29, 2017, 01:46:06 PM by Vint »


Луций

  • Активный участник
  • ***
  • Posts: 248
  • чат в телеге: https://t.me/klickermannchat
    • View Profile
    • Пишу скрипты на заказ:
Re: Три в ряд
« Reply #1 on: December 25, 2014, 09:05:13 PM »
пытался разобраться в коде, сломал мозг и начал писать свой заново, может еще кто работал над подобным?

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Три в ряд
« Reply #2 on: December 26, 2014, 12:38:08 PM »
А там вроде особо и переделывать нечего. Добавить обнуление переменных в FOR-ы типа $i=0

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


Karabas

  • Освоившийся
  • **
  • Posts: 90
    • View Profile
Re: Три в ряд
« Reply #3 on: December 07, 2015, 12:05:55 PM »
ну а есть готовый скрипт под 4.11? вот бы пещерку на автомат поставить :)

Karabas

  • Освоившийся
  • **
  • Posts: 90
    • View Profile
Re: Три в ряд
« Reply #4 on: December 07, 2015, 03:27:31 PM »
ОНо то понятно. ну вот пещеру прогоном включить проблем нет. настроить клик по координатам и все. аранея и скорп другие координаты тут понятно если мне надо команду закоментировал и все, хотя опять таки а было бы не плохо их бить на автомате а дроп в сундук кидать, а вот с сундуками сложнее у малых кладов с червями совпадают координаты прогона, как с ними быть. средние вроде нет, большие клады не знаю ... вот и подумал было бы не плохо сделать скрипт с пещера + битва .

FJ

  • Освоившийся
  • **
  • Posts: 59
    • View Profile
Re: Три в ряд
« Reply #5 on: January 28, 2016, 01:57:28 PM »
Не могу никак понять.
Я получаю массив типа:
------
-о-о--
--о---
------
А вот понять как мне програмно сдвинуть среднюю картинку наверх, никак не могу.
Можете этот момент подробней написать?

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Три в ряд
« Reply #6 on: January 28, 2016, 03:36:31 PM »
Что это за массив такой и как его создавали? Что означают прочерки? Какой его формат?


FJ

  • Освоившийся
  • **
  • Posts: 59
    • View Profile
Re: Три в ряд
« Reply #7 on: January 28, 2016, 06:20:15 PM »
Считываю по очереди каждую картинку, например только красный шарик, записываю положения этих шариков в файл.
например считал строку, нашел там 1 красный шарик с левого краю, получил картину 0-----
Считал остальные 5 рядов, получил координаты остальных красных шариков, дальше вот хочу понять, как проанализировать эти данные, как понять, какой ход сделать?
Пойму на примере 1 шарика, буду анализировать остальные, в идеале хочу сделать так, чтобы при совершении хода просчитывалось, сколько еще может шариков соединиться в 3 и больше, чтобы в последующем за 1 ход получить как можно больше очков.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Три в ряд
« Reply #8 on: January 29, 2016, 08:16:24 AM »
дальше вот хочу понять, как проанализировать эти данные, как понять, какой ход сделать?
Так об этом весь первый пост и весь скрипт.
Тремя строками здесь не отделаться.

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


Tochka

  • Освоившийся
  • **
  • Posts: 67
  • Ищу, читаю, учусь...
    • View Profile
Re: Три в ряд
« Reply #9 on: August 07, 2016, 02:38:18 AM »
Замечательная основа скрипта! Всё продумано до деталей. Немного логики и ты в шоколаде. Я до сих пор под впечатлением от работы мозга автора. Даже перебралась из гостей форума в пользователи. Кстати, гостям вложений не увидеть. Совершенно не жалею, что потратила время на разбор и в моем случае изучение этого материала. Во-первых, это оказалось занимательно. Во-вторых, я многому научилась из этой, аккуратно оформленной, работы. А в-третьих получила нужный результат.
Vint, спасибо, что делитесь своими опытом, наработками и советами! Новых идей Вам и вдохновения!
Тема очень актуальна, не дам ей состариться  ;D
Сюда влетаю иногда... Возник вопрос и завелась метла

Кликермен

  • Активный участник
  • ***
  • Posts: 112
    • View Profile
Re: Три в ряд
« Reply #10 on: August 07, 2016, 06:43:48 AM »
Замечательная основа скрипта! Всё продумано до деталей. Немного логики и ты в шоколаде. Я до сих пор под впечатлением от работы мозга автора. Даже перебралась из гостей форума в пользователи. Кстати, гостям вложений не увидеть. Совершенно не жалею, что потратила время на разбор и в моем случае изучение этого материала. Во-первых, это оказалось занимательно. Во-вторых, я многому научилась из этой, аккуратно оформленной, работы. А в-третьих получила нужный результат.
Vint, спасибо, что делитесь своими опытом, наработками и советами! Новых идей Вам и вдохновения!
Тема очень актуальна, не дам ей состариться  ;D
Это идеальный пользователь кликера! нет ни слова: почему не может найти картинку, а сразу четко и по делу: разобрался в скрипте, поправила недочеты, спасибо за чудную вещь)

Tochka

  • Освоившийся
  • **
  • Posts: 67
  • Ищу, читаю, учусь...
    • View Profile
Re: Три в ряд
« Reply #11 on: August 07, 2016, 02:15:13 PM »
Кликермен, благодарю  :)

Решила дополнить свой отзыв.
Когда возникла необходимость в боте для игры этого вида, захотелось найти какой-нибудь рабочий вариант скрипта для Clickermann, чтобы самой не мудрить мучительно и долго. Найдя на форуме код в 500 строк, мне, честно говоря, не очень захотелось вникать. А понимать обязательно надо. Иначе как потом что-то изменить на свой вкус? Быть может, я не очень хорошо умею пользоваться поисковыми службами, но в итоге всё равно вернулась к варианту на форуме.
Учитывая, что знаний - рюкзак новичка, разбиралась долго. Вопросы, конечно же, возникали в процессе разбора. Но все их вполне реально решить самостоятельно. Здесь главные помощники: справка Clickermann и ВСЯ информация автора, прилагаемая к скрипту-основе (а так же до него и после). И хотя сам код не с дефицитом нужных пояснений, Vint не поленился изложить пошаговое описание работы скрипта (фактически - карта). Хочу заметить, что являюсь пользователем версии 4.11 003 и обратить внимание на ключевое слово в названии темы - основа. Вывод из сказанного для версии 4.12, полагаю, очевиден.
В скрипте разбиралась пошагово. Работоспособность каждой новой части мне приносила новую радость, как от маленькой победы. Относительно поиска картинок вопроса не возникло. Очень понравился способ просмотра всех участников из одной папки. Поиск комбинаций – домашнее задание на мышление. Особое впечатление от Оптимизации и действительной возможности - "Болванку кода можно дописывать под конкретную игру с её особенностями и желанием выбора приоритетов в очерёдности ходов" (см.описание).
Я не рекламирую проект, форум и работу в данной теме, а оставляю отзыв довольного пользователя замечательной программы и уникального скрипта. Уверена, достойных аналогов ни у того, ни у другого на данный момент нет.  О преимуществах зарегистрированного пользователя форума (поиск, просмотр вложений) упоминаю потому что, если бы зарегистрировалась ранее, то возможно мне было бы немного легче изучать скрипт.
Не ленитесь думать – это полезно (наверное). От пользователя требуется минимум усилий, максимум за нас уже сделали автор скрипта и создатель Clickermann. По моему скромному мнению, когда игр вида «Три в ряд», как летом листьев на деревьях, имеет смысл затратить время и радоваться отличному результату.
Объемно «дополнила»… Кто прочтет полностью, тому зачет.  ;D
Сюда влетаю иногда... Возник вопрос и завелась метла

Sanriell

  • Зашел в гости
  • *
  • Posts: 1
  • Не ищите счастья, а будьте его источником.
    • View Profile
Re: Три в ряд
« Reply #12 on: August 21, 2016, 01:01:46 AM »
Не мог понять почему не находит картинки, оказалось что все картинки анимированные и постоянно крутятся то по часовой то против. Возникла идея определять каждый элемент по уникальному цвету пикселя. Подскажите, какие правки надо внести в этот код, чтобы поиск шёл не через SCANPICTURE.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Три в ряд
« Reply #13 on: August 22, 2016, 09:18:08 AM »
Не мог понять почему не находит картинки, оказалось что все картинки анимированные и постоянно крутятся то по часовой то против. Возникла идея определять каждый элемент по уникальному цвету пикселя. Подскажите, какие правки надо внести в этот код, чтобы поиск шёл не через SCANPICTURE.

SCANPXL. Если ты конечно найдёшь уникальные цвета. Может сработать если там всё нарисовано ярко и "мультяшно", просто качается. Но если там тени-переливы и прочие фейерверки, то помучаешься изрядно.


Tochka

  • Освоившийся
  • **
  • Posts: 67
  • Ищу, читаю, учусь...
    • View Profile
Re: Три в ряд
« Reply #14 on: February 28, 2017, 03:22:07 PM »
Работа идеальная. Никаких недочетов нет. Абсолютно рабочий код.
Vint, мои аплодисменты ещё раз.

Результат в группе VK:
https://vk.com/video-14410794_456239051

9 на 9 квадратов, 7 цветов. Время выполнения (поиск лучшей комбинации и осуществление хода) в среднем 3 сек.
« Last Edit: March 20, 2017, 03:58:00 PM by Tochka »
Сюда влетаю иногда... Возник вопрос и завелась метла