Author Topic: Нужен свежий взгляд, не вижу ошибку  (Read 2069 times)

0 Members and 4 Guests are viewing this topic.

vasyapro

  • Зашел в гости
  • *
  • Posts: 17
    • View Profile
Code: (clickermann) [Select]
THREAD(click)
 waitms(30)
 if ($i2 > $i)
  if ($cl[$i] < $_ms)
   lclick(404 + $clx[$i] * 50,302 + $cly[$i] * 50)
   $f = $clx[$i]  // Удаляем из очереди
   $igx[$f] = 0 // $igx[$clx[$i]] выдаёт ошибку, потому используем левак
   $f = $cly[$i]
   $igy[$f] = 0
   $i = $i + 1
  end_if
 end_if
END_THREAD

$f = 0
for ($i=0,$i<12) // Если этого не сделать - позже выдаст ошибку
 arrpush($igx,0)
 arrpush($igy,0) // Тут можно всего 6 раз, но зачем делать еще один цикл
end_cyc
$i = 0
$i2 = 0
SetThread(click,1)
while(1)
 getscreen
 if (PXL(402,476) = 15887871) // Запуск из меню
  LClick(444,524)
  wait(4)
  getscreen
 end_if
 if (PXL(677,511) = 15887871) // Конец
  halt
 end_if
 // Вот тут начинается основной код
 for ($x = 0, $x < 12)
  for ($y = 0, $y < 6)
   if (($igx[$x] = 0) or ($igy[$y] = 0)) // Что бы десять раз не записало одну и ту же точку в очередь надо проверять не в очереди ли эта точка уже
    $cx = 404 + $x * 50 // Эти переменные уже не нужны, остались после версии где ожидать после обнаружения не надо было вообще
    $cy = 302 + $y * 50
    if (colorR(PXL($cx,$cy)) > 50) // Если цвет не тот, то добавляем в очередь
     arrpush($cl,$_ms+300)
     arrpush($clx,$x)
     arrpush($cly,$y)
     $igx[$x] = 1
     $igy[$y] = 1
     $i2 = $i2 + 1
    end_if
   end_if
  end_cyc
 end_cyc
end_cyc
Таблица 12х6, в случайных местах со случайным промежутком времени (могут и 5 одновременно) цвет ячейки меняется и через 300мс после появления нужно по ней кликнуть. То бишь если появится 5 одновременно, то простой waitms(300) после обнаружения уже не канает.
Сделал через очередь в другом потоке. Всё работает, но где то в 70% случаев вместо одного клика по ячейке происходит два и я не могу понять почему.
« Last Edit: October 31, 2016, 04:20:20 PM by vasyapro »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Нужен свежий взгляд, не вижу ошибку
« Reply #1 on: October 31, 2016, 05:17:56 PM »
Я думаю проблема в $igx[$x], $igy[$y]
Почему ты используешь два разных массива? Это можно бы было делать если бы там хранилось состояние для одного элемента.
Допустим включено поле по столбец  [6]  и  ряд [2]. Ты проставил там  по 1, этим ты включил все клетки по $igx[6] и все по $igy[2]

Допустим, пока не было клика включилась ещё поле $igx[6], $igy[4].
Потом ты кликнул по первой и удаляешь её
Code: (clickermann) [Select]
$igx[6] = 0
$igy[2] = 0

Теперь для этого условия
Code: (clickermann) [Select]
if (($igx[$x] = 0) or ($igy[$y] = 0))вторая точка оказалась свободна... И он её опять запишет.

Или ставь в условии AND,  &  вместо or
или вместо пары $igx[$x], $igy[$y] используй один массив с нумерацией точек подряд
или псевдо двумерный массив, что то же самое что и преведущее, но представленно в скрипте визуально в привычных тех же [$x], [$y].

И лучше убрать лишнее. Сделать чтоб $clx, $cly не были безразмерными и вечно растущими. Хотя смотря сколько твой скрипт работает и много ли пишется кликов. Ну это не обязательно.


vasyapro

  • Зашел в гости
  • *
  • Posts: 17
    • View Profile
Re: Нужен свежий взгляд, не вижу ошибку
« Reply #2 on: October 31, 2016, 07:37:00 PM »
Спасибо за совет, сделал через $ig[$x*6+$y]. Действительно со старым кодом иногда пропускались точки.
Однако, основная проблема от этого не пропала. В половине случаев всё так же делается два клика вместо одного, практически сразу после предыдущего.
Code: (clickermann) [Select]
THREAD(click)
 waitms(30)
 if ($i2 > $i)
  if ($cl[$i] < $_ms)
lclick(404 + $clx[$i] * 50,302 + $cly[$i] * 50)
$ig[$clx[$i]*6+$cly[$i]] = 0
$i = $i + 1
  end_if
 end_if
END_THREAD

for ($i=0,$i<72)
 arrpush($ig,0)
end_cyc
$i = 0
$i2 = 0
SetThread(click,1)
while(1)
 getscreen
 if (PXL(402,476) = 15887871)
  LClick(444,524)
  wait(4)
  getscreen
 end_if
 if (PXL(677,511) = 15887871)
  halt
 end_if
 for ($x = 0, $x < 12)
  for ($y = 0, $y < 6)
   if ($ig[$x*6+$y] = 0)
    if (colorR(PXL(404 + $x * 50,302 + $y * 50)) > 50)
     arrpush($cl,$_ms+300)
     arrpush($clx,$x)
     arrpush($cly,$y)
     $ig[$x*6+$y] = 1
     $i2 = $i2 + 1
    end_if
   end_if
  end_cyc
 end_cyc
end_cyc
Кликов не более 100 за раз. Может когда разберусь с основной проблемой то сделаю перезапуск с обнулением вместо halt.
« Last Edit: October 31, 2016, 07:39:06 PM by vasyapro »

Золотой

  • Оплот сообщества
  • ****
  • Posts: 312
    • View Profile
Re: Нужен свежий взгляд, не вижу ошибку
« Reply #3 on: October 31, 2016, 07:52:03 PM »
THREAD(click,0) иначе ваш поток запустится раньше создания массива

vasyapro

  • Зашел в гости
  • *
  • Posts: 17
    • View Profile
Re: Нужен свежий взгляд, не вижу ошибку
« Reply #4 on: October 31, 2016, 07:56:56 PM »
Да там как бы без разницы. Условие для клика не выполняется, поскольку $i2 будет меньше (во время создания массива) или равно $i аж до первой записи в очередь.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Нужен свежий взгляд, не вижу ошибку
« Reply #5 on: October 31, 2016, 11:15:53 PM »
а случайно не
[$y*12 + $x]
хотя, конечно, и в этом направлении можно по столбцам ходить.
« Last Edit: October 31, 2016, 11:21:41 PM by Vint »


vasyapro

  • Зашел в гости
  • *
  • Posts: 17
    • View Profile
Re: Нужен свежий взгляд, не вижу ошибку
« Reply #6 on: November 05, 2016, 01:29:48 AM »
Даблклик так никто и не видит?

vasyapro

  • Зашел в гости
  • *
  • Posts: 17
    • View Profile
Re: Нужен свежий взгляд, не вижу ошибку
« Reply #7 on: November 06, 2016, 02:09:27 PM »
Ладно. Исправил сам, судя по всему проблема с работой с одной переменной в двух потоках. Пришлось еще создать очередь на удаление игнора клетки. Авсоь кому пригодится:
Code: (clickermann) [Select]
Thread(removeignore)
 waitms(30)
 if($i > $i3)
if ($ri[$i3] < $_ms)
$ig[$clx[$i3]*6+$cly[$i3]] = 0
$i3 = $i3 + 1
end_if
 end_if
end_thread

Thread(click)
 waitms(30)
 if ($i2 > $i)
  if ($cl[$i] < $_ms)
lclick(404 + $clx[$i] * 50,302 + $cly[$i] * 50)
arrpush($ri,$_ms+500)
$i = $i + 1
  end_if
 end_if
end_thread

setthread(removeignore,0)
setthread(click,0)
for ($i=0,$i<72)
 arrpush($ig,0)
end_cyc
$i = 0
$i2 = 0
$i3 = 0
setthread(removeignore,1)
setthread(click,1)
while(1)
 getscreen
 if (PXL(402,476) = 15887871)
  LClick(444,524)
  wait(4)
  getscreen
 end_if
 if (PXL(677,511) = 15887871)
  halt
 end_if
 for ($x = 0, $x < 12)
  for ($y = 0, $y < 6)
   if ($ig[$x*6+$y] ! 1)
    if (colorR(PXL(404 + $x * 50,302 + $y * 50)) > 50)
     arrpush($cl,$_ms+300)
     arrpush($clx,$x)
     arrpush($cly,$y)
     $ig[$x*6+$y] = 1
     $i2 = $i2 + 1
    end_if
   end_if
  end_cyc
 end_cyc
end_cyc

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Нужен свежий взгляд, не вижу ошибку
« Reply #8 on: November 06, 2016, 03:31:04 PM »
никто ничего не подсказал, потому, что никто не может попробовать. Тупо не на чем. Хотя бы логи порасставлять, скрипт перетасовать.
А 'виртуально', в уме такую проблему не поймать.