Автокликер Clickermann :: Форум
Основной раздел => Использование => Topic started by: Graubart on November 23, 2018, 04:00:35 PM
-
Вот занятная интеллектуальная игруха на сайте http://www.transience.com.au/pearl3.html.
Интересно, кто-нибудь пытался с помощью КМ создать достойного противника Хуану? Такого, чтоб сам играл с ним, не проигрывая.
-
Задачка, конечно, оригинальная и занятная. Но только одна проблема - перед тем, как писать код, надо четко понимать логику игры. По большому счету, реально написать может лишь тот, кто превосходно в эту игру играет вживую (ну если речь не про сбор информации, проведение сотен неудачных игр со случайным результатом, и записывании под каждый уровень нескольких -в зависимости от поведения противника- сработавших алгоритмов).
Первый вариант не смогу, хоть игра и математическая (т.е. один неверный ход - и ты проиграл), но ближе чем за 3 хода до конца не могу предугадать, кто кого. Стратегий увидела несколько - если 2 строки - то оставлять противнику поровну в строчках (доведение до ситуации 2-2). При трех строчках - если в 1 строке 1 шарик, то делать так, чтобы сумма его и второй строки была равна третьей. И перевод ситуации в 1-2-3, или 2-2, или 1-1-1. Ещё кучу правил понять не удалось - хотя и полчаса там провисела, дошла лишь до 7.
Второй вариант - поиск экспериментальным путем правильных решений и их запись для каждого уровня. Если честно, немного лениво это делать... Но если хотите, начинайте, ошибки подправить поможем. А как соберете мозайку насчет выигрышной стратегии игры, расскажите нам - глядишь и поймем, как выигрывать незнакомые раунды и сделать бот по первому варианту)
-
Ещё кучу правил понять не удалось - хотя и полчаса там провисела, дошла лишь до 7.
:o :o :o :( :-[
Я сейчас тоже гдето пол часа как прочел твой пост и глянул что там за игруля.
Я с трудом смог пройти второй уровень, ито с помощью твоих подсказок. >:( Мозг вспух, щяс не смогу уснуть... :'(
-
: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 раза обычно раунд поддавался. Сразу решила, что понимать там бессмысленно - для анализа попросту нет базы, а подсказать, в правильном ли направлении мыслю некому. А так получился "китайский метод определения пола цыплят" или что-то в этом духе (пока не дошли до больших цифр, где он уже не сработал).
-
Вот занятная интеллектуальная игруха на сайте http://www.transience.com.au/pearl3.html.
Интересно, кто-нибудь пытался с помощью КМ создать достойного противника Хуану? Такого, чтоб сам играл с ним, не проигрывая.
Поиграла немного с правильной стратегией. Невозможно создать достойного противника Хуану, чтобы всегда выигрывать. Периодически в раунде изначально нам предлагают заведомо проигрышное количество жемчуга: придется взять жемчужину и нажать на New game, записывают как поражение. Иногда и несколько раз подряд нерабочий раунд предлагают. Создать неплохо играющего моба, который выяснит заканчиваются ли у Хуана раунды или генерируются бесконечно - вполне можно, но в целом для игры калькулятора переводящего из двоичной в десятеричную (и наоборот) вполне хватит.
https://prnt.sc/lnyizj
//Перевод числа в двоичную систему
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
-
Поиграла немного с правильной стратегией. Невозможно создать достойного противника Хуану, чтобы всегда выигрывать. Периодически в раунде изначально нам предлагают заведомо проигрышное количество жемчуга: придется взять жемчужину и нажать на 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, Хуан выиграет.
Понятно, в уме это делать тяжеловато, надо писать прогу.
-
На приведенном мною сайте я обнаружил эту игру 16 лет назад. Тогда я владел только Бейсиком и написал код помощника в игре. Надо было вводить в инпут к-во шаров в каждом ряду, а он выдавал где и сколько их снимать. Потом писал код на языках более высокого уровня. Но это было просто диалоговое общение с помощником. Когда я обнаружил КМ, перевел всё в код КМ, но не хватало некоторых процедур и функций, я ненавязчиво просил Johnny добавить кое-что.
И вот в последней версии "Clickermann v4.14 x32" всё, что надо, есть. Я назвал свою прогу *Helper*.
Код работает в трех режимах:
1. «Автомат» - *Helper* играет самостоятельно
2. «Референт» - *Helper* считает шары и даёт подсказку
3. «Счетчик» - *Helper* считает шары без подсказки
Мой *Helper* прошел автоматом 105 уровней за 3 часа 38 минут. Прога делает скрин в начале каждого левела и ведет лог.
Сегодня бот прошел 58 левелов за 1 час 39 мин.
-
Что интересно после 99 level - scores остается, а level становится 00. Затем level становится 01, scores обнуляется, но количество шаров намного больше, чем в начале.
-
Так этож оператор XOR :D ! С одной стороны вроде сложная задача, а решение в пару строк ;D
$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
Щас попробую накидать код для использавания на автомате. Нужно еще добавить проигрышный вариант для пропуска.
-
С одной стороны вроде сложная задача, а решение в пару строк ;D
Щас попробую накидать код для использавания на автомате. Нужно еще добавить проигрышный вариант для пропуска.
Отлично! Я старался разжевать, как можно проще. Мне интересны любые решения. У вас оригинально, я сделал иначе... Может кто-нибудь ещё предложит разные решения
-
Щас попробую накидать код для использавания на автомате. Нужно еще добавить проигрышный вариант для пропуска.
Главное, не забывать что рядов может быть 7, до трех операндов XOR ещё работает, а вот больше - буксует.
-
Так это не проблема, самое простое, это дописать еще 4 ряда :), и если их нет, то прописать их нулями.
$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 и подсчетом белых пикселей по горизонту в каждом ряду и делении на ширину одного шара, но тут нужы точные входящие координаты, даже не начинал писать. Да и не комфортно на не домашнем глючном ноуте :(.
Если кто предложит вариант попроще - можно попробовать.
-
Не, не катит через ксор, 3 ряда еще рулит, а дальше пургу гонит.
Подожду пока Джонни компилятор сделает, тогда эксешку выложу на полный вариант. Щас, если хошь, выложу в диалоговом варианте.
-
А потом мальчики и девочки, будут постоянно ныть на форуме и ковыряя в носу, требовать обещанный компилятор, ссылаясь на данное провокационное сообщение.
Вы твёрдо уверены, что компилятор обещан и его нужно ждать?
или нет. учитывая что вы вообще хотите ограничить запуск скрипта.
кароч ждите компиляции. хоть какой то
-
Ключевое слово здесь "ждите" :) :D
-
Ключевое слово здесь "ждите" :) :D
Почти по Библии: ;)
"Ждите, и обрящете"
-
В какое страшное время мы живём!
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)
-
Вы подеритесь еще ;D . Нашли место... Тут глобальные вопросы решаются, а вы...
По теме:
Не, не катит через ксор, 3 ряда еще рулит, а дальше пургу гонит.
Вообщето катит, мой код верный >:( . Просто кликерман считает както не правильно :-\
Оказывается, если писать оператор словом "xor", то при выполнении он считает чертичто. Если заменить на символ "^", то глюки исчезают :-\ . Придется учитывать в будущем.
$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
$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
-
Если кто предложит вариант попроще - можно попробовать.
При 6 колормоде сканпикчер довольно хорошо находит. Правда, если рядов шесть, то в последнем графика чуть меняется (пришлось сделать два шаблона жемчужин). В целом, ручной режим с подсказками готов.
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, уже была готова сдаться и просить объяснений)
-
Если кто предложит вариант попроще - можно попробовать.
При 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
Ну и уменьшаем каждое число по порядку, пока ним сумма не станет нулем. Проще некуда :).
-
Вообщето катит, мой код верный >:( . Просто кликерман считает както не правильно :-\
Оказывается, если писать оператор словом "xor", то при выполнении он считает чертичто. Если заменить на символ "^", то глюки исчезают :-\ . Придется учитывать в будущем.
Супер! А я как зациклился когда-то на вычислении ним-суммы через бинар, так даже и не думал о другом варианте. Класс! Код получился легче и красивее. А то раньше мне надо было сначала заполнить массив бинар:
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
А потом код вычислял ним-сумму сначала для определения хода:
$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
Потом, если ход мой, прога вычисляет где и сколько снимать:
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 вариант:
#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)
-
Теперь буду бот переделывать под твой алгоритм. :'(
-
При 6 колормоде сканпикчер довольно хорошо находит.
Со сканпикчера я начинал. Это не универсальное решение. В разных браузерах бывают сбои. Я пошел другим путем. Приспособил стабильный плеер в отдельном окне. Обошелся PXLCOUNT(10х10 пкс). Рядом прилепил Лог. Слелал озвучку ходов в ответ на реплики Хуана. Скрин внизу.
Что никак не получается, то это освободить мышку, задействовав SENDMESSAGE/POSTMESSAGE/GETMESSAGE. Не могу найти все константы "WM_", да и не занимался этим. Может подсобите или dramster. Но мне кажется вы уже утратили интерес к этой игре.
Правда, если рядов шесть, то в последнем графика чуть меняется (пришлось сделать два шаблона жемчужин).
Рядов максимум 7 после 23 уровня. Да, графика меняется и меняется размер жемчужин с увеличением рядов. Еще один аргумент в пользу плеера.
P.S. dramster, как в голову вообще могло прийти такое решение? Великолепно же!
Это великолепно, это супер! Настолько новый взгляд, что я уже переделал все свои проекты под новый алгоритм, хотя и старый работал устойчиво. Просто меня порадовала простота кода в нем.
Кстати, я не стал ждать компилятора от Джонни, а сделал эксешку, вполне нормально рабочую. Зипованная около 6 мег. Могу всем желающим скинуть на мыло в личку, здесь размер файла не позволяет.
-
Что никак не получается, то это освободить мышку, задействовав 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
Работоспособность зависит от твоего плеера. Может достаточно просто привязаться и все заработает без всяких постмесаджей?
Кстати, а что за плеер такой? И как он работает?
-
Вот все константы для мышки...
Вот спасибо за это. Искать некогда, да и идея недавно возникла.
Может достаточно просто привязаться и все заработает без всяких постмесаджей?
Да вроде привязался, может не так как надо :) Но фокусировку бот всё равно похищает при своём ходе. А главное, сбои происходят при перекрытии окна плеера всплывающими окнами.
Кстати, а что за плеер такой? И как он работает?
Обыкновенный стандартный плеер, немного под себя подфигачил.
Могу ексешку прислать на мыло, если не против, заценишь всё ;D
-
Обыкновенный стандартный плеер, немного под себя подфигачил.
:-\ Не думал, что такие еще существуют. Не пользовался со времен оффлайнового просмотра swf типа масяни и прочего :D
Скачал макромедиа флеш плеер. Запустил игру. Первое что испытал, это обычная привязка к окну. :D И, как оказалось, привязка работает без нареканий. И картинку видит, и кликает, и все это в неактивном окне.
Так что ничего не нужно придумывать, просто привязаться к плееру, переписать нужные координаты под режим привязки, и будет он работать не мешая основной работе на пк.
-
И картинку видит, и кликает, и все это в неактивном окне.
Да, но когда кликает, окно становится активным. И если в это время другое окно перекроет или мышку дернуть, один клик может быть пропущен - проигрыш. Хуан ошибок не прощает! >:(
-
Предлагаю всем желающим протестировать последнюю версию
https://fex.net/get/470614221998/1016552491
-
:o Шикарно.
Работу скрипта даже не проверял ;D, верю, работает. А шикарно то другое... КАК ты так сламал кликерман, что он невидим, ни окна, ни редактора, и никак не открыть его :o ? ПРИЗНАВАЙСЯ!!!
Еще бы файл скрипта както закодировать (дастал его за минуту ;D)... Как вариант, можно както его заархивировать, и при запуске разархивировать куда-нибудь подальше от глаз пользоватиля, а далее уже запускать разархивированный скрипт.
-
Одну партию помогло и захватило мышь в центр кнопки GO.
Пока не прибил, не отпускало.
-
А шикарно то другое... КАК ты так сламал кликерман, что он невидим, ни окна, ни редактора, и никак не открыть его :o ? ПРИЗНАВАЙСЯ!!!
Просто в файле параметров кликера указано положение окна -200 -200
-
Одну партию помогло и захватило мышь в центр кнопки GO.
Пока не прибил, не отпускало.
А можно, плз, поподробнее как это "помогло и захватило мышь"? И что значит "Пока не прибил, не отпускало"? Может быть мышка дернулась и Хельпер не успел сделать клик в GO?
-
Как обычно это происходит :D ;)
Зависло где-то в цикле с постоянным MOVE. При сдвиге мыши, она постоянно возвращается в одно место.
Дальше 200 px сдвинуть не успеваешь.
Кликов нет, кнопка не нажималась, да и не должна. Это был второй режим с подсказками. "помогло" в смысле это же помощник :) Наверное нужно было точку поставить после "Одну партию помогло" {сыграть}.
-
Кликов нет, кнопка не нажималась, да и не должна. Это был второй режим с подсказками.
В режиме "2. «Референт»" игрок играет сам, то есть читает подсказку, снимает шары в рекомендованном ряду и жмет GO. Хельпер ждет пока Хуан сделает ход и тогда Хельпер считает шары и дает следующую подсказку. Так что не надо "прибивать", надо просто нажать GO.
В режиме "3. «Счетчик»" прямо написано: "Сделай ход и нажми GO"
-
Одну партию помогло и захватило мышь в центр кнопки GO.
Пока не прибил, не отпускало.
А можно, плз, поподробнее как это "помогло и захватило мышь"? И что значит "Пока не прибил, не отпускало"? Может быть мышка дернулась и Хельпер не успел сделать клик в GO?
Строка 498
WHILE($_cursor ! 45)
MOVE($gox,$goy)
WAIT(1)
END_CYC
У меня в вин10 код курсора над кнопкой "GO" = 31. Сменил значение, и все заработало.
А что это за написание такое - WAIT(.1) :-\ . Встретил пару раз в коде. Это наверно сокращенно WAIT(0.1), 100мс?
Еще по мелочам, ... лишний энд_иф 527 стр. ... больше не вникал, итак все работает :D.
-
А шикарно то другое... КАК ты так сламал кликерман, что он невидим, ни окна, ни редактора, и никак не открыть его :o ? ПРИЗНАВАЙСЯ!!!
Просто в файле параметров кликера указано положение окна -200 -200
:o насколько все просто, а я бы и не догадался ;D.
-
Большое спасибо всем, кто нашел время протестировать проект.
У меня в вин10 код курсора над кнопкой "GO" = 31
Спасибо. Понятно, идея ожидания следующего левела по курсору чревата ошибками. Я совсем забыл, что не так давно установил новую тему курсоров, и у меня код курсора "рука" равен 45. Надо переделать по PXLCOUNT. Так будет универсальнее.
лишний энд_иф 527 стр.
Лишних энд_ифов нет и не может быть, иначе КМ выдаст ошибку или вовсе зависнет. Скорее всего ты принял метку в конце проекта "end:" за энд_иф. Строк в проекте всего 526.
А что это за написание такое - WAIT(.1)
Обычное короткое написание. Все языки програмирования и даже калькулятор это принимают. После того как Джонни сделал дробные значения для WAIT, я почти не пользуюсь WAITMS.
-
Лишних энд_ифов нет и не может быть, иначе КМ выдаст ошибку или вовсе зависнет. Скорее всего ты принял метку в конце проекта "end:" за энд_иф. Строк в проекте всего 526.
У тебя в конфиг файле syntax_check = 0, вот и не выдает ошибку. А она есть:
(https://i.imgur.com/kQrgkTn.png)
Не знаю как у тебя в проекте строк 526, у меня в твоем проекте показывает вот столько :) :
(https://i.imgur.com/3tIQc05.png)
А что это за написание такое - WAIT(.1)
Обычное короткое написание. Все языки програмирования и даже калькулятор это принимают. После того как Джонни сделал дробные значения для WAIT, я почти не пользуюсь WAITMS.
::) ... буду знать.
-
Не знаю как у тебя в проекте строк 526, у меня в твоем проекте показывает вот столько :) :
Да, ты прав стопудово! :-[ Оказывается, я в SFX на файлообменнике залил сырой промежуточный вариант кода. А твои веские замечания сравнивал с конечным домашним файлом. Но когда я распаковал тот файл, то всё понял. Там дофига фигни :-\, даже бинар-массив в начале, который благодаря твоему алгоритму теперь совсем не нужен и энд_иф лишний и мувов лишних наворочено. Потому и строк больше. В общем надо найти время и хорошо всё отредактировать. А главное, заменить пикселькаунтом код курсора.
-
Может достаточно просто привязаться и все заработает без всяких постмесаджей?
Ну ты мой код просмотрел теперь. Какие замечания к привязке?
Вообще я бы хотел, чтоб привязка происходила автоматом, без всяких хоткеев Alt+W, но так не получается. И когда окно плеера передвигаешь по экрану (правда, только при открытом меню) при следующем ходе код пересчитывает новые координаты. А вот как от этого избавиться, пока не знаю. Я понимаю так, что если привязался, то ничего не надо пересчитывать, КМ сам всё сделает.
Кстати,
Проблемы при привязке? Есть решение!!!//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)
-
Ошибка POP() появляется при вызове подпрограммы выше её описания.
-
Может достаточно просто привязаться и все заработает без всяких постмесаджей?
Ну ты мой код просмотрел теперь. Какие замечания к привязке?
Вообще я бы хотел, чтоб привязка происходила автоматом, без всяких хоткеев Alt+W, но так не получается. И когда окно плеера передвигаешь по экрану (правда, только при открытом меню) при следующем ходе код пересчитывает новые координаты. А вот как от этого избавиться, пока не знаю. Я понимаю так, что если привязался, то ничего не надо пересчитывать, КМ сам всё сделает.
Сорри, но я в твоем коде не смог разобраться :( . Уж очень много там прыжков на метки :(.
Взял твой подсчет шаров... и полностью переделал :D
Если привязаться через hset по WNDFIND, то клики не проходят. Hwnd игрового поля отличается от hwnd окна. Поэтому нужно привязываться либо горячими клавишами, либо брать hwnd с помощью HGET.
Написал для теста код для работы в привязке. Скрипт считает шары в неактивном окне и убирает лишние. Больше он ничего не делает, при старте шары должны быть на столе, и кнопку go жмем вручную.
Из минусов, у меня картинка на игровом поле при привязке иногда искожается. Скорее всего это чето плееру не нравится.
//размер и привязка
$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 упустил.
-
Эх, запарка была в конце года, но нашел сейчас время забежать на форум.
Сорри, но я в твоем коде не смог разобраться :( . Уж очень много там прыжков на метки :(.
Сам ненавижу эти ужимки и прыжки. Но когда делаешь новый проект, то без этого не обойтись. Потом всё редактируется... Вот теперь у меня ни одной метки нет.
Взял твой подсчет шаров... и полностью переделал :D
Что-то я ничего нового не обнаружил, по мелочам больше :D. А ты сам пробовал запустить свой код где-то после 30 левела?
Скрипт считает шары в неактивном окне и убирает лишние. Больше он ничего не делает, при старте шары должны быть на столе, и кнопку go жмем вручную.
Это у тебя типа полуавтомат? Опускается сам, а поднимается вручную. ;)
Из минусов, у меня картинка на игровом поле при привязке иногда искожается. Скорее всего это чето плееру не нравится.
А плеер тот что ты скачал или мой? Моему всё нравится.
IF($hwnd = 0)
print("[b]окна нет[/b]")
halt
END_IF
Если окна нет, надо не писать, а закрывать программу.
FOR($kx=0,$kx<23)
Шаров в рядах бывает больше, чем 23, в двух последних максимум 29.
LCLICK(451,678) //клик в пустоту на всякий случай.
Этот клик - верный путь к сбою программы
По поводу ошибки POP(), Vint уже оветил. Но скорее всего ты параметр $A_hwnd упустил.
Нет, там просто моя невнимательность и спешка :-\
-
Эх, запарка была в конце года, но нашел сейчас время забежать на форум.
Такая же фигня :( . Постараюсь с большего...
Что-то я ничего нового не обнаружил, по мелочам больше . А ты сам пробовал запустить свой код где-то после 30 левела?
Конечно нет :D . Моя цель была - проверить, как себя поведет кликерман в привязке с игрой. Для этого пришлось набросать тестовый скрипт, так как в твоем пришлось бы разбираться для смены всех координат. С привязкой в неактивном окне при тестах проходил пару уровней и всё.
Это у тебя типа полуавтомат?
Хз что это у меня ;D . Скрипт запускал на готовом поле с шарами, нажимаю старт, нужные шары убираются... да бля, я уже и не помню, да и не важно, привязка работает, а это главное... дальше если кому надо - сам разберется, я там вроде в скрипте немного комментировал :D
А плеер тот что ты скачал или мой? Моему всё нравится.
В твоем. При игре с привязкой у меня там чето анимация иногда искажалось :-\, иногда и шары подвисали. Изза этого могло сыграть в проигрыш.
Если окна нет, надо не писать, а закрывать программу.
:-\ это уж как кто пожелает. Я для себя просто сделал так, чтоб быть уверенным, что окно с игрой нашлось. Если нет, то - сообщение и стоп.
Шаров в рядах бывает больше, чем 23, в двух последних максимум 29.
Эти данные я взял гдето из твоего скрипта. 23, или 29, как было так и написал...
Этот клик - верный путь к сбою программы
С чего это вдруг? Я ж написал, то в пустоту, не по шарам, и не по кнопкам. Зачем я добавил этот клик?... было пару случаев, что первый клик по шару не срабатывал (хз почему), поэтому - первый клик на всякий случай внекуда.