Что нового

[Автоматизация] Подскажите где ошибка, и как сделать лучше

xishnik

Новичок
Сообщения
51
Репутация
0
Всем здравствуйте, есть игра. Называется - Небеса.
И я, не знавший ни одного языка программирования, при помощи гугла, решил написать небольшого бота к этой игре. В основном я во всём разобрался, но скрипт именно боя не работает.
Выглядит он вот так:
Код:
while $j > 1000
$cvet1 =0xF3E3AD ; Черепа
$var1 = PixelGetColor($x1 + $j, $y1 + $i)
$var2 = PixelGetColor($x2 + $j, $y2 + $i)
$var3 = PixelGetColor($x3 + $j, $y1 + $i)
if $var1=$cvet1 and $var2=$cvet1 and $var3=$cvet1 Then
    MouseClick('Left',$x3,$y2 + $i)
sleep(300)
   MouseClick('Left',$x3,$y1 + $i)
Endif
$i = $i + 41
if $i > 500 Then
   $j = $j + 41
   $i = 0
   endif
 wend

Но так он почему то не работает,(Вообще не делает ни каких действий) хотел бы попросить помощи и спросить в чём ошибка.
а например вот так:
Код:
$cvet1 =0xF3E3AD ; Черепа
$var1 = PixelGetColor(573, 277) ; Проверка 1-ого черепа
$var2 = PixelGetColor(614, 277) ; Проверка 2-ого черепа
$var3 = PixelGetColor(655, 318) ; Проверка 3-ого черепа
if $var1=$cvet1 and $var2=$cvet1 and $var3=$cvet1 Then
    MouseClick('Left',655,318)
sleep(300)
   MouseClick('Left',655,277)
Endif

он работает, но вариантов очень много. Хотелось бы както сократить..
Само игровое поле выглядит вот так:

Задача состоит в том чтобы собирать например черепа, три в ряд или столбик. Менять можно две клетки местами.
Подскажите, хоть в каком направлении должны быть мысли.
Заранее благодарен
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: [Автоматизация] Подскажите где ощибка, и как сделать лучше

Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Глобальный модератор.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Re: [Автоматизация] Подскажите где ощибка, и как сделать лучше

xishnik [?]
Вероятно, в условии
Код:
while $j > 1000
По условию цикл выполняется пока $j больше тысячи. Но в примерах с реальными числами видно, что сумма "иксов" и $j меньше тысячи.
 
Автор
xishnik

xishnik

Новичок
Сообщения
51
Репутация
0
Re: [Автоматизация] Подскажите где ощибка, и как сделать лучше


А как же вот это?
Мне кажется что сдесь $j станет более 1000


Код:
$i = $i + 41
if $i > 500 Then
   $j = $j + 41
   $i = 0
   endif
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
xishnik [?]
сдесь $j станет более 1000
Чтобы сюда попасть нужно войти в цикл. А для этого $j должна быть меньше тысячи. И вот когда она станет больше 1000, тогда цикл прекратится. Попробуйте
Код:
while $j < 1000
 

cnm

Новичок
Сообщения
58
Репутация
2
Задача состоит в том чтобы собирать например черепа, три в ряд или столбик. Менять можно две клетки местами.

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


1. Отсканировать экран.
Создать массив, состоящий из текущего положения элементов.
2. Проанализировать массив и вычислить наиболее эффективное действие
Создать приоритетную схему действий в зависимости от результата
3. Кликнуть
Перейти к пункту 1.


Ваш же алгоритм кликает по черепам, находящимся в определнном положении, надо же создать универсальный, чтобы в любой ситуации, при любом положении черепов был клик.
 

Shpilivili

Йа нюб
Сообщения
17
Репутация
0
Апну тему.
Подскажите нубу, как реализовать бота в игре типа "Три в ряд". Конкретно интересуют эти 2а пункта:
cnm сказал(а):
1. Отсканировать экран.
Создать массив, состоящий из текущего положения элементов.
2. Проанализировать массив и вычислить наиболее эффективное действие
Создать приоритетную схему действий в зависимости от результата
Какими инструменты autit, функции использовать для создания массива поля "три в ряд"?
Какие для выявления потенциального хода?Т.е. визуально то всегда понятно куда нужно переставить "объект" дабы получилось 3 в ряд, но как это логически выразить в коде? Напрашивается что нужно проверять ближайшие элементы относительно одного - и так каждый элемент всего поля. Или ещО как-то... В общем если кто нибудь подскажет функции, думаю я соображу от чего плясать... Или подскажет линк ;D
 

Belfigor

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


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

И я правильно понимаю что на экране не может быть 3-х одинаковых объектов вряд, они схлапываются и заменяются другими да?


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

Погуглил и примерно понял правила, если в данной игре так же как и тут: http://flashdozor.ru/play-6896.html
1) Создаем маски каждого объекта, по каким-нибудь контрольным пикселям.
2) Считываем в трехмерный массив [1][5][5] инфу в виде [иконка][ячейкаX][ячейкаY]
далее эта прогоняем инфу в For...Next циклах для определения наиболее удачного хода.
сначала построчно по горизонтали, потом по вертикали.

На каждую строку формируем массив в виде (на примере первой строки) 1,2,3,4,5,4 где цифры это номера уникальные id каждого типа иконок

3) Далее смотрим каждую строку, там где одно число повторяется 3 и больше раз, смотрим есть ли две рядом стоящие цифры или цифры между которыми промежуток не больше 1. Если находим комбинацию "2 рядом", смотрим иконки левее выше, левее ниже, правее выше, правее ниже.
4) Если находим иконки того же типа, что и "2 рядом", по указанному в пункте 3 условию, тащим их куда надо.

Так же можно сделать условие для "1, 2, 1", "1, 1, 2, 1, 1," и тд и тп.

Загадка разгадана :smile:


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

Это если мы хотим найти лучший ход. Если нам нужно тупо сделать правильный ход, читаем иконки подряд, как только нашли 2 повторяющиеся иконки, смотрим вверх и вниз возле них, есть нужная иконка - делаем ход и начинаем с начала, нету - идем дальше.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
А задача стоит просто сделать ход или надо найти лучший ход?
 

Shpilivili

Йа нюб
Сообщения
17
Репутация
0
Ну як бы задача всегда состоит найти лучший ход ;) Как найти лучший ход, я логически в принципе понимаю.. Но в коде - мне еще до "просто сделать ход" - как до луны пяшком... Как созрею, так продолжу тему, если кто нить кроме мну не найдется...


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

Под лучшим ходом я подразумеваю - учесть ячейки, которые которые совпадут и исчезнут после сдвига поля, после нашего хода. + еще в некоторых играх за определенный тип ячеек начисляется больше очков.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
А мы вот так походим
:laser:
Код:
#include <Array.au3>

Global $pole[6][7]	; игровое поле

_Scan()	; сканирование поля в глобальную переменную $pole
$aBestXod = _Thinking($pole) ; поиск лучшего хода по критерию максимально удаленных няшек на поле
; возвражаемый результат массив из трёх элементов [a1, a2, a3]
; а2 и а3 - координаты x,y точки из которой производится лучший ход
; отсчет координат из левого нижнего угла, начиная с нуля
; a1 - направление замены
; 1 - вправо
; 2 - вверх
_ArrayDisplay($aBestXod)
; на предложенном примере лучший ход [1, 1, 1]
; желтый камен на координатах 1,1 нужно поменять вправо с анкхом

Func _Scan()
	For $i = 0 To 5
		$pole[$i][6] = -1
	Next

	; сканирование картинки
	; и заполнение полей
	; с [0][0] по [5][5]
	_primer_Scan()

EndFunc

Func _primer_Scan()
; пример заполнения поля
; соответствует скриншоту http://radikal.ru/fp/e177386252f649ca9bafec4fbc24d5e9
; легенда:
; 1 - анкх
; 2 - череп
; 3 - красный
; 4 - желтый
; 5 - зелёный

	For $i=0 To 5
		For $j=0 To 5
			$pole[$i][$j] = 1
		Next
	Next
	$pole[0][0] = 3
	$pole[3][0] = 2
	$pole[4][0] = 5
	$pole[5][0] = 2
	$pole[0][1] = 3
	$pole[1][1] = 4
	$pole[3][1] = 3
	$pole[4][1] = 4
	$pole[5][1] = 2
	$pole[2][2] = 4
	$pole[3][2] = 5
	$pole[4][2] = 2
	$pole[0][3] = 5
	$pole[2][3] = 2
	$pole[4][3] = 5
	$pole[0][4] = 4
	$pole[1][4] = 5
	$pole[2][4] = 3
	$pole[3][4] = 4
	$pole[4][4] = 4
	$pole[5][4] = 2
	$pole[0][5] = 2
	$pole[1][5] = 3
	$pole[3][5] = 4
	$pole[4][5] = 5
	$pole[5][5] = 4
EndFunc

Func _hlop(ByRef $aStakan)
	Local $sum = 0
	For $i = 0 To 5
		For $j = 5 To 0 Step -1
			If $aStakan[$i][$j] = 0 Then
				$sum += 1
				For $k = $j To 5
					$aStakan[$i][$k] = $aStakan[$i][$k+1]
				Next
			EndIf
		Next
	Next
	Return $sum
EndFunc

Func _Fire($aStakan)
	Local $bStakan = $aStakan
	For $j=0 To 5
		For $i=0 To 3
			If ($aStakan[$i][$j]>0) And ($aStakan[$i][$j]=$aStakan[$i+1][$j]) And ($aStakan[$i][$j]=$aStakan[$i+2][$j]) Then
				$k = $i
				While $aStakan[$k][$j] = $aStakan[$i][$j]
					$bStakan[$k][$j]=0
					$k += 1
					If $k>5 Then ExitLoop
				WEnd
			EndIf
		Next
	Next

	For $i=0 To 5
		For $j=0 To 3
			If ($aStakan[$i][$j]>0) And ($aStakan[$i][$j]=$aStakan[$i][$j+1]) And ($aStakan[$i][$j]=$aStakan[$i][$j+2]) Then
				$k = $j
				While $aStakan[$i][$k] = $aStakan[$i][$j]
					$bStakan[$i][$k]=0
					$k += 1
					If $k>5 Then ExitLoop
				WEnd
			EndIf
		Next
	Next
	Return $bStakan
EndFunc

Func _Thinking($aMug)
	Local $aResRight[6][6], $aResUp[6][6]
	Local $aTMP[6][7]
	Local $iSum, $iCount, $iBest = 0
	Local $aRES[3] = [-1,-1,-1]

	For $i=0 To 4
		For $j=0 To 5
			$aTMP = $aMug
			$aTMP[$i][$j] = $aMug[$i+1][$j]
			$aTMP[$i+1][$j] = $aMug[$i][$j]
			;_ArrayDisplay($aTMP)
			$iSum = 0
			Do
				$aTMP = _Fire($aTMP)
				$iCount = _hlop($aTMP)
				ConsoleWrite("ушло "&$iCount&@CRLF)
				$iSum += $iCount
			Until $iCount = 0
			$aResRight[$i][$j] = $iSum
		Next
	Next

	For $i=0 To 5
		For $j=0 To 4
			$aTMP = $aMug
			$aTMP[$i][$j] = $aMug[$i][$j+1]
			$aTMP[$i][$j+1] = $aMug[$i][$j]
			$iSum = 0
			Do
				$aTMP = _Fire($aTMP)
				$iCount = _hlop($aTMP)
				$iSum += $iCount
			Until $iCount = 0
			$aResUp[$i][$j] = $iSum
		Next
	Next

	For $i=0 To 4
		For $j=0 To 5
			If $aResRight[$i][$j] > $iBest Then
				$aRES[0] = 1
				$aRES[1] = $i
				$aRES[2] = $j
				$iBest = $aResRight[$i][$j]
			EndIf
		Next
	Next

	For $i=0 To 5
		For $j=0 To 4
			If $aResUp[$i][$j] > $iBest Then
				$aRES[0] = 2
				$aRES[1] = $i
				$aRES[2] = $j
				$iBest = $aResUp[$i][$j]
			EndIf
		Next
	Next

	Return $aRES

EndFunc

А сканирование поля и распознавание клеток мне как-то не интересно...
:download:
 
Верх