Что нового

[Hot Dance Party] Распознавание кнопок и нажатие на них

jufas222

Знающий
Сообщения
93
Репутация
5
Всем доброго времени суток.
Подскажите пожалуйста, как реализовать поочередное нажатие кнопок в игре http://hdp.mail.ru/start.html?site_id=1_325_68422_0_

Вот скриншот когда не нажимаешь указанную клавишу http://s017.radikal.ru/i422/1209/15/e67bd33aaf44.jpg

А вот уже с правильно нажатыми клавишами http://s017.radikal.ru/i438/1209/b2/6c8bc299e801.bmp

Как видно по изображению, после правильного нажатия ячейка с указанной клавишей меняет цвет с синего на зелёный, я попытался с помощью этого кода
Код:
$sa = PixelSearch(391,256,399,261,0x00958C) ;397 256

if not @error Then
	$j = PixelGetColor($sa[0],$sa[1]+54)   ;координаты пикселя  397 308


if $j = 0x008038 then
$jj = 1
Else
    $jj = 0
EndIf

Sleep(250)
if $jj = 1 then
MsgBox(0,"1","1")
EndIf
осуществить задуманное, но потерпел не удачу, я предположил, так как
Код:
PixelSearch
ищет пиксель с лева на право, то можно найти левый край синего кружочка и от него оттолкнувшись с помощью
Код:
PixelGetColor
уже выяснить какую именно кнопку - стрелку нужно нажимать, но у меня не чего не получилось.
 

_ToBe_

Осваивающий
Сообщения
142
Репутация
35
Re: Поочерёдное нажатие кнопок, как показано на картинке.

Всё очень просто!
У тебя ошибка вот в этой строчке:
Код:
if $j = 0x008038 then

а всё потому, что
Код:
$j = PixelGetColor($sa[0],$sa[1]+54)
выдаёт 8-ми значное число типа "10035826"... что б получить число как в ControlViwer надо воспользоваться Хексом
Код:
$color = Hex($j)
MsgBox(0,0,$color)

и ты получишь , что $color = 00008038
 
Автор
J

jufas222

Знающий
Сообщения
93
Репутация
5
Re: Поочерёдное нажатие кнопок, как показано на картинке.

Сам всё таки решил свою проблему, но код в среднем 8 клавиш набирает за 2-3 секунды, этого не достаточно... Подскажите пожалуйста как ускорить
Код:
PixelSearch


Вот, что у меня вышло.
Код:
HotKeySet("{numpad2}","_start")
HotKeySet("{numpad5}","_pause")
HotKeySet("{numpad8}","_exit")

HotKeySet("{numpad9}","_sdvig")

MsgBox(0,"Help","numpad2 = start"&@CRLF&"numpad5 = Pause"&@CRLF&"numpad8 = Exit")

while 1
	Sleep(1000)
WEnd

;407 409
func _start()

while 1

Opt("MouseCoordMode", 2)
Opt("PixelCoordMode", 2)
Opt("SendKeyDelay",2)

$sa = PixelSearch(223,408,507,408,0x444DD4) ; 387 408
	if not @error Then
		$j = PixelSearch($sa[0]+5, $sa[1]+23, $sa[0]+5, $sa[1]+23, 0x76A3FE) ;392 431
        If Not @error Then
			Send("{down}")
		EndIf
	EndIf


$saa = PixelSearch(223,408,507,408,0x444DD4);353 408
	if not @error Then
		$k = PixelSearch($saa[0]+5, $saa[1]+3, $saa[0]+5, $saa[1]+3, 0xB0CCFE) ;358.411
        If Not @error Then

			Send("{up}")
		EndIf
	EndIf



$saaa = PixelSearch(223,408,507,408,0x444DD4);404 408
	if not @error Then
		$l = PixelSearch($saaa[0]+14, $saaa[1]+12, $saaa[0]+14, $saaa[1]+12, 0xE3EFFE) ;418 420
        If Not @error Then

			Send("{right}")
		EndIf
	EndIf


$saaaa = PixelSearch(223,408,507,408,0x444DD4);370 408
	if not @error Then
		$l = PixelSearch($saaaa[0]-4, $saaaa[1]+11, $saaaa[0]-4, $saaaa[1]+11, 0x5BAAFF);366 419
        If Not @error Then

			Send("{left}")
		EndIf
	EndIf

WEnd
EndFunc


func _pause()
	while 1
		Sleep(2000)
	WEnd
EndFunc




func _exit()
	Exit
EndFunc


func _sdvig()
	WinMove("Hot Dance Party","",0,0,800,600,2)
EndFunc
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Re: Поочерёдное нажатие кнопок, как показано на картинке.

А вот так?
Код:
func _start()

Opt("MouseCoordMode", 2)
Opt("PixelCoordMode", 2)
Opt("SendKeyDelay",2)

while 1

	$sa = PixelSearch(223,408,507,408,0x444DD4) ; 387 408
    if not @error Then
        Select
			Case PixelGetColor($sa[0]+5, $sa[1]+23) = 0x76A3FE ;392 431
				Send("{down}")
			Case PixelGetColor($sa[0]+5, $sa[1]+3) = 0xB0CCFE ;358.411
				Send("{up}")
			Case PixelGetColor($sa[0]+14, $sa[1]+12) = 0xE3EFFE ;418 420
				Send("{right}")
			Case PixelGetColor($sa[0]-4, $sa[1]+11) = 0x5BAAFF;366 419
				Send("{left}")
		EndSelect
    EndIf

WEnd
EndFunc
 
Автор
J

jufas222

Знающий
Сообщения
93
Репутация
5
Re: Поочерёдное нажатие кнопок, как показано на картинке.

Спасибо, действительно на много быстрей, но всё равно на сложном уровне(в игре) не хватает буквально пол секунды.
Вы бы не могли мне объяснить принцип работы вашей функции, а то я по моему не понял, и справка не дала результата :(
Я понял так: если пиксель находится, то от него идет поиск кнопочки "по особому пикселю", то есть это такая жи, как и моя функция, только если первый пиксель с кнопочкой не найден, не начинается заново поиск пикселя.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Re: Поочерёдное нажатие кнопок, как показано на картинке.

Да, это модифицированная твоя функция.
Ускорение достигнуто за счет замены PixelSearch на PixelGetColor
плюс PixelSearch вызывается один раз а не 1-4 для каждой стрелки.

Твой PixelSearch мне понравился своей универсальностью - срабатывает для любого количества стрелок. Но, если ты говоришь что всё равно медленно, то придётся и от него отказаться.

Давайт так.
Компилируй этот скрипт и запускай exe-шник.
Код:
#include <File.au3>

HotKeySet("{F9}","_snimok")

$FileName = @ScriptDir & "\points.txt"
$file = FileOpen($FileName, 1)

While 1
	Sleep(10000)
WEnd

FileClose($file)

Func _snimok()
	$sa = PixelSearch(223,408,507,408,0x444DD4)
    if not @error Then FileWriteLine($file,$sa[0]&","&$sa[1])
EndFunc

Потом заходи в игру.
Перед началом каждого уровня, когда все стрелки синие, жми F9.
После этого в фале points.txt будут координаты всех контрольных точек.
Нужно выявить закономерность и после этого переписать функцию _start() в самом боте.

Туплю. 21 вроде.



Добавлено:
Сообщение автоматически объединено:

Код:
func _start()

Opt("MouseCoordMode", 2)
Opt("PixelCoordMode", 2)
Opt("SendKeyDelay",2)

while 1

	$sa = PixelSearch(223,408,507,408,0x444DD4) ; 387 408
    If not @error Then
		For $i=$sa[0] To 507 Step 21 ; <- расстояние между контрольными точками
			Select
				Case PixelGetColor($i+5, 431) = 0x76A3FE ;392 431
					Send("{down}")
				Case PixelGetColor($i+5, 411) = 0xB0CCFE ;358.411
					Send("{up}")
				Case PixelGetColor($i+14, 420) = 0xE3EFFE ;418 420
					Send("{right}")
				Case PixelGetColor($i-4, 419) = 0x5BAAFF;366 419
					Send("{left}")
			EndSelect
		Next		
    EndIf

WEnd
EndFunc
 
Автор
J

jufas222

Знающий
Сообщения
93
Репутация
5
Re: Поочерёдное нажатие кнопок, как показано на картинке.

Ваш скрипт у меня не работает.
Создал .exe
Запустил
Создался .txt
Вошел в игру нажал F9
Посмотрел в .txt, а в нем пусто.

Я не понял зачем это, если в начале каждого раунда 1 клавиша.
Обратите внимание на скриншот, на нём не только клавиши но и бегунок, когда бегунок в середине светлого места нужно нажать пробел, если удачно, то клавиши увеличиваются и так постепенно до 8.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Re: Поочерёдное нажатие кнопок, как показано на картинке.

Я уже понял. Нужно было узнать расстояние между контрольными точками, которые ты искал по
Код:
PixelSearch(223,408,507,408,0x444DD4)

У меня получилось что 21.

Теперь тебе нужна только переписанная функция _start() из моего предыдущего поста.
 
Автор
J

jufas222

Знающий
Сообщения
93
Репутация
5
Re: Поочерёдное нажатие кнопок, как показано на картинке.

Я понял уже, сейчас нашел расстояние у меня вышло 34, работает, но проверил на низком уровне, сейчас уровень завершится попробую на сложном.


Добавлено:
Сообщение автоматически объединено:

Да это, то что нужно, очень быстро набираются кнопочки, большое вам спасибо :smile:, но изначально я выбрал игру, что бы потренироваться в написании бота, но так вышло, что за меня всё сделали, а я так и не понял, как добился такого хорошего результата, вы бы не могли мне уделить ещё не много времени и обьяснить вашу функцию.
Как понял я: строкой
Код:
For $i=$sa[0] To 507 Step 21
мы сделали так, что если кнопка найдена, отступаем до следующего контрольного пикселя и от него ищем кнопочку, и так далее до конца, а конечный пиксель 507? То есть, если пиксель найден по координатам 303,408 то от него ищется кнопочка, после её нахождения к 303 прибавляется 34 и опять идёт поиск кнопочки по контрольному пикселю, и так далее, пока не дойдет до 507?
Но почему тогда на месте
Код:
For $i=$sa[0]
нельзя было написать 223 и на оборот, почему нельзя написать за место
Код:
To 507
,
Код:
To $sa[1]
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Re: Поочерёдное нажатие кнопок, как показано на картинке.

Название игры укажи как положено и где положено

Предупреждение За нарушение правил форума (пункт Б.5):
Имя темы должно нести смысловую нагрузку (отражать суть вопроса/проблемы)
Правильно сформулированное название темы привлекает больше внимания, и шансы получить конкретный ответ увеличиваются.


Данные правила могут пополняться локальными правилами раздела.
Как правильно называть темы

"Поочерёдное нажатие кнопок, как показано на картинке." - это неприемлемое название темы, переименуйте тему иначе она будет закрыта, а вам возможно будет выдан бан на несколько дней.

С уважением, ваш Модератор.











Добавлено:
Сообщение автоматически объединено:

Предупреждение За нарушение правил форума (пункт Б.5):
Имя темы должно нести смысловую нагрузку (отражать суть вопроса/проблемы)
Правильно сформулированное название темы привлекает больше внимания, и шансы получить конкретный ответ увеличиваются.


Данные правила могут пополняться локальными правилами раздела.
Как правильно называть темы

"Поочерёдное нажатие кнопок, для игры Hot Dance Party" - это неприемлемое название темы, переименуйте тему иначе она будет закрыта, а вам возможно будет выдан бан на несколько дней.

С уважением, ваш Модератор.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
jufas,
это ж твой алгоритм, я просто оптимизировал код.
При оптимизации кода в первую очередь я смотрю на две вещи:
- работа с графикой;
- работа с диском.
С диском твой скрипт не работает, а вот графических функций было в избытке. Я просто по максимуму от них избавился.

Код:
For $i=$sa[0] To 507 Step 34

Да, находим первую контрольную точку и к её координате прибавлем по 34 и попадаем на следующую контрольную точку, пока не достигнем 507.
Почему 507?
Потому что у тебя так было написано
Код:
$sa = PixelSearch(223,408,507,408,0x444DD4)

То есть это ТЫ определил, что правее 507 стрелок уже быть не может.

Почему не
Код:
For $i=233 To 507 Step 34

Потому что на твоих скриншотах только варианты с чётным количеством стрелок. Я не знаю сдвигаются ли стрелки, если их нечётное количество. То есть я не уверен что при нечётном количестве стрелок 233 - это правильная стартовая позиция. Поэтому я оставил придуманный тобой PixelSearch.
(вот почему важно дать как можно больше информации при постановке задачи)

Почему нельзя
Код:
For $i=$sa[0] To $sa[1] Step 34

Вот это ты уже притормаживаешь...
Потому что $sa[1] равно 408
http://autoit-script.ru/autoit3_docs/functions/PixelSearch.htm
 
Верх