Что нового

Алгоритм нахождения решений в массиве

Fever

Скриптер
Сообщения
308
Репутация
112
Здравствуйте, уважаемые посетители форума. :bye:
Пишу вам вот с таким вопросом: есть некое поле 7х7 с разноцветными камнями, скриншот в аттаче. Я написал алгоритм для сканирования поля и определения цвета каждой ячейки, но теперь встал вопрос составления алгоритма подбора вариантов, то есть, если мы получим массив

[box title=TitleBox]0.0.0.0.1.0.0
0.0.1.1.0.0.0
0.0.0.0.0.0.0
0.0.0.0.0.0.0
0.0.0.0.0.0.0
0.0.0.0.0.0.0
0.0.0.0.0.0.0[/box]

то нужно составить алгоритм, для определения возможной перестановки единичек (в моем случае похожим камушков) в линию из 3 и больше элементов, то есть

[box title=TitleBox]0.0.1.1.1.0.0[/box]

Алгоритм поиска цвета и составления массива:
Код:
#include <Array.au3>

Global Const _
$iColor[7]  = [0, "0xA4037C", "0x2C8A27", "0xB5FEFE", "0xFFBF08", "0x3B537B", "0xFF2433"], _ ;фиолетовый, зеленый, голубой, желтый, синий, красный
$iColorS[7] = [0, 1, 2, 3, 4, 5, 6], _ ;коды цветов
$iLeftCornerColor = "0x0000AA", _ ;цвет левого угла игрового экрана
$aTableSize[2] = [721,323], _ ;точный размер игрового экрана
$aFieldSize[2] = [240,240] ;точный размер игрового поля

Global $aTable[8][8] ;конечная таблица

HotKeySet("{ESC}", "_Exit")
HotKeySet("^1", "_Start")

While 1
	Sleep(100)
WEnd

Func _GetTablePos() ; возвращает массив x,y позиции игрового окна
	Local $_aSearch

	$_aSearch = PixelSearch(0, 0, @DesktopWidth, @DesktopHeight, $iLeftCornerColor, 10, 2)
	If IsArray($_aSearch) Then
		$_aSearch[0] += 190
		$_aSearch[1] += 40

		Return $_aSearch
	Else
		Return 0
	EndIf
EndFunc

Func _CreatePattern(ByRef $_Table, $_aTablePos) ;перебор таблицы 7х7 в игровом окне
	Local $__y = 1, $__x = 1

	For $y = $_aTablePos[1] To $_aTablePos[1] + $aFieldSize[1] Step 38
		For $x = $_aTablePos[0] To $_aTablePos[0] + $aFieldSize[0] Step 38
			$idColor = _SearchCellColor($x, $y)
			$_Table[$__y][$__x] = $idColor
			$__x += 1
		Next
		$__y += 1
		$__x = 1
	Next
EndFunc

Func _Start()
	$aPos = _GetTablePos()

	If IsArray($aPos) Then
		_CreatePattern($aTable, $aPos)
		_ArrayDisplay($aTable)
	Else
		_Start()
	EndIf
EndFunc

Func _SearchCellColor($_x, $_y) ;перебирает цвета в ячейке, возвращая код цвета (1-6)
	For $i = 1 To UBound($iColorS) -1
		$sSearch = PixelSearch($_x, $_y, $_x + 30, $_y + 30, $iColor[$i], 25, 3)
		If IsArray($sSearch) Then
			Return $i
		EndIf
	Next

	Return 0
EndFunc

Func _Exit()
	Exit
EndFunc

Ну и собственно вопрос состоит в составлении алгоритма для проведения вот таких вот манипуляций.
 

nonenicks

Новичок
Сообщения
18
Репутация
3
Ммм в чем подводный камень?
Так-то все просто

Сканируем строки на 2 элемента подряд
Нашли
Верхней строке по отношению к найденной строке, смотрим справа ячеку по отношению к 2найденым элементам и слева ячейку...тоже с нижней строкой.
 
Автор
F

Fever

Скриптер
Сообщения
308
Репутация
112
nonenicks [?]
в чем подводный камень
возможны ведь и такие варианты:
[box title=TitleBox]0.0.1.0.1.0.0
0.0.0.1.0.0.0[/box]

алгоритм то понятен, но вот над его составлением ещё приходится думать...аж голова разболелась ;D
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Сканируешь сколько единичек в каждой строке, далее выбираешь строку с наибольшим количеством единичек, и начинаешь сканировать каждую пустую позицию в строке на наличие в верхней или нижней строке единичек которые можно переместить в эту строку.

Ну это исходя из того что я думаю что единички можно двигать за 1 раз только на 1 строку.
 
Автор
F

Fever

Скриптер
Сообщения
308
Репутация
112
Belfigor
не совсем предстваляю как это реализовать, если у меня вот такой массив:
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Ты бы хоть массивчик дал, отож например я, придя с работы сидеть и сочинять массив желания не имею никакого :smile:
Вот так ты к примеру можешь найти строку содержащую больше всего единичек:
Код:
Local $iMax[8]
For $i = 1 to 7 Step 1
    For $ii = 1 To 7 Step 1
        If $aArray[$i][$ii] = 1 Then $iMax[$i]+=1
    Next
Next
MsgBox(0,'Max Numeric value', _ArrayMax($iMax, 1, 1))
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
Сделал перебор массива с поиском цепочек, приведены не все цепочки, например, коричневую и синюю цепочки не найдет.

В этой игре можно "перекручивать" массив? (элемент их самой нижней строки может перейти в цепочку самой верхней строки)
Код:
#include <Array.au3>

Dim $aArray[8][8]
For $i = 0 To UBound($aArray) - 1
	For $j = 0 To UBound($aArray, 2) - 1
		$aArray[$i][$j] = Random(1, 7, 1)
	Next
Next
;~ Dim $aArray[8][8] = [ _
;~ [1, 1, 4, 2, 4, 3, 1, 2], _
;~ [2, 2, 1, 5, 2, 2, 6, 4], _
;~ [3, 1, 3, 2, 4, 5, 1, 3], _
;~ [2, 3, 1, 4, 6, 4, 6, 2], _
;~ [1, 5, 2, 1, 2, 3, 4, 6], _
;~ [5, 1, 2, 6, 3, 2, 5, 4], _
;~ [4, 1, 4, 2, 1, 3, 4, 2], _
;~ [3, 2, 1, 5, 6, 2, 4, 6]]

_ArrayDisplay($aArray)

For $i = 0 To UBound($aArray) - 3
	For $j = 0 To UBound($aArray, 2) - 3
		$iStart = $aArray[$i][$j] ; перебор всех элементов массива
		If $aArray[$i][$j + 1] = $iStart And $aArray[$i + 1][$j + 2] = $iStart Then ; найдена цепочка "ii!"
			$aArray[$i][$j] =  $aArray[$i][$j] & '_X'
			$aArray[$i][$j + 1] = $aArray[$i][$j + 1] & '_X'
			$aArray[$i + 1][$j + 2] = $aArray[$i + 1][$j + 2] & '_X'
		ElseIf $aArray[$i + 1][$j + 1] = $iStart And $aArray[$i][$j + 2] = $iStart Then ; найдена цепочка "i!i"
			$aArray[$i][$j] = $aArray[$i][$j] & '_Z'
			$aArray[$i + 1][$j + 1] = $aArray[$i + 1][$j + 1] & '_Z'
			$aArray[$i][$j + 2] = $aArray[$i][$j + 2] & '_Z'
		ElseIf $aArray[$i + 1][$j + 1] = $iStart And $aArray[$i + 1][$j + 2] = $iStart Then ; найдена цепочка "i!!"
			$aArray[$i][$j] = $aArray[$i][$j] & '_N'
			$aArray[$i + 1][$j + 1] = $aArray[$i + 1][$j + 1] & '_N'
			$aArray[$i + 1][$j + 2] = $aArray[$i + 1][$j + 2] & '_N'
		ElseIf $aArray[$i + 1][$j + 1] = $iStart And $aArray[$i + 2][$j + 1] = $iStart Then ; найдена вертикальная цепочка "10/01/01"
			$aArray[$i][$j] = $aArray[$i][$j] & '_T'
			$aArray[$i + 1][$j + 1] = $aArray[$i + 1][$j + 1] & '_T'
			$aArray[$i + 2][$j + 1] = $aArray[$i + 2][$j + 1] & '_T'
		ElseIf $aArray[$i + 1][$j + 1] = $iStart And $aArray[$i + 2][$j] = $iStart Then ; найдена вертикальная цепочка "10/01/10"
			$aArray[$i][$j] = $aArray[$i][$j] & '_U'
			$aArray[$i + 1][$j + 1] = $aArray[$i + 1][$j + 1] & '_U'
			$aArray[$i + 2][$j] = $aArray[$i + 2][$j] & '_U'
		ElseIf $aArray[$i + 1][$j] = $iStart And $aArray[$i + 2][$j + 1] = $iStart Then ; найдена вертикальная цепочка "10/10/01"
			$aArray[$i][$j] = $aArray[$i][$j] & '_F'
			$aArray[$i + 1][$j] = $aArray[$i + 1][$j] & '_F'
			$aArray[$i + 2][$j + 1] = $aArray[$i + 2][$j + 1] & '_F'
		EndIf
	Next
Next
_ArrayDisplay($aArray)

А по-хорошему надо делать поиск более интеллектуальным:
1. Берем точку
2. Ищем на удалении максимум 5 элементов вокруг нее такие же элементы (эту область так же можно сузить, производя поиск не просто вокруг, а по определенным "векторам"), при этом надо не выйти за пределы массива
3. Проверяем можно ли из этих точек одним сдвигом построить линию (т.е. только одна точка "выбивается из строя")
4. Повторяем шаг 2 для "радиуса" в 4 и 3 элемента
 

Strog

Новичок
Сообщения
22
Репутация
0
Fever Может нам совместно работать? я имею ввиду делиться наработками и идеями
Моя тема → http://autoit-script.ru/index.php/topic,5876.msg41936.html#msg41936
Отличие в том что я "опустил"(решил не делать) смещения каждого камня, и в игре есть способность удалять крестом и квадратом на этом я решил остановиться по подробней
[box title=Крест и Квадрат]0.0.0.1.0.0.0 0.0.0.0.0.0.0
0.0.0.1.0.0.0 0.0.0.0.0.0.0
0.1.1.1.1.1.0 0.1.1.1.0.0.0
0.0.0.1.0.0.0 0.1.1.1.0.0.0
0.0.0.1.0.0.0 0.1.1.1.0.0.0
0.0.0.0.0.0.0 0.0.0.0.0.0.0
0.0.0.0.0.0.0 0.0.0.0.0.0.0
:idea:

приведены не все цепочки, например, коричневую и синюю цепочки не найдет.
Вот попытался дописать код, попытался сделать цепочку 1.0.1.1.
Код:
#include <Array.au3>

Dim $aArray[8][8]
For $i = 0 To UBound($aArray) - 1
    For $j = 0 To UBound($aArray, 2) - 1
;~         $aArray[$i][$j] = Random(1, 5, 1)
    Next
Next
;~ Dim $aArray[8][8] = [ _
;~ [1, 1, 4, 2, 4, 3, 1, 2], _
;~ [2, 2, 1, 5, 2, 2, 6, 4], _
;~ [3, 1, 3, 2, 4, 5, 1, 3], _
;~ [2, 3, 1, 4, 6, 4, 6, 2], _
;~ [1, 5, 2, 1, 2, 3, 4, 6], _
;~ [5, 1, 2, 6, 3, 2, 5, 4], _
;~ [4, 1, 4, 2, 1, 3, 4, 2], _
;~ [3, 2, 1, 5, 6, 2, 4, 6]]

Dim $aArray[8][8] = [ _
[1, 1, 4, 2, 4, 3, 1, 2], _
[2, 2, 1, 5, 2, 2, 6, 4], _
[3, 3, 1, 3, 4, 5, 1, 3], _
[2, 3, 1, 4, 6, 4, 6, 2], _
[1, 5, 2, 1, 2, 3, 4, 6], _
[5, 1, 2, 6, 3, 2, 5, 4], _
[4, 1, 4, 2, 1, 3, 4, 2], _
[3, 2, 1, 5, 6, 6, 4, 6]]


_ArrayDisplay($aArray)

For $i = 0 To UBound($aArray) - 3
    For $j = 0 To UBound($aArray, 2) - 3
        $iStart = $aArray[$i][$j] ; перебор всех элементов массива
        If $aArray[$i][$j + 1] = $iStart And $aArray[$i + 1][$j + 2] = $iStart Then ; найдена цепочка "ii!"
            $aArray[$i][$j] =  $aArray[$i][$j] & '_X'
            $aArray[$i][$j + 1] = $aArray[$i][$j + 1] & '_X'
            $aArray[$i + 1][$j + 2] = $aArray[$i + 1][$j + 2] & '_X'
        ElseIf $aArray[$i + 1][$j + 1] = $iStart And $aArray[$i][$j + 2] = $iStart Then ; найдена цепочка "i!i"
            $aArray[$i][$j] = $aArray[$i][$j] & '_Z'
            $aArray[$i + 1][$j + 1] = $aArray[$i + 1][$j + 1] & '_Z'
            $aArray[$i][$j + 2] = $aArray[$i][$j + 2] & '_Z'
        ElseIf $aArray[$i + 1][$j + 1] = $iStart And $aArray[$i + 1][$j + 2] = $iStart Then ; найдена цепочка "i!!"
            $aArray[$i][$j] = $aArray[$i][$j] & '_N'
            $aArray[$i + 1][$j + 1] = $aArray[$i + 1][$j + 1] & '_N'
            $aArray[$i + 1][$j + 2] = $aArray[$i + 1][$j + 2] & '_N'
        ElseIf $aArray[$i + 1][$j + 1] = $iStart And $aArray[$i + 2][$j + 1] = $iStart Then ; найдена вертикальная цепочка "10/01/01"
            $aArray[$i][$j] = $aArray[$i][$j] & '_T'
            $aArray[$i + 1][$j + 1] = $aArray[$i + 1][$j + 1] & '_T'
            $aArray[$i + 2][$j + 1] = $aArray[$i + 2][$j + 1] & '_T'
        ElseIf $aArray[$i + 1][$j + 1] = $iStart And $aArray[$i + 2][$j] = $iStart Then ; найдена вертикальная цепочка "10/01/10"
            $aArray[$i][$j] = $aArray[$i][$j] & '_U'
            $aArray[$i + 1][$j + 1] = $aArray[$i + 1][$j + 1] & '_U'
            $aArray[$i + 2][$j] = $aArray[$i + 2][$j] & '_U'
        ElseIf $aArray[$i + 1][$j] = $iStart And $aArray[$i + 2][$j + 1] = $iStart Then ; найдена вертикальная цепочка "10/10/01"
            $aArray[$i][$j] = $aArray[$i][$j] & '_F'
            $aArray[$i + 1][$j] = $aArray[$i + 1][$j] & '_F'
            $aArray[$i + 2][$j + 1] = $aArray[$i + 2][$j + 1] & '_F'
			
			
 ElseIf $aArray[$i][$j + 1] = $iStart And $aArray[$i][$j + 3] = $iStart Then ; найдена цепочка "ii!i"
            $aArray[$i][$j] = $aArray[$i][$j] & '-M'
            $aArray[$i][$j+1] = $aArray[$i][$j + 1] & '-M'
            $aArray[$i][$j+3] = $aArray[$i][$j + 3] & '-M'
			
        EndIf
	
		
    Next
Next
_ArrayDisplay($aArray)
но она не все цепочки ищет

2. Ищем на удалении максимум 5 элементов вокруг нее такие же элементы (эту область так же можно сузить, производя поиск не просто вокруг, а по определенным "векторам"), при этом надо не выйти за пределы массива
Можно по подробней , очень интересно!
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
Strog [?]
но она не все цепочки ищет
О возможных разрывах в цепочках я даже не подумал :smile:
Вот из-за этого и не ищет:
Код:
For $i = 0 To UBound($aArray) - 3
    For $j = 0 To UBound($aArray, 2) - 3

Тут ограничение на обход массива, для того чтобы исключить ситуации поиска элемента за пределами массива.
Меняй 3 на 1 в обоих строках, но тогда придется ограничивать поиск соседних элементов добавлением дополнительных условий (чтобы $i + 1, $i + 2, $j + 1 и т.п. не вышли за границу массива) мне было лениво такое делать

Можно по подробней , очень интересно!
Ну вот основная идея:
В неполной цепочке все элементы кроме одного идут подряд.
Для горизонтальной цепочки у одного элемента первый индекс будет отличаться от других на единицу, а второй индекс всех элементов будет идти подряд, для вертикальной индексы меняются местами, например,
Код:
$aArr[0][0] = 0
$aArr[0][1] = 0
$aArr[1][2] = 0

или

$aArr[0][0] = 1
$aArr[1][0] = 1
$aArr[2][1] = 1

это неполные цепочки.
В случае с разорванной цепочкой все элементы имеют один (первый или второй) индекс, а другой индекс у одних элементов идет подряд, а последний отличается на 2 от крайнего:
Код:
$aArr[0][0] = 0
$aArr[0][1] = 0
$aArr[0][2] = 1
$aArr[0][3] = 0


А сам поиск будет выглядеть так:
встаем в исходную точку
циклом обходим все соседние по кругу, уменьшая или увеличивая $i и $j
если нашли точку с таким же содержимым - идем в том направлении, соблюдая "правило линии", т.е. только один элемент может уйти из партии отклониться.

С реализацией тут туговато :wacko:, может позже приведу пример, а пока дерзай!


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

Написал поиск циклом "троек" без учета разрывов
Код:
#include <Array.au3>

;~ Dim $aArray[8][8]
;~ For $i = 0 To UBound($aArray) - 1
;~ 	For $j = 0 To UBound($aArray, 2) - 1
;~ 		$aArray[$i][$j] = Random(1, 7, 1)
;~ 	Next
;~ Next
Dim $aArray[8][8] = [ _
[1, 1, 4, 2, 4, 3, 1, 2], _
[2, 2, 1, 5, 2, 2, 6, 7], _
[3, 1, 3, 2, 4, 5, 1, 7], _
[2, 3, 1, 4, 6, 4, 7, 2], _
[1, 5, 2, 1, 2, 3, 1, 6], _
[5, 1, 2, 6, 3, 2, 5, 4], _
[4, 1, 4, 2, 1, 6, 4, 2], _
[1, 2, 1, 5, 6, 6, 4, 6]]

_ArrayDisplay($aArray)
$iMax_X = UBound($aArray) - 1
$iMax_Y = UBound($aArray, 2) - 1
For $i = 0 To $iMax_X ; обход всего массива
	For $j = 0 To $iMax_Y
		$iStart = $aArray[$i][$j] ; "центр" круга для следующих циклов
		For $a = -1 To 1 ; обходим точку вокруг с шагом в один элемент
			For $b = -1 To 1
				;проверка индексов, чтобы они не выходили за границы массива
				;проверка позиции - чтобы снова не попасть в "центр" круга
				;проверка найденного значения - чтобы совпадало с "центром"
				If (($i + $a) >= 0) And (($i + $a) <= $iMax_X) And (($j + $b) >= 0) And (($j + $b) <= $iMax_Y) And _
					((($i + $a) <> $i) Or (($j + $b) <> $j)) And $aArray[$i + $a][$j + $b] = $iStart Then
					For $x = -1 To 1 ; обход вокруг второй точки в цепочке
						For $y = -1 To 1
							; такие же проверки, что и выше + проверка на диагональ
							If (($i + $a + $x) >= 0) And (($i + $a + $x) <= $iMax_X) And (($j + $b + $y) >= 0) And (($j + $b + $y) <= $iMax_Y) And _
								((($i + $a + $x) <> $i) Or (($j + $b + $y) <> $j)) And ((($i + $a + $x) <> $i + $a) Or (($j + $b + $y) <> $j + $b)) And _
								($a - $x) <> ($b - $y) And $aArray[$i + $a + $x][$j + $b + $y] = $iStart And (($a + $x) > 1 Or ($b + $y) > 1) Then
								$aArray[$i][$j] = $iStart & '_!'
								$aArray[$i + $a][$j + $b] = $iStart & '_!'
								$aArray[$i + $a + $x][$j + $b + $y] = $iStart & '_!'
							EndIf
						Next
					Next
				EndIf
			Next
		Next
	Next
Next

_ArrayDisplay($aArray)
Подредактировал...
 
Автор
F

Fever

Скриптер
Сообщения
308
Репутация
112
Strog [?]
делиться наработками и идеями
я только за :smile:

а вот моя функция для "тупого перебора" горизонтальных вариантов строки
Код:
Func _FindNearest($_y, $_x, $__y, $__x)
	$iO = _GetOrientation($_y, $_x, $__y, $__x)
	Switch $iO
		Case 1
			Switch $_y
				Case 1;========================================================================
					Switch $_x
						Case 1
							If $aTable[$_y][$_x] == $aTable[$_y][$_x+3] Then
								_Move($_y, $_x+3, "left")
								Return 1
							ElseIf $aTable[$_y][$_x] == $aTable[$_y+1][$_x+2] Then
								_Move($_y+1, $_x+2, "up")
								Return 1
							EndIf
						Case 2
							If $aTable[$_y][$_x] == $aTable[$_y][$_x+3] Then
								_Move($_y, $_x+3, "left")
								Return 1
							ElseIf $aTable[$_y][$_x] == $aTable[$_y+1][$_x+2] Then
								_Move($_y+1, $_x+2, "up")
								Return 1
							ElseIf $aTable[$_y][$_x] == $aTable[$_y+1][$_x-1] Then
								_Move($_y+1, $_x-1, "up")
								Return 1
							EndIf
						Case 3,4
							If $aTable[$_y][$_x] == $aTable[$_y][$_x+3] Then
								_Move($_y, $_x+3, "left")
								Return 1
							ElseIf $aTable[$_y][$_x] == $aTable[$_y+1][$_x+2] Then
								_Move($_y+1, $_x+2, "up")
								Return 1
							ElseIf $aTable[$_y][$_x] == $aTable[$_y+1][$_x-1] Then
								_Move($_y+1, $_x-1, "up")
								Return 1
							ElseIf $aTable[$_y][$_x] == $aTable[$_y][$_x-2] Then
								_Move($_y, $_x-2, "right")
								Return 1
							EndIf
						Case 5
							If $aTable[$_y][$_x] == $aTable[$_y+1][$_x+2] Then
								_Move($_y+1, $_x+2, "up")
								Return 1
							ElseIf $aTable[$_y][$_x] == $aTable[$_y+1][$_x-1] Then
								_Move($_y+1, $_x-1, "up")
								Return 1
							ElseIf $aTable[$_y][$_x] == $aTable[$_y][$_x-2] Then
								_Move($_y, $_x-2, "right")
								Return 1
							EndIf
						Case 6
							If $aTable[$_y][$_x] == $aTable[$_y+1][$_x-1] Then
								_Move($_y+1, $_x-1, "up")
								Return 1
							ElseIf $aTable[$_y][$_x] == $aTable[$_y][$_x-2] Then
								_Move($_y, $_x-2, "right")
								Return 1
							EndIf
					EndSwitch
				Case 2,3,4,5,6;========================================================================
					Switch $_x
						Case 1
							If $aTable[$_y][$_x] == $aTable[$_y+1][$_x+2] Then
								_Move($_y+1, $_x+2, "up")
								Return 1
							ElseIf $aTable[$_y][$_x] == $aTable[$_y][$_x+3] Then
								_Move($_y, $_x+3, "left")
								Return 1
							ElseIf $aTable[$_y][$_x] == $aTable[$_y-1][$_x+2] Then
								_Move($_y-1, $_x+2, "down")
								Return 1
							EndIf
						Case 2
							If $aTable[$_y][$_x] == $aTable[$_y+1][$_x+2] Then
								_Move($_y+1, $_x+2, "up")
								Return 1
							ElseIf $aTable[$_y][$_x] == $aTable[$_y][$_x+3] Then
								_Move($_y, $_x+3, "left")
								Return 1
							ElseIf $aTable[$_y][$_x] == $aTable[$_y-1][$_x+2] Then
								_Move($_y-1, $_x+2, "down")
								Return 1
							ElseIf $aTable[$_y][$_x] == $aTable[$_y-1][$_x-1] Then
								_Move($_y-1, $_x-1, "down")
								Return 1
							ElseIf $aTable[$_y][$_x] == $aTable[$_y+1][$_x-1] Then
								_Move($_y+1, $_x-1, "up")
								Return 1
							EndIf
						Case 3,4
							If $aTable[$_y][$_x] == $aTable[$_y+1][$_x+2] Then
								_Move($_y+1, $_x+2, "up")
								Return 1
							ElseIf $aTable[$_y][$_x] == $aTable[$_y][$_x+3] Then
								_Move($_y, $_x+3, "left")
								Return 1
							ElseIf $aTable[$_y][$_x] == $aTable[$_y-1][$_x+2] Then
								_Move($_y-1, $_x+2, "down")
								Return 1
							ElseIf $aTable[$_y][$_x] == $aTable[$_y-1][$_x-1] Then
								_Move($_y-1, $_x-1, "down")
								Return 1
							ElseIf $aTable[$_y][$_x] == $aTable[$_y+1][$_x-1] Then
								_Move($_y+1, $_x-1, "up")
								Return 1
							ElseIf $aTable[$_y][$_x] == $aTable[$_y][$_x-2] Then
								_Move($_y, $_x-2, "right")
								Return 1
							EndIf
						Case 5
							If $aTable[$_y][$_x] == $aTable[$_y+1][$_x+2] Then
								_Move($_y+1, $_x+2, "up")
								Return 1
							ElseIf $aTable[$_y][$_x] == $aTable[$_y-1][$_x+2] Then
								_Move($_y-1, $_x+2, "down")
								Return 1
							ElseIf $aTable[$_y][$_x] == $aTable[$_y-1][$_x-1] Then
								_Move($_y-1, $_x-1, "down")
								Return 1
							ElseIf $aTable[$_y][$_x] == $aTable[$_y+1][$_x-1] Then
								_Move($_y+1, $_x-1, "up")
								Return 1
							ElseIf $aTable[$_y][$_x] == $aTable[$_y][$_x-2] Then
								_Move($_y, $_x-2, "right")
								Return 1
							EndIf
						Case 6
							If $aTable[$_y][$_x] == $aTable[$_y-1][$_x-1] Then
								_Move($_y-1, $_x-1, "down")
								Return 1
							ElseIf $aTable[$_y][$_x] == $aTable[$_y+1][$_x-1] Then
								_Move($_y+1, $_x-1, "up")
								Return 1
							ElseIf $aTable[$_y][$_x] == $aTable[$_y][$_x-2] Then
								_Move($_y, $_x-2, "right")
								Return 1
							EndIf
					EndSwitch
				Case 7 ;========================================================================
					Switch $_x
						Case 1
							If $aTable[$_y][$_x] == $aTable[$_y][$_x+3] Then
								_Move($_y, $_x+3, "left")
								Return 1
							ElseIf $aTable[$_y][$_x] == $aTable[$_y-1][$_x+2] Then
								_Move($_y-1, $_x+2, "down")
								Return 1
							EndIf
						Case 2
							If $aTable[$_y][$_x] == $aTable[$_y-1][$_x-1] Then
								_Move($_y-1, $_x-1, "down")
								Return 1
							ElseIf $aTable[$_y][$_x] == $aTable[$_y][$_x+3] Then
								_Move($_y, $_x+3, "left")
								Return 1
							ElseIf $aTable[$_y][$_x] == $aTable[$_y-1][$_x+2] Then
								_Move($_y-1, $_x+2, "down")
								Return 1
							EndIf
						Case 3,4
							If $aTable[$_y][$_x] == $aTable[$_y-1][$_x-1] Then
								_Move($_y-1, $_x-1, "down")
								Return 1
							ElseIf $aTable[$_y][$_x] == $aTable[$_y][$_x+3] Then
								_Move($_y, $_x+3, "left")
								Return 1
							ElseIf $aTable[$_y][$_x] == $aTable[$_y-1][$_x+2] Then
								_Move($_y-1, $_x+2, "down")
								Return 1
							ElseIf $aTable[$_y][$_x] == $aTable[$_y][$_x-2] Then
								_Move($_y, $_x-2, "right")
								Return 1
							EndIf
						Case 5
							If $aTable[$_y][$_x] == $aTable[$_y-1][$_x-1] Then
								_Move($_y-1, $_x-1, "down")
								Return 1
							ElseIf $aTable[$_y][$_x] == $aTable[$_y-1][$_x+2] Then
								_Move($_y-1, $_x+2, "down")
								Return 1
							ElseIf $aTable[$_y][$_x] == $aTable[$_y][$_x-2] Then
								_Move($_y, $_x-2, "right")
								Return 1
							EndIf
						Case 6
							If $aTable[$_y][$_x] == $aTable[$_y-1][$_x-1] Then
								_Move($_y-1, $_x-1, "down")
								Return 1
							ElseIf $aTable[$_y][$_x] == $aTable[$_y][$_x-2] Then
								_Move($_y, $_x-2, "right")
								Return 1
							EndIf
					EndSwitch
			EndSwitch
		Case 2
			;
	EndSwitch

	Return 0
EndFunc
 
Верх