Author Topic: Не работает переменная. Помогите пожалуйста  (Read 1651 times)

0 Members and 1 Guest are viewing this topic.

Parz

  • Зашел в гости
  • *
  • Posts: 7
    • View Profile
Помогите со скриптом.
Скорее всего нужно потоками писать, но я от этого далек.
Логика скрипта такая, есть  два варианта цвета зеленый и красный.
Если скрипт видит зеленый через время он должен проверить не пропал ли цвет по этим координатам то есть ищем пустой квадрат, если черный квадрат сек задержка и скрипт сначала. Если скрипт видит красный тоже самое что зеленый ток задержка больше. Проблема в том что цвет может меняться , скрипт должен запомнить какой цвет был последний и сделать запись в блокнот, что было последним красное или зеленое.

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

Code: [Select]
proverka:
$check = 0
WHILE($check = 0)
   GETSCREEN
   IF_PIXEL_IN(1000,810, 1090,40, 922256)
      WAITMS(100)
      GOTO(proverkablackplus)
   END_IF
ELSE
   GETSCREEN
   IF_PIXEL_IN(1000,810, 1090,40, 4798640)
      WAITMS(100)
      GOTO(proverkablackminus)
   END_IF
ELSE
   WAITMS(100)
   GOTO(start)
END_CYC


proverkablackplus:
WAIT(5)

$check = 0
WHILE($check = 0)
   GETSCREEN
   IF_PICTURE_IN (1000,810, 1090,40, "black.bmp", -1, 100)
      WAITMS(100)
      $check = 1
   END_IF
ELSE
   WAITMS(100)
   GOTO(proverka)
END_CYC

INC($orderplus,1)
log($note)
WAIT(1)
goto(start)

proverkablackminus:
WAIT(5)

$check = 0
WHILE($check = 0)
   GETSCREEN
   IF_PICTURE_IN (1000,810, 1090,40, "black.bmp", -1, 100)
      WAITMS(100)
      $check = 1
   END_IF
ELSE
   WAITMS(100)
   GOTO(proverka)
END_CYC

INC($orderminus,1)
log($note)
WAIT(60)
goto(start)
« Last Edit: October 31, 2021, 10:20:19 AM by Parz »

Parz

  • Зашел в гости
  • *
  • Posts: 7
    • View Profile
Короче почитал форум понял что GOTO в циклах не работает.
Написал вот такое чудо но оно просто стопорит скрипт и ему вобще всеравно что там происходит. я так понимаю у меня переменная $check попросту не работает.

Code: [Select]
$check = 0
$time = $_time_d + 1
WHILE($time > $_time_d,$check = 0)
   GETSCREEN (1000,810, 1090,40)
   IF_PIXEL_IN(1000,810, 1090,40, 922256)
      $check = 1
      $time = 0
      LOGWRITE("нашел зеленый цвет")
      WAIT(1)
      GETSCREEN (60,770, 141,881)
      IF_PICTURE_IN (60,770, 140,880, "white.bmp", -1, 100)
         LOGWRITE("нашел черный квадрат после зеленого")
         INC($orderplus,1)
         WAITMS(50)
         log($note)
         WAIT(1)
      ELSE
         GETSCREEN (1000,810, 1090,40)
         IF_PIXEL_IN(1000,810, 1090,40, 4798640)
            $check = 1
            $time = 0
            LOGWRITE("нашел красный цвет")
            WAIT(1)
            GETSCREEN (60,770, 141,881)
            IF_PICTURE_IN (60,770, 140,880, "white.bmp", -1, 100)
               LOGWRITE("нашел черный квадрат после красного")
               INC($orderminus,1)
               WAITMS(50)
               log($note)
               WAIT(120)
            ELSE
LOGWRITE("не нашел ни один цвет")
               WAIT(1)
            END_IF
         END_IF
      END_IF
   END_IF
END_CYC

Но в таком виде он работает

Code: [Select]
$time = $_time_d + 1
WHILE($time > $_time_d)
   GETSCREEN
   IF_PICTURE_IN (0,0, $_xmax,$_ymax, "confirm.bmp", -1, 100) //подтвердить
   $time = 0   
MOVE_SLOW($_return1, $_return2)
      LCLICK($_return1, $_return2)
      WAIT(1)
   END_IF
ELSE
   WAIT
END_CYC

Помогите пожалуйста, я не понимаю что можно сделать
« Last Edit: October 31, 2021, 10:24:15 AM by Parz »

Parz

  • Зашел в гости
  • *
  • Posts: 7
    • View Profile
Если кому нужно вот код рабочий

Code: [Select]
GR:
$check = 0
$checc = 0
$time = $_time_d + 1
WHILE($time > $_time_d)
   GETSCREEN (1000,810, 1090,840)
   IF_PIXEL_IN(1000,810, 1090,840, 4601507, 4864436, 5127362, 5915625, 4272784)// красный
      $check = 1
      $time = 0
      WAITMS(100)
      LOGWRITE("пиксель красный")
      WAIT(1)
   ELSE
      GETSCREEN (1000,810, 1090,840)
      IF_PIXEL_IN(1000,810, 1090,840, 6922256, 6130193, 5074451, 6988304, 7846415)// зеленый
         $checc = 1
         $time = 0
         WAITMS(100)
         LOGWRITE("пиксель зеленый")
         WAIT(1)
      END_IF
   END_IF
END_CYC

IF($check = 1)
   LOGWRITE("да пиксель красный")
   GOTO(red)
END_IF

IF($checc = 1)
   LOGWRITE("да пиксель зеленый")
   GOTO(green)
END_IF

red:
$check = 0
$time = $_time_t + 1
WHILE($time > $_time_t)
   getscreen (60,770, 141,881)
   IF_PICTURE_IN (60,770, 140,880, "white.bmp", -1, 100)
      $check = 1
      LOGWRITE ("нашел картинку")
   ELSE
      LOGWRITE ("не нашел картинку")
      WAIT(1)
   END_IF
end_cyc

IF($check = 1)
   INC($orderminus,1)
   WAITMS(50)
   log($note)
   LOGWRITE ("закрыл ордер на красный")
   WAIT(5)
   halt
END_IF

IF($time ! 0)
   GOTO(GR)
END_IF

green:
$check = 0
$time = $_time_t + 1
WHILE($time > $_time_t)
   getscreen (60,770, 141,881)
   IF_PICTURE_IN (60,770, 140,880, "white.bmp", -1, 100)
      $check = 1
      LOGWRITE ("нашел картинку")
   ELSE
      LOGWRITE ("не нашел картинку")
      WAIT(1)
   END_IF
end_cyc

IF($check = 1)
   INC($orderplus,1)
   WAITMS(50)
   log($note)
   LOGWRITE ("закрыл ордер на зеленый")
   WAIT(1)
   halt
END_IF

IF($time ! 0)
   GOTO(GR)
END_IF

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Короче почитал форум понял что GOTO в циклах не работает.
Неправильно понял, всё работает, но конечно не так как написано.

Вот это что такое?
Quote
WHILE($check = 0)
   GETSCREEN
   IF_PIXEL_IN(1000,810, 1090,40, 922256)
      WAITMS(100)
      GOTO(proverkablackplus)
   END_IF
ELSE
   GETSCREEN
   IF_PIXEL_IN(1000,810, 1090,40, 4798640)
      WAITMS(100)
      GOTO(proverkablackminus)
   END_IF
ELSE
   WAITMS(100)
   GOTO(start)
END_CYC

Что это за чудеса? Откуда в цикле ELSE и почему их два? Было бы интересно понять ход мыслей как оно должно было работать.
Ну вот заходим в бесконечный цикл WHILE($check = 0)
Ищем цвет 922256 по НЕПРАВИЛЬНЫМ координатам
IF_PIXEL_IN(1000,810, 1090,40, 922256)
Потом ЕLSE (иначе) иначе от чего?


Там везде в коде чудеса. Вот откуда взято это? В какой справке так написано?
Code: (clickermann) [Select]
WHILE($time > $_time_d,$check = 0)
« Last Edit: November 02, 2021, 09:44:04 AM by Vint »


Vint

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


Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Code: (clickermann) [Select]
DEFINE($orderminus, 0)
DEFINE($orderplus, 0)

SUB(wait_white)
    $white = 0
    WHILE($white = 0)
        GETSCREEN(60,770, 141,881)
        IF_PICTURE_IN (60,770, 140,880, "white.bmp")
            $white = 1
        ELSE
            WAITMS(100)
        END_IF
    end_cyc
END_SUB

SUB(red_green, $color, $W)
    $check = 1
    LOGWRITE("пиксель ", $color)
    wait_white()
    IF($color = "красный")
        INC($orderminus)
    ELSE
        INC($orderplus)
    END_IF
    log($note)  // хз что это такое
    LOGWRITE("закрыл ордер на ", $color)
    WAIT($W)
END_SUB

$check = 0
WHILE($check = 0)
    GETSCREEN(1000,810, 1090,840)
    IF_PIXEL_IN(1000,810, 1090,840, 4601507, 4864436, 5127362, 5915625, 4272784)
        red_green("красный", 5)
    ELSE
        IF_PIXEL_IN(1000,810, 1090,840, 6922256, 6130193, 5074451, 6988304, 7846415)
            red_green("зеленый", 1)
        ELSE
            WAITMS(80)
        END_IF
    END_IF
END_CYC

HALT