Что нового

Автоматизация игры Olymp(Вконтакте)

syseye

Новичок
Сообщения
1
Репутация
0
В общих чертах наткнулся на флеш-игру /Olymp во Вконтакте. Сама игра доступна тут
Основная задача игры - нечто вроде игры "шарики", надо перемещать разноцветные камни, и составлять из них комбинации одного цвета, цепочкой от 3шт. по вертикали\горизонтали. Основная цель - набрать как можно больше очков, проходя уровни(составив цепочку на определенных ячейка) и получая на каждом новом уровне больше очков чем на предыдущих. Так-же есть бомбы\супербомбы, облегчающие процесс прохождения.

На первых порах накатал небольшой "анализатор" игры, под Мозиллу ФайрФокс(расширение 1024*768). И не знаю как лучше всего подобратся к анализу ячеек. Поэтому хочу услышать предложения что и как удобнее будет реализовать, и какие ошибки я уже наделал.
Код тут:
Выложил бы файлом, да не вижу где тут.
Код:
#include <GUIConstants.au3>;
#include <Array.au3>;
Opt("WinTextMatchMode", "2"); Способ сопоставления образца с текстом окна при операции поиска. 
Opt("PixelCoordMode", "1"); 1 = абсолютные координаты экрана (стандартное значение).
AutoItSetOption("MustDeclareVars", 1); 1 - надо объявлять все переменные с которыми работаем. Не плодим быдло-код.

; E:\Soft\autoit\Examples\My\PIC
;########################################################################################################
;########################################################################################################
;########################################################################################################
;Var\TYPES
Global  $fGame = 1; //флаг что мы в цикле работаем
Global $game, $nMsg;
Global  $FlashX, $FlashY; - расположение флешки внутри окна
Global Const $FlashCont = "MozillaWindowClass6";
Global Const $ffwinName = "VK | Олимп";
Global Const $TablX = 40, $TablY = 48; - лев. верх. угол 1-й ячейкй относительно флеш.;
Global Const $Width = 44, $Height = 44; ширина и высота ячеек. 
Global Const $Size = 8; размерность массива(8х8);
Global Const $PrName = 'Bubble!'; загаловок скрипта
Global Const $ClrTmr3 = 3949469229; эксперементально полученое значение рамочки с надписью таймер;
Dim $avArray[$Size][$Size][2]; // массив 8х8; первая компонента - строка , вторая столбец;
Dim $InputArray[$Size][$Size][2]; // где элементы от 0--7 - отображаемый массив;
Dim $GameStart = false;
Dim $Colors[6]   = [  418453263, 1275602347, 1303711011, 1332353218,  3689419844, 3716552041  ];
Dim $SmallBomb[7] = [ 3768063040, 3824030806, 3834319976, 3850638438,  3860862066, 3878753381, 3897431147 ];
					;violet,    silver,     green ,      yellow,      red,        blue;		 bomb!;
Global $BBomb[14] =[  56038677, 59446550 , 77600038, 97195317, 97588534, 108598565,   _
					111023419, 113120572, 113775932, 138220909, 141432150, 150541662, _
					160175474, 189470074 ] 

;######################################################################################################## 
;######################################################################################################## 
;######################################################################################################## 




;####################################################
;Create Form
$game = GUICreate($PrName, 26*8, 26*8, 20, 20);
for $i = 0 to $Size - 1
	for $j = 0 to $Size - 1
		$InputArray[$i][$j][0] = GUICtrlCreateInput("-1", $j*26, $i*26 , 25, 25); 
		$InputArray[$i][$j][1] = "";
	Next
Next
WinSetOnTop ( $PrName, "", "1"); -поверх всех окон;
;Create Form
;#################################################### Create Form




;########################################################################################################
;Установска координат для работы с флешкой
;Вызвать один раз в начале программы.
func SetFlashOXY()
dim $Temp[2] = [0,0];
	$Temp = ControlGetPos($ffwinName, '' , $FlashCont);
	$FlashX = $Temp[0]+1; 
	$FlashY = $Temp[1] ;
EndFunc;
;Установска координат для работы с флешкой
;########################################################################################################


;Функция используемая для  получения кода ячейки, не явл-ся ;кристаллом
func GetBlup()
dim $temp, $Prev, $left = "0", $up = "0";
	for $i = 0 to $Size - 1
		for $j = 0 to $Size - 1 
			$left = $FlashX + $TablX + $Width /2  + $j * $Width; Указание центров ячеек по оси Х - двигаемя по столбцам
			$up   = $FlashX + $TablY + $Height/2 + $i * $Height; по оси У - двигаемся про строкам вниз
			$temp = PixelChecksum( $left - 3 , $up -3, $left + 3 , $up + 3, "2" ); получение зна-я цвета в ячейке(среднее);
			$left = _ArrayBinarySearch( $Colors, $temp ); индекс цвета в массиве
			if ($left = -1) then	
				ClipPut($temp);		
					
			EndIf;
			
			
		Next		
	Next
EndFunc;
;Функция используемая для  получения кода ячейки, не явл-ся ;кристаллом


;########################################################################################################
;Функция заполнения массива значениями с экрана;
func GetBlupArray()
Local $temp, $Prev, $Number, $left = "0", $up = "0";
	for $i = 0 to $Size - 1
		for $j = 0 to $Size - 1 
			$left = $FlashX + $TablX + $Width /2  + $j * $Width; Указание центров ячеек по оси Х - двигаемя по столбцам
			$up   = $FlashX + $TablY + $Height/2 + $i * $Height; по оси У - двигаемся про строкам вниз
			$temp = PixelChecksum( $left - 3 , $up -3, $left + 3 , $up + 3, "2" ); получение зна-я цвета в ячейке(среднее);
			$Number = _ArrayBinarySearch( $Colors, $temp ); индекс цвета в массиве
			if	$Number = "-1" then 
				$Number = _ArrayBinarySearch( $SmallBomb, $temp ); а вдруг бомба :О
				if	$Number <>"-1" then $Number = "6";
			EndIf
			
			if	$Number = "-1" then 
				$Number = _ArrayBinarySearch( $BBomb, $temp ); а вдруг большая бомба?
				if	$Number <>"-1" then $Number = "7";
			EndIf
										
			$Prev = GUICtrlRead ( $InputArray[$i][$j][0]); - предыдущее значение ячейки;
			if ($Prev <> $Number )and($Number <> -1) then	
					GUICtrlSetData ( $InputArray[$i][$j][0],   $Number ); заносим значение цвета в гуи формочку;
			EndIf;
			
			
		Next		
	Next
EndFunc;
;Функция заполнения массива значениями с экрана;
;########################################################################################################




;########################################################################################################
;Функция очистки массива;
func NullBlupArray();
	for $i = 0 to $Size - 1
		for $j = 0 to $Size - 1 
				GUICtrlSetData ( $InputArray[$i][$j][0],   "-1" ); заносим значение цвета в гуи формочку;
				GUICtrlSetData ( $InputArray[$i][$j][1],   "0" );
				
		Next; 
	Next; 
EndFunc;
;Функция очистки массива;
;########################################################################################################




;########################################################################################################
func _Exit();
	Exit;
EndFunc;
;########################################################################################################



;########################################################################################################
;Получение существования надписи "очки" == проверка что идет игра, возвращает 1 - если игра начата;
Func GetColorTimer();
dim $temp = 0;
	$temp = PixelChecksum( 55 + $FlashX, $FlashY+15, $FlashX + 70 , $FlashY+27, 4);
	;числа взяты от балды, около надписи "очки"
	if $temp = $ClrTmr3 Then
			Return 1
		Else
			Return 0;
	EndIf
		
EndFunc;
;Получение существования надписи "очки" == проверка что идет игра
;########################################################################################################




;########################################################################################################
;########################################################################################################
;#Program

HotKeySet("{Esc}","_Exit");
HotKeySet("{z}","GetBlup");


If WinExists($ffwinName) Then
	WinActivate($ffwinName); открываем игру
	GUISetState(@SW_SHOW); показываем формочку
	SetFlashOXY();

	While 1  ; бесконечный цикл
	;#############################GUI
		$nMsg = GUIGetMsg()
		Switch $nMsg
			Case $GUI_EVENT_CLOSE
				Exit;
		EndSwitch
	;#############################GUI
		
		If GetColorTimer()  Then 
			GetBlupArray();
			$GameStart = true;
		Else
			if $GameStart Then
				NullBlupArray();
				$GameStart = false;
			EndIf
		EndIf;
		
		;Sleep("300");	
		
	WEnd ; цикл бесконечный

Else
	MsgBox("64", 'Error','Игра не найдена'); выход из программы
EndIf;	

Exit;
;#ProgramEND
;########################################################################################################
;########################################################################################################
Что делает код кратко, - создает формочку, в которой 8*8 = 64 шт. едитов. После чего в цикле проверяются значения ячеек, и заносятся в формочку по признаку: если цветной камень - то "edit" получает значение цвета, если бомба то значение 6 или 7.
 

ynbIpb

Скриптер
Сообщения
398
Репутация
109
Re: Игра .Olymp(Вконтакте)

покажи скрины, а то не все в этом гавновконтагте зареганы))
 
Верх