Автокликер Clickermann :: Форум

Основной раздел => Использование => Topic started by: Graubart on November 23, 2018, 04:00:35 PM

Title: «Pearls before swine»
Post by: Graubart on November 23, 2018, 04:00:35 PM
Вот занятная интеллектуальная игруха на сайте http://www.transience.com.au/pearl3.html.
Интересно, кто-нибудь пытался с помощью КМ создать достойного противника Хуану? Такого, чтоб сам играл с ним, не проигрывая.


Title: Re: «Pearls before swine»
Post by: Qwerry on November 27, 2018, 11:31:05 PM
Задачка, конечно, оригинальная и занятная. Но только одна проблема - перед тем, как писать код, надо четко понимать логику игры. По большому счету, реально написать может лишь тот, кто превосходно в эту игру играет вживую (ну если речь не про сбор информации, проведение сотен неудачных игр со случайным результатом, и записывании под каждый уровень нескольких  -в зависимости от поведения противника- сработавших алгоритмов).
Первый вариант не смогу, хоть игра и математическая (т.е. один неверный ход  - и ты проиграл), но ближе чем за 3 хода до конца не могу предугадать, кто кого.  Стратегий увидела несколько - если 2 строки - то оставлять противнику поровну в строчках (доведение до ситуации 2-2). При трех строчках - если в 1 строке 1 шарик, то делать так, чтобы сумма его и второй строки была равна третьей. И перевод ситуации в 1-2-3, или 2-2, или 1-1-1. Ещё кучу правил понять не удалось - хотя и полчаса там провисела, дошла лишь до 7.
Второй вариант - поиск экспериментальным путем правильных решений  и их запись для каждого уровня. Если честно, немного лениво это делать... Но если хотите, начинайте, ошибки подправить поможем. А как соберете мозайку насчет выигрышной стратегии игры, расскажите нам  - глядишь и поймем, как выигрывать незнакомые раунды и сделать бот по первому варианту)
Title: Re: «Pearls before swine»
Post by: dramster on November 28, 2018, 12:14:26 AM
Ещё кучу правил понять не удалось - хотя и полчаса там провисела, дошла лишь до 7.

 :o  :o  :o  :(  :-[

Я сейчас тоже гдето пол часа как прочел твой пост и глянул что там за игруля.

Я с трудом смог пройти второй уровень, ито с помощью твоих подсказок.  >:( Мозг вспух, щяс не смогу уснуть...   :'(
Title: Re: «Pearls before swine»
Post by: Qwerry on November 28, 2018, 12:29:34 AM
 

 :o  :o  :o  :(  :-[

Я сейчас тоже гдето пол часа как прочел твой пост и глянул что там за игруля.

Я с трудом смог пройти второй уровень, ито с помощью твоих подсказок.  >:( Мозг вспух, щяс не смогу уснуть...   :'(

Понимаю и сочувствую) Почему-то тоже не смогла уснуть сразу после ответа, думала-гадала, ну и  решила, что раз математика, кто-то стратегию наверняка уже выложил. В общем, оказалось  ларчик открывается просто и со вкусом.
1. Прежде, чем дойти до позиций 1-2-3, 1-1-1, 2-2, надо считать жемчужины в двоичной системе счисления, написав числа друг под другом.
Как-то так: 
ч.1. https://youtu.be/Ajku3V0s6pU
ч.2. https://youtu.be/LcSZLtcUiE4

Теперь можно спать спокойно  ;D)

P.S. Ну может больше, чем полчаса. И зависала периодически на раундах, даже ранее пройденных. Просто сразу приняла за данность, что бота не переиграть, но он знает, что делать. Потому делала случайный ход, а после проигрыша, пыталась "съобезъянничать" его ходы (вернее подставить перед ним его же комбинацию), не считая особо ничего. С 5-10 раза обычно раунд поддавался. Сразу решила, что понимать там бессмысленно - для анализа попросту нет базы, а подсказать, в правильном ли направлении мыслю некому.  А так получился "китайский метод определения пола цыплят" или что-то в этом духе (пока не дошли до больших цифр, где он уже не сработал).
Title: Re: «Pearls before swine»
Post by: Qwerry on November 28, 2018, 12:43:51 PM
Вот занятная интеллектуальная игруха на сайте http://www.transience.com.au/pearl3.html.
Интересно, кто-нибудь пытался с помощью КМ создать достойного противника Хуану? Такого, чтоб сам играл с ним, не проигрывая.
Поиграла немного с правильной стратегией. Невозможно создать достойного противника Хуану, чтобы  всегда выигрывать. Периодически в раунде изначально нам предлагают заведомо проигрышное количество жемчуга: придется взять жемчужину и нажать на New game, записывают как поражение. Иногда и несколько раз подряд нерабочий раунд предлагают. Создать неплохо играющего моба, который выяснит заканчиваются ли у Хуана раунды или генерируются бесконечно - вполне можно, но в целом для игры калькулятора переводящего из двоичной в десятеричную (и наоборот)  вполне хватит.
https://prnt.sc/lnyizj
Code: (clickermann) [Select]
//Перевод числа в двоичную систему
SUB(binar, $par1)
   $num=$par1
   $str=""
   While($num>0)
      $a=  $num-(2*INT($num/2))
      $str= strconcat($a, $str)
      $num= INT($num/2)
   End_cyc
   Print($str)
END_SUB
// to ten
SUB(toten, $par1)
   $num=$par1
   $str=0
   For($a=0,$a<STRLEN($num))
      $str= $str+int(STRCUT($num,(STRLEN($num)-$a),1))*POW(2,$a)
   End_cyc
   Print("=====  ",$str)
END_SUB
binar(4)
binar(6)
binar(8)
binar(10)
Print("                                 "," * ")
Print("                                 "," * ")
toten(1100)
halt
Title: Re: «Pearls before swine»
Post by: Graubart on November 28, 2018, 06:36:41 PM
Поиграла немного с правильной стратегией. Невозможно создать достойного противника Хуану, чтобы  всегда выигрывать. Периодически в раунде изначально нам предлагают заведомо проигрышное количество жемчуга: придется взять жемчужину и нажать на New game, записывают как поражение. Иногда и несколько раз подряд нерабочий раунд предлагают. Создать неплохо играющего моба, который выяснит заканчиваются ли у Хуана раунды или генерируются бесконечно - вполне можно, но в целом для игры калькулятора переводящего из двоичной в десятеричную (и наоборот)  вполне хватит.

Молодец Qwerry! Правильной дорогой идете, товарищи!

 Начну с того, что этой игре уже несколько сотен лет. Родилась она в Китае и решение найдено довольно давно.
 Об алгоритме игры. Это чистая математика, в начале никаких стратегий нет.
 Правильно, надо в каждом ряду к-во шаров перевести в бинар и сложить их в столбик, как в 1-ом классе.  Например: 5  6  9
0101   5
0110   6
1001   9
----
1212
 После этого сумму переводим в т.н. ним-сумму(N). Все нечетные числа становятся 1, а четные - 0. Получается:
1010
 Чтобы выиграть, надо Хуану каждый раз возвращать N=0. То есть надо подобрать такое число в каком-то ряду, чтобы стало N=0. В нашем примере это 3 вместо 9 в третьем ряду.
0101   5
0110   6
0011   3
----
0222 ---> ним-сумма 0000
 Снимаем 6 шаров в третьем ряду.
Если в начале левела Хуан даёт комбинацию с N=0, жмем GO и передаем ход Хуану. Стоит один раз ошибиться и передать комбинацию N<>0, Хуан выиграет.
 Понятно, в уме это делать тяжеловато, надо писать прогу.
Title: Re: «Pearls before swine»
Post by: Graubart on November 28, 2018, 08:36:36 PM
 На приведенном мною сайте я обнаружил эту игру 16 лет назад. Тогда я владел только Бейсиком и написал код помощника в игре. Надо было вводить в инпут к-во шаров в каждом ряду, а он выдавал где и сколько их снимать. Потом писал код на языках более высокого уровня. Но это было просто диалоговое общение с помощником. Когда я обнаружил КМ, перевел всё в код КМ, но не хватало некоторых процедур и функций, я ненавязчиво просил Johnny добавить кое-что.
 И вот в последней версии "Clickermann v4.14 x32" всё, что надо, есть. Я назвал свою прогу *Helper*.
Код работает в трех режимах:
1. «Автомат»     -   *Helper* играет самостоятельно
2. «Референт»   -   *Helper* считает шары и даёт подсказку
3. «Счетчик»     -   *Helper* считает шары без подсказки

Мой *Helper* прошел автоматом 105 уровней за 3 часа 38 минут. Прога делает скрин в начале каждого левела и ведет лог.
Сегодня бот прошел 58 левелов за 1 час 39 мин.
Title: Re: «Pearls before swine»
Post by: Graubart on November 28, 2018, 08:46:56 PM
Что интересно после 99 level - scores остается, а level становится 00. Затем level становится 01, scores обнуляется, но количество шаров намного больше, чем в начале.
Title: Re: «Pearls before swine»
Post by: dramster on November 28, 2018, 08:49:58 PM
Так этож оператор XOR  :D ! С одной стороны вроде сложная задача, а решение в пару строк  ;D

Code: (clickermann) [Select]
$l[0] = 5
$l[1] = 6
$l[2] = 9

$i = 0
$l_mem = $l[$i]
WHILE($l[0] xor $l[1] xor $l[2])
   $l[$i] = $l[$i] - 1
   IF($l[$i] = -1)
      $l[$i] = $l_mem
      inc($i)
      $l_mem = $l[$i]
   END_IF 
END_CYC


print($l[0] , " ", $l[1], " ",$l[2])  // 5 6 3

halt

Щас попробую накидать код для использавания на автомате. Нужно еще добавить проигрышный вариант для пропуска.
Title: Re: «Pearls before swine»
Post by: Graubart on November 28, 2018, 09:12:06 PM
С одной стороны вроде сложная задача, а решение в пару строк  ;D
Щас попробую накидать код для использавания на автомате. Нужно еще добавить проигрышный вариант для пропуска.

Отлично! Я старался разжевать, как можно проще. Мне интересны любые решения. У вас оригинально, я сделал иначе... Может кто-нибудь ещё предложит разные решения
Title: Re: «Pearls before swine»
Post by: Graubart on November 28, 2018, 10:07:15 PM
Щас попробую накидать код для использавания на автомате. Нужно еще добавить проигрышный вариант для пропуска.

Главное, не забывать что рядов может быть 7, до трех операндов XOR ещё работает, а вот больше - буксует.
Title: Re: «Pearls before swine»
Post by: dramster on November 28, 2018, 10:34:48 PM
Так это не проблема, самое простое, это дописать еще 4 ряда  :), и если их нет, то прописать их нулями.
Code: (clickermann) [Select]
$l[0] = 5     //вводим данные по рядам
$l[1] = 6
$l[2] = 9
$l[3] = 2
$l[4] = 0
$l[5] = 0
$l[6] = 0
 
$i = 0
$l_mem = $l[$i]
WHILE(((($l[0] xor $l[1] xor $l[2]) xor $l[3] xor $l[4]) xor $l[5]) xor $l[6])
   $l[$i] = $l[$i] - 1
   IF($l[$i] = -1)
      $l[$i] = $l_mem
      inc($i)
      $l_mem = $l[$i]
   END_IF 
END_CYC
 
 
print($l[0] , " ", $l[1], " ",$l[2], " ", $l[3], " ",$l[4], " ", $l[5], " ",$l[6])  // ответ 5 6 3 2 0 0 0
 
halt

Почему я всунул столько скобок в WHILE(((($l[0] xor $l[1] xor $l[2]) xor $l[3] xor $l[4]) xor $l[5]) xor $l[6]) ? Вот это вопрос. Кликерман без них выдает ошибку  :-\. Конечно врядли с операторами еще ктото будет так извращаться, но всеже, почему без них ошибка?
Сразу говорю, с таким кол-вом не тестил, дошел до пятого уровня вручную с помощью скрипта, и понял что задача выполнена.


Я начал писать автоматическую игру, и опустил руки в самом начале  на получении входных данных по количеству шаров в рядах и кол-ву рядов:(. Не потому, что это не реально, а потому что это геморно и не универсально. Графика какаято сложная, попробовал пару простых вариантов, не сработало, забил.
Должен сработать вариант с колормод 8 и подсчетом белых  пикселей по горизонту в каждом ряду и делении на ширину одного шара, но тут нужы точные входящие координаты, даже не начинал писать. Да и не комфортно на не домашнем глючном ноуте  :(.

Если кто предложит вариант попроще - можно попробовать.
Title: Re: «Pearls before swine»
Post by: Graubart on November 28, 2018, 11:31:25 PM
Не, не катит через ксор, 3 ряда еще рулит, а дальше пургу гонит.
Подожду пока Джонни компилятор сделает, тогда эксешку выложу на полный вариант. Щас, если хошь, выложу в диалоговом варианте.
Title: Re: «Pearls before swine»
Post by: Graubart on November 29, 2018, 05:11:44 PM
А потом мальчики и девочки, будут постоянно ныть на форуме и ковыряя в носу, требовать обещанный компилятор, ссылаясь на данное провокационное сообщение.
Вы  твёрдо уверены, что компилятор обещан и его нужно ждать?

или нет. учитывая что вы вообще хотите ограничить запуск скрипта.
кароч ждите компиляции. хоть какой то
Title: Re: «Pearls before swine»
Post by: Vint on November 29, 2018, 05:23:21 PM
Ключевое слово здесь "ждите"  :) :D
Title: Re: «Pearls before swine»
Post by: Graubart on November 29, 2018, 05:36:05 PM
Ключевое слово здесь "ждите"  :) :D

Почти по Библии: ;)
"Ждите, и обрящете"
Title: Re: «Pearls before swine»
Post by: Graubart on November 29, 2018, 06:23:12 PM
В какое страшное время мы живём!
https://www.youtube.com/watch?v=Jl4maKpzA8s (https://www.youtube.com/watch?v=Jl4maKpzA8s) ;D

https://www.youtube.com/watch?v=0pnmoB46cIg (https://www.youtube.com/watch?v=0pnmoB46cIg)
Title: Re: «Pearls before swine»
Post by: dramster on November 29, 2018, 11:39:52 PM
Вы подеритесь еще  ;D . Нашли место... Тут глобальные вопросы решаются, а вы...



По теме:
Не, не катит через ксор, 3 ряда еще рулит, а дальше пургу гонит.
Вообщето катит, мой код верный  >:( . Просто кликерман считает както не правильно  :-\

Оказывается, если писать оператор словом "xor", то при выполнении он считает чертичто. Если заменить на символ "^", то глюки исчезают  :-\ . Придется учитывать в будущем.
Code: (clickermann) [Select]
$l[0] = 3     //вводим данные по рядам
$l[1] = 4
$l[2] = 5
$l[3] = 6
$l[4] = 0
$l[5] = 0
$l[6] = 0

print($l[0] ^ $l[1] ^ $l[2] ^ $l[3] ^ $l[4] ^ $l[5] ^ $l[6]) //результат = 4
print(((($l[0] xor $l[1] xor $l[2]) xor $l[3] xor $l[4]) xor $l[5]) xor $l[6]) //результат = 2

Короче, вот рабочий вариант. Тоже самое что и было, только написано иначе  :D
Code: (clickermann) [Select]
$l[0] = 3     //вводим данные по рядам
$l[1] = 4
$l[2] = 5
$l[3] = 6
$l[4] = 0
$l[5] = 0
$l[6] = 0

$i = 0
$l_mem = $l[$i]
WHILE($l[0] ^ $l[1] ^ $l[2] ^ $l[3] ^ $l[4] ^ $l[5] ^ $l[6])
   
   $l[$i] = $l[$i] - 1
   IF($l[$i] = -1)
      $l[$i] = $l_mem
      inc($i)
      $l_mem = $l[$i]
   END_IF
   
END_CYC


print($l[0] , " ", $l[1], " ",$l[2], " ", $l[3], " ",$l[4], " ", $l[5], " ",$l[6])
halt
Title: Re: «Pearls before swine»
Post by: Qwerry on November 30, 2018, 08:26:36 PM
Если кто предложит вариант попроще - можно попробовать.

При 6 колормоде сканпикчер довольно хорошо находит. Правда, если рядов шесть, то в последнем графика чуть меняется (пришлось сделать два шаблона жемчужин). В целом, ручной режим с подсказками готов.

Code: (clickermann) [Select]
GETSCREEN
colormode(6)
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "base.bmp", -1, 90)
   //  print("base+")
   $x_b=$_return1
   $y_b=$_return2
end_if
WHILE(1)
   $l[0] = 0
   $l[1] = 0
   $l[2] = 0
   $l[3] = 0
   $l[4] = 0
   $l[5] = 0
   $l[6] = 0
   UNDEFINE($ARR_SCAN) //т.к. тут лежат координаты жемчужин, лучше будем чистить в начале, чтобы в будущем в автоматическом режиме не сильно мучиться с тем, куда кликать (сдвигать где-то на +3, +3)
   SCANPICTURE($ARR_SCAN, $x_b-55,$y_b+15,$x_b+694,$y_b+200, "pearl.bmp", -1, 98)
   SCANPICTURE($ARR_SCAN, $x_b-55,$y_b+120,$x_b+694,$y_b+200, "pearl2.bmp", -1, 97)
   Print(ARRSIZE($ARR_SCAN)/2)
   
   $A=$ARR_SCAN[1]
   $b=0
   FOR ($i=1,$i < ARRSIZE($ARR_SCAN),2)
      If($a<$ARR_SCAN[$i])
         $a=$ARR_SCAN[$I]
         INC($b,1)
      End_if
      $l[$b]=$l[$b]+1
   End_cyc
   
   //Print(" ",ARRSIZE($l))
   print($l[0] , " ", $l[1], " ",$l[2], " ", $l[3], " ",$l[4], " ", $l[5], " ",$l[6])
   
   $i = 0
   $l_mem = $l[$i]
   WHILE($l[0] ^ $l[1] ^ $l[2] ^ $l[3] ^ $l[4] ^ $l[5] ^ $l[6])     //
     
      $l[$i] = $l[$i] - 1
      IF($l[$i] = -1)
         $l[$i] = $l_mem
         inc($i)
         $l_mem = $l[$i]
      END_IF
     
   END_CYC
   If(($l[0]<2)&($l[1]<2)&($l[2]<2)&($l[3]<2)&($l[4]<2)&($l[5]<2)&($l[6]<2))
      Print("1 или 1-1-1 или 1-1-1-1-1")
   Else
      print($l[0] , " ", $l[1], " ",$l[2], " ", $l[3], " ",$l[4], " ", $l[5], " ",$l[6])
   End_if
   Print("для продолжения нажмите SHIFT")
   WHILE(ISKEYDOWN(#shift)=0)
      waitms(50)
   END_CYC
     WHILE(ISKEYDOWN(#shift)=1)
      waitms(50)
   END_CYC
    GETSCREEN ($x_b-55,$y_b+15,$x_b+694,$y_b+200)
   colormode(6,$x_b-55,$y_b+15,$x_b+694,$y_b+200)
END_CYC
halt
P.S. dramster, как в голову вообще могло прийти такое решение? Великолепно же! Я два дня рылась в справке, пытаясь понять, что там происходит и почему вообще это может работать  ;D, уже была готова сдаться и просить объяснений)
Title: Re: «Pearls before swine»
Post by: dramster on November 30, 2018, 10:02:30 PM
Если кто предложит вариант попроще - можно попробовать.
При 6 колормоде сканпикчер довольно хорошо находит. Правда, если рядов шесть, то в последнем графика чуть меняется (пришлось сделать два шаблона жемчужин). В целом, ручной режим с подсказками готов.

Да я тогда в первую очередь и попробовал сканпикчер. Но чето не находило... находило не то что нужно... да я в принципе сильно и не старался, забил :D .
Но, насчет универсальности я был прав  :( . У меня графику отрисовывает совсем по другому, незнаю почему так  :-\. Картинка шаров совсем не такая, переделал.  base.bmp находит в другом месте, увеличил процент до 94 - стала на место.
В итоге все заработало  :D.
Здорово. Осталось дописать клики по шарам.


P.S. dramster, как в голову вообще могло прийти такое решение? Великолепно же! Я два дня рылась в справке, пытаясь понять, что там происходит и почему вообще это может работать  , уже была готова сдаться и просить объяснений)

  :-\ так я же ничего и не придумал  ;D . Глянув мельком найденное тобой видео я мало что понял, в англ слабоват  :( . Но уже тогда глядя в таблицу в видео понял, что это оператор xor. А далее Graubart более понятно показал на одном примере с пояснениями. Так тут и сразу видно ( пример 5 6 9):

0101   5
xor
0110   6
=
0011   не важно какое число

0011   это получившееся число
xor
1001   9
=
1010   -  хз какое число, но это наша ним сумма как в примере Graubart

Ну и уменьшаем каждое число по порядку, пока ним сумма не станет нулем. Проще некуда  :).
Title: Re: «Pearls before swine»
Post by: Graubart on December 01, 2018, 05:21:47 PM
Вообщето катит, мой код верный  >:( . Просто кликерман считает както не правильно  :-\
Оказывается, если писать оператор словом "xor", то при выполнении он считает чертичто. Если заменить на символ "^", то глюки исчезают  :-\ . Придется учитывать в будущем.
Супер! А я как зациклился когда-то на вычислении ним-суммы через бинар, так даже и не думал о другом варианте. Класс! Код получился легче и красивее. А то раньше мне надо было сначала заполнить массив бинар:
Code: (clickermann) [Select]
FOR($n=0,$n<31)
 $c=0
 $q=0
 $d=$n
   WHILE($d!0)
 $o=$d-2*INT($d/2)
 $c=$c+$o*POW(10,$q)
 $q=$q+1
 $d=INT($d/2)
   END_CYC
 $bin[$n]=$c
    END_CYC
А потом код вычислял ним-сумму сначала для определения хода:
Code: (clickermann) [Select]
$nim=0
   FOR($n=1,$n<(STRLEN($nin)+1))
 $ni=STRCUT($nin,$n,1)
 $ni=$ni-2*INT($ni/2)
 $nim=$nim+$ni*POW(10,(STRLEN($nin)-$n))
   END_CYC
 $lin=0
 $lin1=0
  FOR($n=1,$n<8)
   IF($ball[$n]!0)
 $lin=$lin+1
   END_IF
   IF($ball[$n]=1)
 $lin1=$lin1+1
 $liv=$n
   END_IF
  END_CYC
Потом, если ход мой, прога вычисляет где и сколько снимать:
Code: (clickermann) [Select]
  FOR($li=1,$li<8)
   FOR($bl=0,$bl<($ball[$li]+1))
 $nim=0
 $nin=0
    FOR($pr=1,$pr<(8))
     IF($pr!$li)
 $m=$ball[$pr]
 $nin=$nin+$bin[$m]
     END_IF
    END_CYC
 $nin=$nin+$bin[$bl]
    FOR($n=1,$n<(STRLEN($nin)+1))
 $ni=STRCUT($nin,$n,1)
 $ni=$ni-2*int($ni/2)
 $nim=$nim+$ni*POW(10,(STRLEN($nin)-$n))
    END_CYC
   END_CYC
  END_CYC
А сейчас проще намного. Вот последний полностью оформленный под #autorun вариант:
Code: (clickermann) [Select]
#autorun

 $mes0=STRCONCAT("Помощник для игры «Pearl before swine»")
 $mes0=STRCONCAT($mes0,char(13),char(10))
 $mes0=STRCONCAT($mes0,"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")

begin:
  FOR($n=1,$n<8) // Обнуляем массив
 $ball[$n]=0
  END_CYC

 $mes=STRCONCAT($mes0,char(13),char(10))
 $mes=STRCONCAT($mes,"        ВВОД КОЛИЧЕСТВА ШАРОВ",char(13),char(10),char(13),char(10))
 $mes=STRCONCAT($mes,"           Не более 7 рядов!")
 $inp=INPUTBOX($mes,"Вводи числа, разделяя пробелом",1000000)
  IF($inp="")
 HALT(1)
  END_IF
 $strlen=STRLEN($inp)

// Избавляемся от случайных ошибок ввода
  FOR($n=1,$n<$strlen+1)
   IF((STRCUT($inp,$n,1)<"0") OR (STRCUT($inp,$n,1)>"9"))
 $inp=STRCONCAT(STRCUT2($inp,1,$n-1)," ",STRCUT2($inp,$n+1,$strlen))
   END_IF
  END_CYC
 $strlen=STRLEN($inp)
  FOR($n=1,$n<$strlen+1)
   IF(STRCUT($inp,$n,2)="  ")
    WHILE(STRCUT($inp,$n,2)="  ")
 $inp=STRCONCAT(STRCUT2($inp,1,$n-1),STRCUT2($inp,$n+1,$strlen))
 $strlen=STRLEN($inp)
    END_CYC
   END_IF
  END_CYC
  WHILE(STRCUT($inp,1,1)=" ")
 $inp=STRCUT2($inp,2,$strlen)
 $strlen=STRLEN($inp)
  END_CYC
   WHILE(STRCUT($inp,$strlen,1)=" ")
 $inp=STRCUT2($inp,1,$strlen-1)
 $strlen=STRLEN($inp)
   END_CYC
 $inp=STRCONCAT($inp," ")
 $strlen=STRLEN($inp)

 $lin=0
 $beg=1
  FOR($n=1,$n<$strlen+1)
   IF(STRCUT($inp,$n,1)=" ")
  INC($lin)
 $ball[$lin]=STRCUT2($inp,$beg,$n-1) // Загружаем массив
 $beg=$n+1
   END_IF
  END_CYC
 $linTotal=$lin

   IF($linTotal>7)
 $linTotal=7
   END_IF

 $lin1=0
  FOR($n=1,$n<$linTotal+1)
   IF($ball[$n]=1)
  INC($lin1)
   END_IF
  END_CYC

 $lin=1
 $ball_mem=$ball[$lin]
   WHILE($ball[1]^$ball[2]^$ball[3]^$ball[4]^$ball[5]^$ball[6]^$ball[7])
 $ball[$lin]=$ball[$lin]-1
    IF($ball[$lin]<0)
 $ball[$lin]=$ball_mem
  INC($lin)
 $ball_mem=$ball[$lin]
    END_IF
   END_CYC

  IF($linTotal=1)
 $ball[$lin]=1
  END_IF
   IF(($linTotal-2*(INT($linTotal/2))=0) AND ($lin1>$linTotal-2))
 $ball[$lin]=0
   END_IF
   IF(($linTotal-2*(INT($linTotal/2))>0) AND ($lin1=$linTotal-1))
 $ball[$lin]=1
   END_IF

   IF ($ball_mem=$ball[$lin])
 $mes=STRCONCAT($mes0,char(13),char(10),"                 Передай ход Хуану!")
 $mr=DIALOGBOX($mes,1)
  IF ($mr=2)
 HALT(1)
  END_IF
 GOTO(begin) 
   END_IF

 $mes=$mes0
  FOR($n=1,$n<$linTotal+1)
 $mes=STRCONCAT($mes,char(13),char(10),"    ",$n," ряд  -  ")
   IF($n=$lin)
 $mes=STRCONCAT($mes,$ball_mem,"      <<==  сними ",$ball_mem-$ball[$lin],", оставь ",$ball[$lin])
   ELSE
 $mes=STRCONCAT($mes,$ball[$n])
   END_IF
  END_CYC
 $mr=DIALOGBOX($mes,1)
  IF ($mr=2)
 HALT(1)
  END_IF
 GOTO(begin)
Title: Re: «Pearls before swine»
Post by: Graubart on December 01, 2018, 05:40:51 PM
Теперь буду бот переделывать под твой алгоритм.  :'(
Title: Re: «Pearls before swine»
Post by: Graubart on December 04, 2018, 05:46:52 PM
При 6 колормоде сканпикчер довольно хорошо находит.
Со сканпикчера я начинал. Это не универсальное решение. В разных браузерах бывают сбои. Я пошел другим путем. Приспособил стабильный плеер в отдельном окне. Обошелся PXLCOUNT(10х10 пкс). Рядом прилепил Лог. Слелал озвучку ходов в ответ на реплики Хуана. Скрин внизу.
Что никак не получается, то это освободить мышку, задействовав SENDMESSAGE/POSTMESSAGE/GETMESSAGE. Не могу найти все константы "WM_", да и не занимался этим. Может подсобите или dramster. Но мне кажется вы уже утратили интерес к этой игре.

Quote
Правда, если рядов шесть, то в последнем графика чуть меняется (пришлось сделать два шаблона жемчужин).
Рядов максимум 7 после 23 уровня. Да, графика меняется и меняется размер жемчужин с увеличением рядов. Еще один аргумент в пользу плеера.

Quote
P.S. dramster, как в голову вообще могло прийти такое решение? Великолепно же!
Это великолепно, это супер! Настолько новый взгляд, что я уже переделал все свои проекты под новый алгоритм, хотя и старый работал устойчиво. Просто меня порадовала простота кода в нем.
Кстати, я не стал ждать компилятора от Джонни, а сделал эксешку, вполне нормально рабочую. Зипованная около 6 мег. Могу всем желающим скинуть на мыло в личку, здесь размер файла не позволяет.
Title: Re: «Pearls before swine»
Post by: dramster on December 04, 2018, 10:10:20 PM
Что никак не получается, то это освободить мышку, задействовав SENDMESSAGE/POSTMESSAGE/GETMESSAGE. Не могу найти все константы "WM_", да и не занимался этим.
Вот все константы для мышки - https://docs.microsoft.com/ru-ru/windows/desktop/inputdev/mouse-input-notifications
Для клавы - https://docs.microsoft.com/ru-ru/windows/desktop/inputdev/keyboard-input-notifications
Пример по использованию - http://crapware.aidf.org/forum/index.php?topic=33.msg562#msg562
Готовые к применению подпрограммы  - http://crapware.aidf.org/forum/index.php?topic=2111.0

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

Кстати, а что за плеер такой? И как он работает?

Title: Re: «Pearls before swine»
Post by: Graubart on December 05, 2018, 12:00:40 AM
Вот все константы для мышки...
Вот спасибо за это. Искать некогда, да и идея недавно возникла.

Quote
Может достаточно просто привязаться и все заработает без  всяких постмесаджей?
Да вроде привязался, может не так как надо  :) Но фокусировку бот всё равно похищает при своём ходе. А главное, сбои происходят при перекрытии окна плеера всплывающими окнами.

Quote
Кстати, а что за плеер такой? И как он работает?
Обыкновенный стандартный плеер, немного под себя подфигачил.
Могу ексешку прислать на мыло, если не против, заценишь всё  ;D
Title: Re: «Pearls before swine»
Post by: dramster on December 05, 2018, 12:39:02 AM
Обыкновенный стандартный плеер, немного под себя подфигачил.

 :-\ Не думал, что такие еще существуют. Не пользовался со времен оффлайнового просмотра swf типа масяни и прочего  :D

Скачал макромедиа флеш плеер. Запустил игру. Первое что испытал, это обычная привязка к окну.  :D И, как оказалось, привязка работает без нареканий. И картинку видит, и кликает, и все это в неактивном окне.
Так что ничего не нужно придумывать, просто привязаться к плееру, переписать нужные координаты под режим привязки, и будет он работать не мешая основной работе на пк.

Title: Re: «Pearls before swine»
Post by: Graubart on December 05, 2018, 03:43:04 PM
И картинку видит, и кликает, и все это в неактивном окне.

Да, но когда кликает, окно становится активным. И если в это время другое окно перекроет или мышку дернуть, один клик может быть пропущен - проигрыш. Хуан ошибок не прощает! >:(
Title: Re: «Pearls before swine»
Post by: Graubart on December 06, 2018, 11:10:12 PM
Предлагаю всем желающим протестировать последнюю версию
https://fex.net/get/470614221998/1016552491
Title: Re: «Pearls before swine»
Post by: dramster on December 06, 2018, 11:38:11 PM
 :o Шикарно.

 Работу скрипта даже не проверял  ;D, верю, работает. А шикарно то другое... КАК ты так сламал кликерман, что он невидим, ни окна, ни редактора, и никак не открыть его  :o ? ПРИЗНАВАЙСЯ!!!
 Еще бы файл скрипта както закодировать (дастал его за минуту  ;D)... Как вариант, можно както его заархивировать, и при запуске разархивировать куда-нибудь подальше от глаз пользоватиля, а далее уже запускать разархивированный скрипт. 

Title: Re: «Pearls before swine»
Post by: Vint on December 07, 2018, 10:31:07 AM
Одну партию помогло и захватило мышь в центр кнопки GO.
Пока не прибил, не отпускало.
Title: Re: «Pearls before swine»
Post by: Oraven on December 07, 2018, 11:16:52 AM
А шикарно то другое... КАК ты так сламал кликерман, что он невидим, ни окна, ни редактора, и никак не открыть его  :o ? ПРИЗНАВАЙСЯ!!!

Просто в файле параметров кликера указано положение окна -200 -200
Title: Re: «Pearls before swine»
Post by: Graubart on December 07, 2018, 02:29:05 PM
Одну партию помогло и захватило мышь в центр кнопки GO.
Пока не прибил, не отпускало.

А можно, плз, поподробнее как это "помогло и захватило мышь"? И что значит "Пока не прибил, не отпускало"? Может быть мышка дернулась и Хельпер не успел сделать клик в GO?
Title: Re: «Pearls before swine»
Post by: Vint on December 07, 2018, 02:50:23 PM
Как обычно это происходит  :D ;)
Зависло где-то в цикле с постоянным MOVE. При сдвиге мыши, она постоянно возвращается в одно место.
Дальше 200 px сдвинуть не успеваешь.

Кликов нет, кнопка не нажималась, да и не должна. Это был второй режим с подсказками. "помогло" в смысле это же помощник  :) Наверное нужно было точку поставить после "Одну партию помогло" {сыграть}.
Title: Re: «Pearls before swine»
Post by: Graubart on December 07, 2018, 03:39:53 PM
Кликов нет, кнопка не нажималась, да и не должна. Это был второй режим с подсказками.

В режиме "2. «Референт»" игрок играет сам, то есть читает подсказку, снимает шары в рекомендованном ряду и жмет GO. Хельпер ждет пока Хуан сделает ход и тогда Хельпер считает шары и дает следующую подсказку. Так что не надо "прибивать", надо просто нажать GO.
В режиме "3. «Счетчик»" прямо написано: "Сделай ход и нажми GO"
Title: Re: «Pearls before swine»
Post by: dramster on December 07, 2018, 11:00:11 PM
Одну партию помогло и захватило мышь в центр кнопки GO.
Пока не прибил, не отпускало.

А можно, плз, поподробнее как это "помогло и захватило мышь"? И что значит "Пока не прибил, не отпускало"? Может быть мышка дернулась и Хельпер не успел сделать клик в GO?

Строка 498
Code: (clickermann) [Select]
WHILE($_cursor ! 45)
   MOVE($gox,$goy)
   WAIT(1)
END_CYC

У меня в вин10 код курсора над кнопкой "GO" = 31. Сменил значение, и все заработало.

А что это за написание такое - WAIT(.1)  :-\ . Встретил пару раз в коде. Это наверно сокращенно WAIT(0.1), 100мс?

Еще по мелочам, ... лишний энд_иф 527 стр. ... больше не вникал, итак все работает  :D.
Title: Re: «Pearls before swine»
Post by: dramster on December 07, 2018, 11:01:19 PM
А шикарно то другое... КАК ты так сламал кликерман, что он невидим, ни окна, ни редактора, и никак не открыть его  :o ? ПРИЗНАВАЙСЯ!!!

Просто в файле параметров кликера указано положение окна -200 -200

 :o насколько все просто, а я бы и не догадался  ;D.
Title: Re: «Pearls before swine»
Post by: Graubart on December 08, 2018, 03:52:44 PM
Большое спасибо всем, кто нашел время протестировать проект.

У меня в вин10 код курсора над кнопкой "GO" = 31
Спасибо. Понятно, идея ожидания следующего левела по курсору чревата ошибками. Я совсем забыл, что не так давно установил новую тему курсоров, и у меня код курсора "рука" равен 45. Надо переделать по PXLCOUNT. Так будет универсальнее.

Quote
лишний энд_иф 527 стр.
Лишних энд_ифов нет и не может быть, иначе КМ выдаст ошибку или вовсе зависнет. Скорее всего ты принял метку в конце проекта "end:" за энд_иф. Строк в проекте всего 526.

Quote
А что это за написание такое - WAIT(.1)
Обычное короткое написание. Все языки програмирования и даже калькулятор это принимают. После того как Джонни сделал дробные значения для WAIT, я почти не пользуюсь WAITMS.
Title: Re: «Pearls before swine»
Post by: dramster on December 08, 2018, 09:38:58 PM
Лишних энд_ифов нет и не может быть, иначе КМ выдаст ошибку или вовсе зависнет. Скорее всего ты принял метку в конце проекта "end:" за энд_иф. Строк в проекте всего 526.
У тебя в конфиг файле syntax_check = 0, вот и не  выдает ошибку. А она есть:
(https://i.imgur.com/kQrgkTn.png)

Не знаю как у тебя в проекте строк 526, у меня в твоем проекте показывает вот столько  :) :
(https://i.imgur.com/3tIQc05.png)



Quote
А что это за написание такое - WAIT(.1)
Обычное короткое написание. Все языки програмирования и даже калькулятор это принимают. После того как Джонни сделал дробные значения для WAIT, я почти не пользуюсь WAITMS.

 ::) ... буду знать.
Title: Re: «Pearls before swine»
Post by: Graubart on December 09, 2018, 02:46:25 PM
Не знаю как у тебя в проекте строк 526, у меня в твоем проекте показывает вот столько  :) :

Да, ты прав стопудово!  :-[ Оказывается, я в SFX на файлообменнике залил сырой промежуточный вариант кода. А твои веские замечания сравнивал с конечным домашним файлом. Но когда я распаковал тот файл, то всё понял. Там дофига фигни :-\, даже бинар-массив в начале, который благодаря твоему алгоритму теперь совсем не нужен и энд_иф лишний и мувов лишних наворочено. Потому и строк больше. В общем надо найти время и хорошо всё отредактировать. А главное, заменить пикселькаунтом код курсора.
Title: Re: «Pearls before swine»
Post by: Graubart on December 09, 2018, 03:35:05 PM
Может достаточно просто привязаться и все заработает без  всяких постмесаджей?
Ну ты мой код просмотрел теперь. Какие замечания к привязке?
Вообще я бы хотел, чтоб привязка происходила автоматом,  без всяких хоткеев Alt+W, но так не получается. И когда окно плеера передвигаешь по экрану (правда, только при открытом меню) при следующем ходе код пересчитывает новые координаты. А вот как от этого избавиться, пока не знаю. Я понимаю так, что если привязался, то ничего не надо пересчитывать, КМ сам всё сделает.

Кстати,
  Проблемы при привязке? Есть решение!!!
Code: (clickermann) [Select]
//A_GETSCREEN
SUB(A_GETSCREEN, $A_x1, $A_y1, $A_x2, $A_y2, $A_hwnd)
   WNDGETINFO ($A_hwnd, $A_x0, $A_y0, $A_width, $A_height)
   IF($A_x1+$A_y1+$A_x2+$A_y2 = 0)
      $A_x2 = $A_width
      $A_y2 = $A_height
   END_IF
   GETSCREEN($A_x0+$A_x1,$A_y0+$A_y1,$A_x0+$A_x2,$A_y0+$A_y2)
END_SUB
попробовал этот код, выдаёт ошибку при вызове функции:РОР

(https://i.ibb.co/CwWgTkV/POP.jpg)
Title: Re: «Pearls before swine»
Post by: Vint on December 09, 2018, 10:48:17 PM
Ошибка POP() появляется при вызове подпрограммы выше её описания.
Title: Re: «Pearls before swine»
Post by: dramster on December 10, 2018, 12:22:52 AM
Может достаточно просто привязаться и все заработает без  всяких постмесаджей?
Ну ты мой код просмотрел теперь. Какие замечания к привязке?
Вообще я бы хотел, чтоб привязка происходила автоматом,  без всяких хоткеев Alt+W, но так не получается. И когда окно плеера передвигаешь по экрану (правда, только при открытом меню) при следующем ходе код пересчитывает новые координаты. А вот как от этого избавиться, пока не знаю. Я понимаю так, что если привязался, то ничего не надо пересчитывать, КМ сам всё сделает.

Сорри, но я в твоем коде не смог разобраться  :( . Уж очень много там прыжков на метки  :(.

Взял твой  подсчет шаров... и полностью переделал :D

Если привязаться через hset по WNDFIND, то клики не проходят. Hwnd игрового поля отличается от hwnd окна. Поэтому нужно привязываться либо горячими клавишами, либо брать hwnd с помощью HGET.

Написал для теста код для работы в привязке.  Скрипт считает шары в неактивном окне и убирает лишние. Больше он ничего не делает, при старте шары должны быть на столе, и кнопку go жмем вручную.

Из минусов, у меня картинка на игровом поле при привязке иногда искожается. Скорее всего это чето плееру не нравится.

Code: (clickermann) [Select]
//размер и привязка
$hwnd=WNDFIND("Player.swf")
wait(1)
IF($hwnd = 0)
  print("окна нет")
  halt
END_IF

WNDSIZE ($hwnd,736,736)
waitms(200)


//hwnd игровой области отличен от hwnd окна
//поэтому привязку приходится делать по  HGET
//WNDGETINFO ($hwnd, $var1, $var2, $var3, $var4)
//HSET (HGET($var1+60, $var2+60) , 1)
waitms(200)

$stepx=22
$stepy=18
$stepz=0.36
$y = 456


//считаем шары
GETSCREEN
FOR($a=0,$a<7)
   $ball[$a]=0
   $ball_new[$a] = 0
   FOR($kx=0,$kx<23)
      $x=INT(($stepx+$stepz*$a)*$kx+5)
     
      IF(PXL($x,$y)>15000000)
         $ball[$a]=$ball[$a]+1
         $ball_new[$a]=$ball[$a]
         arrpush($ball_xy, $x)
         arrpush($ball_xy, $y)
      END_IF
   END_CYC
   $y = $y + $stepy
END_CYC


print("было - ",$ball[0] , " ", $ball[1], " ",$ball[2], " ", $ball[3], " ",$ball[4], " ", $ball[5], " ",$ball[6])


//расчеты
$i = 0
$l_mem = $ball_new[$i]
WHILE($ball_new[0] ^ $ball_new[1] ^ $ball_new[2] ^ $ball_new[3] ^ $ball_new[4] ^ $ball_new[5] ^ $ball_new[6])
   $ball_new[$i] = $ball_new[$i] - 1
   IF($ball_new[$i] = -1)
      $ball_new[$i] = $l_mem
      inc($i)
      $l_mem = $ball_new[$i]
   END_IF
END_CYC

print("должно быть - ",$ball_new[0] , " ", $ball_new[1], " ",$ball_new[2], " ", $ball_new[3], " ",$ball_new[4], " ", $ball_new[5], " ",$ball_new[6])

//клики по шарам
FOR($a=0,$a<7)
   IF($ball_new[$a] < $ball[$a])
     
      $i = $ball[$a]
      FOR($i_xy=0,$i_xy<$a)
         $i = $i + $ball[$i_xy]
      END_CYC
         
      LCLICK(451,678)  //клик в пустоту на всякий случай.     
      FOR($n=0,$n<$ball[$a]-$ball_new[$a])     
         $x_click = $ball_xy[$i*2 - 2]
         $y_click = $ball_xy[$i*2 - 1]
         $i = $i - 1
         lclick($x_click,$y_click)
         waitms(500)
      END_CYC

   END_IF
END_CYC


halt




По поводу ошибки POP(), Vint уже оветил. Но скорее всего ты параметр  $A_hwnd упустил.
Title: Re: «Pearls before swine»
Post by: Graubart on December 22, 2018, 11:37:54 PM
Эх, запарка была в конце года, но нашел сейчас время забежать на форум.

Сорри, но я в твоем коде не смог разобраться  :( . Уж очень много там прыжков на метки  :(.
Сам ненавижу эти ужимки и прыжки. Но когда делаешь новый проект, то без этого не обойтись. Потом всё редактируется... Вот теперь у меня ни одной метки нет.

Quote
Взял твой  подсчет шаров... и полностью переделал :D
Что-то я ничего нового не обнаружил, по мелочам больше  :D. А ты сам пробовал запустить свой код где-то после 30 левела?

Quote
Скрипт считает шары в неактивном окне и убирает лишние. Больше он ничего не делает, при старте шары должны быть на столе, и кнопку go жмем вручную.
Это у тебя типа полуавтомат? Опускается сам, а поднимается вручную. ;)

Quote
Из минусов, у меня картинка на игровом поле при привязке иногда искожается. Скорее всего это чето плееру не нравится.
А плеер тот что ты скачал или мой? Моему всё нравится.

Quote
Code: (clickermann) [Select]
IF($hwnd = 0)
  print("[b]окна нет[/b]")
  halt
END_IF
Если окна нет, надо не писать, а закрывать программу.

Quote
Code: (clickermann) [Select]
   FOR($kx=0,$kx<23)
Шаров в рядах бывает больше, чем 23, в двух последних максимум 29.

Quote
Code: (clickermann) [Select]
      LCLICK(451,678)  //клик в пустоту на всякий случай.
Этот клик - верный путь к сбою программы

Quote
По поводу ошибки POP(), Vint уже оветил. Но скорее всего ты параметр  $A_hwnd упустил.
Нет, там просто моя невнимательность и спешка  :-\
Title: Re: «Pearls before swine»
Post by: dramster on December 31, 2018, 11:49:50 AM
Эх, запарка была в конце года, но нашел сейчас время забежать на форум.
Такая же фигня  :( . Постараюсь с большего...

Quote
Что-то я ничего нового не обнаружил, по мелочам больше  . А ты сам пробовал запустить свой код где-то после 30 левела?
Конечно нет  :D . Моя цель была - проверить, как себя поведет кликерман в привязке с игрой. Для этого пришлось набросать тестовый скрипт, так как в твоем пришлось бы разбираться для смены всех координат. С привязкой в неактивном окне при тестах проходил пару уровней и всё.

Quote
Это у тебя типа полуавтомат?
Хз что это у меня  ;D . Скрипт запускал на готовом поле с шарами, нажимаю старт, нужные шары убираются... да бля, я уже и не помню, да и не важно, привязка работает, а это главное... дальше если кому надо - сам разберется, я там вроде в скрипте немного комментировал  :D

Quote
А плеер тот что ты скачал или мой? Моему всё нравится.
В твоем. При игре с привязкой у меня там чето анимация иногда искажалось  :-\, иногда и шары подвисали. Изза этого могло сыграть в проигрыш.

Quote
Если окна нет, надо не писать, а закрывать программу.
:-\ это уж как кто пожелает. Я для себя просто сделал так, чтоб быть уверенным, что окно с игрой нашлось. Если нет, то - сообщение и стоп.

Quote
Шаров в рядах бывает больше, чем 23, в двух последних максимум 29.
Эти данные я взял гдето из твоего скрипта. 23, или 29, как было так и написал...

Quote
Этот клик - верный путь к сбою программы
С чего это вдруг? Я ж написал, то в пустоту, не по шарам, и не по кнопкам. Зачем я добавил этот клик?... было пару случаев, что первый клик по шару не срабатывал (хз почему), поэтому - первый клик на всякий случай внекуда.