syseye
Новичок
- Сообщения
- 1
- Репутация
- 0
В общих чертах наткнулся на флеш-игру /Olymp во Вконтакте. Сама игра доступна тут
Основная задача игры - нечто вроде игры "шарики", надо перемещать разноцветные камни, и составлять из них комбинации одного цвета, цепочкой от 3шт. по вертикали\горизонтали. Основная цель - набрать как можно больше очков, проходя уровни(составив цепочку на определенных ячейка) и получая на каждом новом уровне больше очков чем на предыдущих. Так-же есть бомбы\супербомбы, облегчающие процесс прохождения.
На первых порах накатал небольшой "анализатор" игры, под Мозиллу ФайрФокс(расширение 1024*768). И не знаю как лучше всего подобратся к анализу ячеек. Поэтому хочу услышать предложения что и как удобнее будет реализовать, и какие ошибки я уже наделал.
Код тут:
Выложил бы файлом, да не вижу где тут.
Что делает код кратко, - создает формочку, в которой 8*8 = 64 шт. едитов. После чего в цикле проверяются значения ячеек, и заносятся в формочку по признаку: если цветной камень - то "edit" получает значение цвета, если бомба то значение 6 или 7.
Основная задача игры - нечто вроде игры "шарики", надо перемещать разноцветные камни, и составлять из них комбинации одного цвета, цепочкой от 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
;########################################################################################################
;########################################################################################################