Что нового

Майнер бот. Эволюция от примитивного до умного.v2.5

All2khoff

Продвинутый
Сообщения
347
Репутация
65
Ребят всем добродень, тут ситуация интересная и вроде бы простая но я что-то туплю.

За основу взята наработка "яоднако" забиваю координаты кнопки отварпа, а когда запускаю тестовый прогон, то мышка кликает не в центр кнопки как настроено по координатам, а буквально над кнопкой и андок не происходит, тоже самое со всеми другими координатами, они сместились по обеим осям.
Машина физическая, Win7х64, тема классическая, все красивости выключены, монитор один, игра в окне 1024х768


Вполне допускаю, что подобное уже обсуждалось, но поиск не помог...
 

rakar

Новичок
Сообщения
5
Репутация
1
попробуй до или после клика добавить этот код, дабы убедится что мышь кликает куда нужно.

Код:
$pos = MouseGetPos()
ToolTip ("MouseClick x,y: " & $pos[0] & "," & $pos[1],  $pos[0], $pos[1])
Sleep(2000)


проблема может быть в том, что бот от "яоднако" написан для оконного режима, а у тебя в настройках стоит что то другое, попробуй закомментировать вот эту строку

Код:
WinMove("EVE", "", 5, -20)
 

All2khoff

Продвинутый
Сообщения
347
Репутация
65
rakar сказал(а):
попробуй до или после клика добавить этот код, дабы убедится что мышь кликает куда нужно.

$pos = MouseGetPos()
ToolTip ("MouseClick x,y: " & $pos[0] & "," & $pos[1], $pos[0], $pos[1])
Sleep(2000)

проблема может быть в том, что бот от "яоднако" написан для оконного режима, а у тебя в настройках стоит что то другое, попробуй закомментировать вот эту строку

WinMove("EVE", "", 5, -20)
я видимо не совсем корректно выразился, я использовал наработку из первого сообщения поста.
Игра в окне.
Ваши рекомендации проверяю
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
rakar

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


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

DJ_Tommy

Продвинутый
Сообщения
236
Репутация
57
я видимо не совсем корректно выразился, я использовал наработку из первого сообщения поста.
Игра в окне.
Ваши рекомендации проверяю
[/quote]

Скорее всего дело в координатах. Они могут быть абсолютные и относительные. Используйте относительные, тогда все будет кликаться туда, куда надо. Ну и соответственно изначально нужно узнавать координаты относительно окна, а не абсолютные.
 

RavdonikaS

Новичок
Сообщения
68
Репутация
4
Вот мой бот с немного другим принципом построения
Кратко напишу лишь что основная идея позаимствована из нейронных сетей но выполнено более просто по принципу "Ключ-Ответ"
Бот построен не на многоэтажных If-Then а на составлении из состояний датчиков вектора и сравнении его с действием которое нужно выполнить в данной ситуации Есть графический интерфейс с индикаторами, логирование действий, запуск дронов как только прилетел на белт и сбор их в отсек когда улетает отвозить руду
Не заходит в тупик если что-то не сработало а продолжает действовать соответственно окружающей обстановки
Писал для Вентурки
Код:
#pragma compile(Out, EVE - Venture.exe)
#pragma compile(Icon, ..\Pic\EVE.ico)
#pragma compile(FileVersion, 19.06.24.0)

#include <GuiConstants.au3>
#include <ComboConstants.au3>
#include <TabConstants.au3>
#include <StaticConstants.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ScreenCapture.au3>
#include <Misc.au3>
#include <Array.au3>
#include <File.au3>
;~ #include <BlockInputEx.au3>
;Все горячие клавиши клиента EVE убраны с кнопок букв потому что возникают проблемы при переключении рус./англ.
HotKeySet('{insert}','zabort')  ;Устанавливает сброс руды за борт
HotKeySet('^{home}','_Obu4Glubok');CTRL+HOME Глубокое обучение с картинками
HotKeySet('{home}','_Obu4Bistroe');Быстрое обучение без картинок (сразу же присваивает действие к ситуации)
HotKeySet('^+{home}','_Obu4Param')
HotKeySet('{space}','pausa')
HotKeySet('{End}','eksit')  ;Закрытие бота
HotKeySet('{tab}','podskaz') ;Выводит окошко с подсказками по омновным хоткеям
HotKeySet('^{tab}','_LogPokaz') ;Сбрасывает логи в .txt файл
Opt('PixelCoordMode', 2) ;1=absolute, 0=relative, 2=client
Opt('MouseCoordMode', 2) ;1=absolute, 0=relative, 2=client
Opt('MouseClickDelay', 200) ;Интервал между кнопками мыши
Opt('SendKeyDelay', 150) ;Интервал между кнопками клавиатуры
Opt('MouseClickDownDelay', 150);Время зажима нопок мыши
Opt('SendKeyDownDelay',200) ;Время зажима кнопок клавиатуры

Global $ps,$pd,$ob,$zab,$i,$j,$a,$n=0,$IzV, $M1,$M2       		 ;Переключатели счетчики
Global $GUIobu4,$GUIobVektori,$GUIobu4Scrn,$massivi,$VektoriObu4[1],$knp_pos=18    ;GUI
Global $dstvstr,$vector,$num,$4t_str,$nn,$var_string,$var_star,$Arr_Del[1]     ;Векторы
Global $nOb,$Y
Global $tM1,$tM2,$timer,$tMining                        ;Таймеры
;------------ Массивы с датчиками ------------- Для работы датчиков переключить EVE в ОКНО ФИКСИРОВАННОГО РАЗМЕРА
Global $Main[5]= ['',1080,1131,957,0x888985]				;МАЙНЕРЫ (x1,x2,y,col)самое начало зеленой полоски вокруг майнера
Global $Cel[5]=  ['',1780,78,0xFF1212,0xDBDBDB] 			;ЦЕЛЬ (x,y,col,col) Красное перекрестие прицела- захвачена Белое перекрестие прицела - есть цель на расстоянии
Global $HP[7]=   ['',1000,926,0xF6F6F6, 913, 929,0xE1E5DD]	;ХП (x,y,col   x,y,col) Верхняя полукруглая белая полоска её правая и левая третья часть
Global $Dok[7]=  ['',1769, 235,0xBABA03,  1869,132,0xE5E500] ;ДОК (x,y,col ОбычСтанции)(x,y,col Цитадель)
Global $Gruz[5]= ['',1760,795,0x004F66,0x00A7A7]			;ГРУЗ (x1,y1,x2,y2,col,colВесьГруз)  Синяя полоска трюма /светлосиняя когда выбираю весь груз квадратик 4x4
Global $Orbit[4]=['',1730,78,0xFFFFFF]      				;Орбита (x,y,col) белая Планета со стрелочкой вокруг
Global $Varp[4]= ['',899,792,0xBFBFBF]     	    			;Варп (x,y,col)  Верхний лев угол надписи ВАРП появляется надпись
Global $Ulica[4]=['',884,891,0x10CE10]          			;Улица (x,y,col)Зеленый светофор
Global $Dist[4]= ['',1811,50,0xB5B5B5]						;Дистанция (x,y,col)Уголок буквы М в расстоянии цели в прицеле
Global $Aster[4]=['',1679,209,0x9F9F9E]   					;Астеройд(x1,y1,x2,y2,col) Квадрат 8х8
;--------------------------------------------------------------------------------------------------------
Global $ArrLog[1] 											;Массив с данными логирования
Global $AsterPos[7]=['',308,288,268,248,228,210]			;Позиция астеройдов в списке по Y
Global $Dn[15]=['','Майн1','Майн2','НаСтанц','ВыделГруз','ГрузНаСклад','ЗаБорт','ИзДока','Кастерам','ВыклМ','КлацАстерМышью','ПоОрбите','ПодкачЩит','НИЧЕГО','Пищать']
Global $knop[15]=['','1','2','3','4','5','6','7','8','9','0','.','+','*','/']
Global $spdMos=7 ;Скорость движения мыши
;============================================================== Вычисление пути к папке
Global $path=StringSplit(@ScriptDir,'\');Записывает в массив путь к папке скрипта (каждую папку в отдельный элемент)
Global $srptpic=_ArrayToString($path, "\",1, UBound($path)-2)&'\Pic\';Путь к папке с картинками
;==============================================================
$GuiOkno=GUICreate('БТ', 200, 200, @DesktopWidth-200, 539, $WS_POPUP ,$WS_EX_TOPMOST);Окно основного GUI
$_Deistv=GUICtrlCreateInput('',0,0,200,18)
$Fon = GUICtrlCreatePic($srptpic&'Фон.jpg', 0, 15, 200, 200)
$PicZabort=GUICtrlCreatePic('', 1, 41, 29, 20)
$PicAster=GUICtrlCreatePic('', 1, 62, 29, 20)
$PicGruzOkno=GUICtrlCreatePic('', 1, 83, 36, 35)
$PicPausa=GUICtrlCreatePic('', 1, 119, 31, 35)
$PicTarg=GUICtrlCreatePic($srptpic&'Цели нет.jpg', 96, 17, 82, 19)
$PicMiner1=GUICtrlCreatePic($srptpic&'Майнер выкл.jpg', 82, 36, 53, 55)
$PicMiner2=GUICtrlCreatePic($srptpic&'Майнер выкл.jpg', 140, 36, 53, 55)
$PicHP=GUICtrlCreatePic($srptpic&'ХП есть.jpg', 58, 91, 142, 46)
$PicGruz=GUICtrlCreatePic($srptpic&'Груз есть.jpg', 58, 137, 142, 16)
$PicDOK=GUICtrlCreatePic('', 67, 153, 64, 37)
$PicVarp=GUICtrlCreatePic('', 82, 153, 97, 40)
$PicTimer=GUICtrlCreatePic('', 60, 46, 22, 26)
$picDist=GUICtrlCreatePic('', 180, 17, 16, 13)
$picVopros=GUICtrlCreatePic('', 1, 153, 16, 13)
$PicTudaOTtuda=GUICtrlCreatePic('', 1, 15, 44, 44)
GUISetState(@SW_SHOW,'БТ')

$File=FileOpen('МайнингМассивы.txt')  ;Переписывает в массив векторы из TXT
	Global $DT[1][2]
	For $i = 1 To _FileCountLines($File)
		_ArrayAdd($DT,FileReadLine($File,$i),0,',') ;Векторы в нулевую ячейку Действия в 1 ячейку (Начиная с нолевой колонки разделитель-запятая)
	Next
FileClose($File)
;-------------------- Сравнение массива векторов и картинок в папке СКРИН
Global $ArrScrn[1];Объявляем массив картинок
$ArrScrn=_FileListToArray(@ScriptDir&"\Scrn") ;Перепись имен картинок из папки Scrn в массив
If @error=4 Then MsgBox(0,"","Файлы в Scrn не найдены.")
Global $n=0
For $i = 1 To UBound($ArrScrn)-1 ;Добавление векторов которых нет в массиве но есть в картинка (с др. компьютера)
	_ArraySearch($DT,StringTrimRight($ArrScrn[$i],4),1)
	If @error Then ;если в массиве векторов нет картинки то добавляем её к массиву векторов
		$n+=1
		_ArrayAdd($DT,StringTrimRight($ArrScrn[$i],4))
	EndIf
Next
If $n>0 Then MsgBox(0,'','Добавлено новых векторов из картинок='&$n)
;=========================================================================================
WinActivate('EVE - ') ;Выводит окно ЕВЫ на передний план чтобы не переключать руками окна
While 1 ;Основной цикл в котором прокручиваются все датчики действия и состояния
		Dat4() ;Берет информацию о состоянии датчиков
		If $ps=1 Then   ;Бот в работе
			If TimerDiff($timer)>20*60000 Then Beep(500,500) ;Если больше 20 мин. не летал на базу начинает пищать (для ночного режима)
			deistv() ;Выполняет действия которые сопоставимы с вектором датчиков в данный момент
			If WinExists('Спонсируемый сеанс') Then ControlClick('Спонсируемый сеанс','OK',342) ;Убирает окно спонсорского показа от TeamWievera когда оно появляется ;342 ID кнопки ОК
		EndIf
WEnd
Func _Logirovanie($lg)
	Switch $lg
		Case 1 ;Обычное смена действий
			_ArrayAdd($ArrLog,@HOUR&':'&@MIN&'   '&$DT[$num][1]&'   '&$var_string)
		Case 2 ;Выгрузка на склад
			_ArrayAdd($ArrLog,'   ===============  Время цикла '&TimerDiff($timer)/1000/60&' Минут')
	EndSwitch
	If UBound($ArrLog)>500 Then _LogSbros() ;Если превышает 500 лог записей в массиве то сбрасывает в .txt файл
EndFunc
Func _LogSbros()
			$File=FileOpen('Log.txt',1);Переписывает в текстовый файл все танные из массива лога и очищает этот массив
				FileWrite($File,@CRLF&_ArrayToString($ArrLog,@CRLF,1))
			FileClose($File)
			ReDim $ArrLog[1] ;Стирает все значетия из массива логирования оставляя только нулевую ячейку
EndFunc
Func _LogPokaz()
	_LogSbros()
	ShellExecute('Log.txt') ;Выводит на экран txt файл логируемых действий по времени
EndFunc
Func _GuiCreateObu4($n)
	Switch $n
		;============ Открытие окон обучения ===================
		Case 1 ;Создает Обуч над датчиками
			$GUIobu4=GUICreate('Обучение', 200, 300, @DesktopWidth-200, 239, $WS_POPUP ,$WS_EX_TOPMOST);Окно обучения сверху над датчиками
			$massivi=GUICtrlCreateEdit('',1,20,200,400)
			Global $ComboDeistv = GUICtrlCreateCombo("", 1, 1, 200, 25);Выпадающее меню со списком действий
			GUICtrlSetData(-1, _ArrayToString($Dn,'|',1))
			GUISetState() ; показывает созданное окно
		Case 2 ;Создает Обуч со скринами
			$GUIobu4Scrn=GUICreate('Скрины', 1587, 893, 0, 0, $WS_POPUP ,$WS_EX_TOPMOST)
			Global $FonScrn = GUICtrlCreatePic('', 0, 0, 1587, 893)
			GUISetState() ; показывает созданное окно
		Case 3 ;Подсказки по хоткеям обучения
			Local $toolOb[17]
			For $i = 1 To UBound($Dn)-1
				$toolOb[$i]=$knop[$i]&'  '&$Dn[$i]
			Next
			ToolTip(_ArrayToString($toolOb,@CRLF,1),@DesktopWidth-332,540)
		Case 'параметры'
			Global $GUIobu4Param=GUICreate('Обучение параметры',200,300,@DesktopWidth-200,239,$WS_POPUP,$WS_EX_TOPMOST) ;Окно обучения по набору отдельных параметров
			Global $ComboDeistv = GUICtrlCreateCombo("", 1, 1, 200, 25);Выпадающее меню со списком действий
			GUICtrlSetData(-1, _ArrayToString($Dn,'|',1))
			Global $Ch0[14],$Ch1[14],$Ch2[14],$Ch3[14],$labl[14], $ChPos=50
			Global $labl[14]=[0,'1-Док','2-Цель','3-ХП','4-Груз','5-ГрузВесь','6-Майнер1','7-Майнер2','8-Астеройд','9-Улица','10-ЗаБорт','11-Дистанция','12-Таймер','13-НаСтанц/СоСтанц']
			$n=4
			For $i = 0 To 3
				GUICtrlCreateLabel($i,$n,35)
				$n+=14
			Next
			For $i = 1 To 13
				$Ch0[$i]=GUICtrlCreateCheckbox('',1,$ChPos,12,12);Создаем галочки чекбоксы с параметрами 0
				$Ch1[$i]=GUICtrlCreateCheckbox('',15,$ChPos,12,12);Создаем галочки чекбоксы с параметрами 1
				GUICtrlCreateLabel($labl[$i],65,$ChPos);Лейблы-подписи к чекбоксам
				$ChPos+=17
			Next
			$Ch2[2]=GUICtrlCreateCheckbox('',30,67,12,12)
			$Ch3[2]=GUICtrlCreateCheckbox('',45,67,12,12)
			$Ch2[3]=GUICtrlCreateCheckbox('',30,84,12,12)
			GUISetState() ; показывает созданное окно
		;============= Закрытие окон обучения =======================
		Case 4 ;Закрывает Список векторов над датчиками
			GUIDelete($GUIobu4)
		Case 5 ;Закрывает Окно скринов обучения
			GUIDelete($GUIobu4Scrn)
		Case 6 ;Закрывает Подсказки хоткеев к обучению
			ToolTip('')
		Case 7 ;Закрывает окно обучения по параметрам
			GUIDelete($GUIobu4Param)
	EndSwitch
EndFunc
;=================================================================================================================
Func Dat4()
		Local $var[14]=[0,0,0,0,0,0,0,0,0,0,0,0,0,0]
		PixelSearch($Varp[1],$Varp[2],$Varp[1],$Varp[2],$Varp[3],30);Варп
		if @error Then ;Если нет ВАРПА
				GUICtrlSetImage($PicVarp, '')
				PixelSearch($Dok[4]-2,$Dok[5]-2,$Dok[4]+2,$Dok[5]+2,$Dok[6],20)				;Значек ДОК цитадель
													If Not @error Then $var[1]=1
				PixelSearch($Dok[1]-2,$Dok[2]-2,$Dok[1]+2,$Dok[2]+2,$Dok[3],20)				;Значек ДОК ОбычнСтанция
													If Not @error Then $var[1]=1
				PixelSearch($Gruz[1]-2,$Gruz[2]-2,$Gruz[1]+2,$Gruz[2]+2,$Gruz[3],20)		;Груз
													If Not @error  Then	$var[4]=1
				PixelSearch($Gruz[1]-2,$Gruz[2]-2,$Gruz[1]+2,$Gruz[2]+2,$Gruz[4],20)		;Выбран весь груз
													If Not @error  Then $var[5]=1
				PixelSearch($Aster[1]-8, $Aster[2]-8, $Aster[1]+8, $Aster[2]+8, $Aster[3],50);Значек астеройда
													If not @error Then	$var[8]=1
				PixelSearch($Ulica[1],$Ulica[2],$Ulica[1],$Ulica[2],$Ulica[3],40)			;Индикатор улицы
													If not @error Then $var[9]=1
				PixelSearch($Dist[1]-2,$Dist[2]-2,$Dist[1]+2,$Dist[2]+2,$Dist[3],40)		;Дистанция
													If not @error Then $var[11]=1
				If TimerDiff($tMining)<60000 Then $var[12]=1 								;Таймер работы майнеров
				If $zab=1 Then  $var[10]=1                                               	;За борт
				If $IzV=1 Then $var[13]=1
				PixelSearch($Cel[1]-2,$Cel[2]-2,$Cel[1]+2,$Cel[2]+2,$Cel[3],40);Цель захвачена
				If Not @error  Then
					$var[2]=3
				Else
					PixelSearch($Cel[1]-2,$Cel[2]-2,$Cel[1]+2,$Cel[2]+2,$Cel[4],40);Цель есть\нет
					If Not @error  Then
						$var[2]=2
					Else
						PixelSearch($Orbit[1],$Orbit[2],$Orbit[1],$Orbit[2],$Orbit[3],40);Значек орбиты
						if not @error Then
							$var[2]=1
						EndIf
					EndIf
				EndIf
				PixelSearch($HP[1],$HP[2],$HP[1],$HP[2],$HP[3],50);Мало ХП
				If Not @error  Then
					$var[3]=2
				Else
					PixelSearch($HP[4], $HP[5], $HP[4], $HP[5], $HP[6],50);Очень мало ХП
					If Not @error  Then
						$var[3]=1
					EndIf
				EndIf
				PixelSearch($Main[1],$Main[3],$Main[1],$Main[3],$Main[4],40);МАЙНЕР 1
				If not @error Then
					$tM1=TimerInit()
					$var[6]=1
				ElseIf @error And TimerDiff($tM1)<1500 Then
					$var[6]=1
				EndIf
				PixelSearch($Main[2],$Main[3],$Main[2],$Main[3],$Main[4],40);МАЙНЕР  2
				If not @error Then
					$tM2=TimerInit()
					$var[7]=1
				ElseIf @error And TimerDiff($tM2)<1500 Then
					$var[7]=1
				EndIf
		Else  ;Если есть ВАРП
			GUICtrlSetImage($PicVarp, $srptpic&'Варп.jpg')
			Local $var[14]=[0,1,1,1,1,1,1,1,1,1,1,1,1,1]
		EndIf
		;==========================================================================================
		$var_string=_ArrayToString($var,'',1) ;Переводит массив состояния датчиков в строку начиная с 1 элем а не с 0
		$num=_ArraySearch($DT, $var_string, 0, 0, 0, 1);Ищет в майнинг массиве номер ячейки вектора датчиков для состояния датчиков
		If @error Then;Если нет такого вектора добавляем его к массиву
				_ArrayAdd($DT,$var_string)
				$num=0
		ElseIf $var_star<>$var_string Then ;Если вектор поменялся
				_4tenie($var);Отображает реакцию датчиков если изменилсь
				_Logirovanie(1);Если состояние вектора изменилось заносим в ЛОГ 1-для обычного 2-для погрузки
				$var_star=$var_string
				If Not FileExists(@ScriptDir&'\Scrn\'&$var_string&".jpg") Then  _ScreenCapture_Capture(@ScriptDir&'\Scrn\'&$var_string&".jpg") ;Если нет картинки для этого вектора Делает скрин нового вектора
		EndIf
EndFunc
Func Dat4Obu4()
		Local $var[14]=[0,0,0,0,0,0,0,0,0,0,0,0,0,0]
				If GUICtrlRead($Ch1[1])=1  Then $var[1]=1  ;Значек ДОК цитадель
				If GUICtrlRead($Ch3[2])=1  Then $var[2]=3  ;Цель захвачена
				If GUICtrlRead($Ch2[2])=1  Then $var[2]=2  ;Цель есть\нет
				If GUICtrlRead($Ch1[2])=1  Then $var[2]=1  ;Значек орбиты
				If GUICtrlRead($Ch2[3])=1  Then $var[3]=2  ;Мало ХП
				If GUICtrlRead($Ch1[3])=1  Then $var[3]=1  ;Очень мало ХП
				If GUICtrlRead($Ch1[4])=1  Then $var[4]=1  ;Груз
				If GUICtrlRead($Ch1[5])=1  Then $var[5]=1  ;Выбран весь груз
				If GUICtrlRead($Ch1[6])=1  Then $var[6]=1  ;МАЙНЕР 1
				If GUICtrlRead($Ch1[7])=1  Then $var[7]=1  ;МАЙНЕР  2
				If GUICtrlRead($Ch1[8])=1  Then $var[8]=1  ;Значек астеройда
				If GUICtrlRead($Ch1[9])=1  Then $var[9]=1  ;Индикатор улицы
				If GUICtrlRead($Ch1[11])=1 Then $var[11]=1 ;Дистанция
				If GUICtrlRead($Ch1[12])=1 Then $var[12]=1 ;Таймер работы майнеров
				If GUICtrlRead($Ch1[10])=1 Then $var[10]=1 ;За борт
				If GUICtrlRead($Ch1[13])=1 Then $var[13]=1 ;НаСтанц/СоСтанц
		;==========================================================================================
		$var_string=_ArrayToString($var,'',1) ;Переводит массив состояния датчиков в строку начиная с 1 элем а не с 0
		If $var_star<>$var_string Then ;Если вектор поменялся
				_4tenie($var);Отображает реакцию датчиков если изменилсь
				$var_star=$var_string
		EndIf
EndFunc
Func _4tenie($str) ;Читает состояние датчиков и выводит визуальную информацию в окошке бота
	GUICtrlSetData($_Deistv,$DT[$num][1]&'  '&$DT[$num][0])
	If $str[1]=1 Then;Значек ДОК
		GUICtrlSetImage($PicDOK, $srptpic&'ДОК.jpg')
	Else
		GUICtrlSetImage($PicDOK, '')
	EndIf
	If $str[2]=3  Then;Цель
		GUICtrlSetImage($PicTarg, $srptpic&'Цель захвачена.jpg')
	ElseIf $str[2]=2  Then
		GUICtrlSetImage($PicTarg, $srptpic&'Цель есть.jpg')
	ElseIf $str[2]=1  Then
		GUICtrlSetImage($PicTarg, $srptpic&'Орбита есть.jpg')
	Else
		GUICtrlSetImage($PicTarg, $srptpic&'Цели нет.jpg')
	EndIf
	If $str[3]=2  Then;Мало ХП
		GUICtrlSetImage($PicHP, $srptpic&'ХП есть.jpg')
	ElseIf $str[3]=1  Then;Очень мало ХП
		GUICtrlSetImage($PicHP, $srptpic&'ХП нет.jpg')
	Else                           ;ХП нет совсем
		GUICtrlSetImage($PicHP, $srptpic&'ХП нет совсем.jpg')
	EndIf
	If $str[4]=1  Then;Груз
		GUICtrlSetImage($PicGruz, $srptpic&'Груз есть.jpg')
	Else
		GUICtrlSetImage($PicGruz, $srptpic&'Груз нет.jpg')
	EndIf
	If $str[5]=1  Then;Выбран весь груз
		GUICtrlSetImage($PicGruz, $srptpic&'Груз весь.jpg')
	EndIf
	if $str[6]=1  Then ;МАЙНЕР 1
		GUICtrlSetImage($PicMiner1, $srptpic&'Майнер вкл.jpg')
	Else
		GUICtrlSetImage($PicMiner1, $srptpic&'Майнер выкл.jpg')
	EndIf
	if $str[7]=1  Then;МАЙНЕР  2
		GUICtrlSetImage($PicMiner2, $srptpic&'Майнер вкл.jpg')
	Else
		GUICtrlSetImage($PicMiner2, $srptpic&'Майнер выкл.jpg')
	EndIf
	if $str[8]=1 Then;Значек астеройда
		GUICtrlSetImage($PicAster, $srptpic&'Астеройд есть.jpg')
	Else
		GUICtrlSetImage($PicAster, '')
	EndIf
	if $str[9]=1 Then;Индикатор улицы
		GUICtrlSetImage($PicGruzOkno, $srptpic&'Улица.jpg')
	Else
		GUICtrlSetImage($PicGruzOkno, '')
	EndIf
	if $str[10]=1 Then;За борт
		GUICtrlSetImage($PicZabort, $srptpic&'За борт.jpg')
	Else
		GUICtrlSetImage($PicZabort, '')
	EndIf
	if $str[11]=1 Then;Дистанция
		GUICtrlSetImage($picDist, $srptpic&'Дистанц.jpg')
	Else
		GUICtrlSetImage($picDist, '')
	EndIf
	if $str[12]=1 Then;Туда/Оттуда
		GUICtrlSetImage($PicTimer, $srptpic&'Таймер.jpg')
	Else
		GUICtrlSetImage($PicTimer, '')
	EndIf
	if $str[13]=1 Then;Туда/Оттуда
		GUICtrlSetImage($PicTudaOTtuda, $srptpic&'ИндикГрузОкна.jpg')
	Else
		GUICtrlSetImage($PicTudaOTtuda, '')
	EndIf
EndFunc
Func deistv()
		Switch $DT[$num][1]
				Case ''
;~ 						Beep(500,500)  ;Неизвестная ситуация Пищит
;~ 						MouseClick('right',110,857);Неизвестная ситуация На станцию
;~ 						MouseClick('',155,917)
				Case 'ПодкачЩит'
						Send('{f3}') ;Подкачивает Щит (выставить на одиночное нажатие 3 верхний модуль в настройках EVE)
						Sleep(500)
				Case 'ВыклМ'
						Send('^{space}');Остановка корабля
						$tMining=TimerInit()
						$tM1=TimerInit()
						$tM2=TimerInit()
						Send('{f8}');Выпустить дронов
						Send('{f9}');Восстановить связь с дронами
						_Videlenie(2,4);Захватывает 5-3 ближайшихх астеройдов
				Case 'Майн1'
						Send('{right}');Переходит к след.захваченной цели
						Send('{f1}') ;Включает майнер1
						$tM1=TimerInit()
						$tMining=TimerInit()
				Case 'Майн2'
						Send('{right}');Переходит к след.захваченной цели
						Send('{f2}') ;Включает майнер2
						$tM2=TimerInit()
						$tMining=TimerInit()
				Case 'Кастерам'
						MouseClick('right',120,877,1,$spdMos)
						MouseClick('',157,887,1,$spdMos)
						Sleep(5000)
				Case 'КлацАстерМышью'
						Send('{f8}');Выпустить дронов
						_Videlenie(5,6) ;Захватывает 2-1 ближайшихх астеройдов
						Sleep(1000)
				Case 'ПоОрбите'
						MouseClick('',1729, 79,1,$spdMos) ;Нажим полет по орбите если дистанция более 10км
				Case 'НаСтанц'
						Send('{f7}');Дроны в отсек
						Send('^{backspace}');Создает новую буку с местом последнего копа
						Sleep(500)
						Send('{enter}');Подтверждает создание буки
						Sleep(500)
						MouseClick('right',142, 859,1,$spdMos);Нажимает прав кнопку с букой станции
						MouseClick('',189, 900,1,$spdMos) ;Нажимает войти в док в выпавшем списке
						$IzV=1 ;Переменная переключатель полета на станцию и к астеройдам
						Send('{f1}') ;Выключает майнер1
						Send('{f2}') ;Выключает майнер2
						Sleep(5000)
				Case 'ВыделГруз'
						MouseClickDrag('',1493, 1033,1894, 832);Выделяет весь груз
						MouseMove(1654, 1026);Отодвигает мышь что бы не заслонять датчик
				Case 'ГрузНаСклад'
						_Logirovanie(2);2-логирование при выгрузке на склад
						$var_star=$var_string
						$timer = TimerInit() ;Таймер пищалка для (ночного режима)если долго не отвозил груз
						MouseClickDrag('',1529,833,@DesktopWidth/2,@DesktopHeight/2) ;Перетаскивает груз из трюма в окно склада (окно склада по центру экрана) Alt+G
						Sleep(2000)
				Case 'ИзДока'
						MouseClick('',1417, 838,1,$spdMos);Выделяет отсек для руды если сбито
						Send("!q");Нажимает выход из дока(ALT+Q)
						Send("!й")
						$IzV=0 ;Переменная переключатель полета на станцию и к астеройдам
				Case 'ЗаБорт'
						$timer = TimerInit()  ;Таймер пищалка если долго не сбрасывал груз (дляя ночного режима)
						MouseClick('right',1470, 832,1,$spdMos);Правый клк по верхнему
						PixelSearch(1457,842,1477,862,0xB9B9B9,40) ;Если во флоте со сборщиком
						If Not @error Then
							MouseClick('',1504, 873,1,$spdMos) ;Лев клк по "сбросить за борт"
						Else
							MouseClick('',1504, 924,1,$spdMos) ;Лев клк по "сбросить за борт"
						EndIf
						Sleep(1500)
						$IzV=0 ;Переменная переключатель полета на станцию и к астеройдам
				Case 'Пищать'
						Beep(500,500)
		EndSwitch
EndFunc
Func _Videlenie($i,$j) ;Захватывает ближайшие 5 целей
		Send('{CTRLDOWN}')
			For $ii = $i To $j
				MouseClick('',1679, $AsterPos[$ii],1,$spdMos);Нажим цели 1-2-3-4-5 Разница по вертикали в 20пкс
			Next
		Send('{CTRLUP}')
		Sleep(100)
		MouseClick('',1679, $AsterPos[6],1,$spdMos);Нажим самой ближней цели
EndFunc
Func _Obu4Glubok()  ;Глубокое обучение с картинками
					_HotkeyObu4(1) ;Устанавливает хоткеи для обучения
					_GuiCreateObu4(1);1-Окно над датчиками (список векторов)
					_GuiCreateObu4(3);3-Окно подсказок по хоткеям обучения
					GUICtrlSetData($_Deistv,'') ;Устанавливает пустую строку в текстовом состоянии датчиков
					;Выбрать действие в выпадающем меню со стрелочкой
					Do
					Until _IsPressed('0D')   ;Ждет пока не нажмется Enter
					_GuiCreateObu4(2);2-Окно скринов обучения
					For $i=1 To UBound($DT)-1 ;Записывает выбранные вектора в ОБУЧЕНИЕ
						If $DT[$i][1]=GUICtrlRead($ComboDeistv) Then _ArrayAdd($VektoriObu4,$DT[$i][0]);Проходит циклом по названиям выбранного вектора "ВДОК","Майн1" и т.д.Добавляет в список для обучения выбранные вектора по названию
					Next
					_ArrObu4Pokaz()
					Do
					Until _IsPressed('23') Or _IsPressed('24') Or UBound($VektoriObu4)=1 ;Кнопка END или HOME или не закончатся ВЕКТОРЫ
					_GuiCreateObu4(4);4-Закрывает  над датчиками (список векторов) для выбранного действия обучения
					_GuiCreateObu4(5);5-Закрывает  скринов обучения
					_GuiCreateObu4(6);6-Закрывает Окно подсказок по хоткеям обучения
					_HotkeyObu4(3) ;убирает окошко с хоткеями обучения
					_LogSbros()
					ArryZap()
EndFunc
Func _Obu4Bistroe() ;Быстрое обучение с моментальной задачей действия
					If $a=0 Then
						_GuiCreateObu4(3);3-Окно подсказок по хоткеям обучения
						_HotkeyObu4(2) ;Задает хоткеи для обучения
						$a=1
					ElseIf $a=1 Then
						_GuiCreateObu4(6) ;Закрывает подсказки хоткеев обучения
						_HotkeyObu4(3) ;Убирает хоткеи обучения
						_LogSbros()	;Сбрасывает ЛОГ в .txt
						ArryZap()	;Записывает массив векторов в .txt
						$a=0
					EndIf
EndFunc
Func _Obu4Param() ;Обучение по заданным параметрам
		Local $CHarr2D[1][2],$arrDoblKzamene[1],$Zamen=0
		_GuiCreateObu4('параметры') ;Создает окно обучения по параметрам и заносит их в массив
		Do
			Dat4Obu4()
		Until _IsPressed('0D')   ;Ждет пока не нажмется Enter
		Global $CHarr[14]
		For $i = 1 To UBound($Ch1)-1;проход по чекбоксам считывание состояний
			If GUICtrlRead($Ch0[$i])=1 Then $CHarr[$i]='0'
			If GUICtrlRead($Ch1[$i])=1 Then $CHarr[$i]=1
			If GUICtrlRead($Ch2[$i])=1 Then $CHarr[$i]=2
			If GUICtrlRead($Ch3[$i])=1 Then $CHarr[$i]=3
		Next
		For $i = 1 To UBound($CHarr)-1 ;Создает список непустых чекбоксов в $CHarr масссив
			If $CHarr[$i]<>'' Then _ArrayAdd($CHarr2D,$i&'|'&$CHarr[$i],0);Если элемент не равен пустому тогда записывет его позицию и значение в $CHarr2D массив 0-Позиция 1-Значение
		Next
		For $i = 1 To UBound($DT)-1 ;Проход по элементам $DT и запись в спирос если галочки совпадают
			$ArrSravn=StringSplit($DT[$i][0],'');Раскладывает элемент массива $DT на массив
			For $ii=1 To UBound($CHarr2D)-1
				If $ArrSravn[$CHarr2D[$ii][0]] = $CHarr2D[$ii][1] And $ii= UBound($CHarr2D)-1 Then ;Если все элементы равны всем галочкам то делает замену
					$DT[$i][1]=GUICtrlRead($ComboDeistv)
					$Zamen+=1
				ElseIf $ArrSravn[$CHarr2D[$ii][0]] <> $CHarr2D[$ii][1] Then ;Если есть несовпадение то пропускает этот элемент $DT
					ExitLoop
				EndIf
			Next
		Next
		MsgBox(0, 'Количество замен', 'Замены='&$Zamen)
		_GuiCreateObu4(7);Закрывает окно обучения по параметрам
		ArryZap()	;Записывает массив векторов в .txt
EndFunc
Func _ArrObu4Pokaz() ;Обновляет информацию в списке обучаемых веторов после выбора действия
		If UBound($VektoriObu4)>1 Then ;Если векторы обучения еще не закончились то продолжает обучение
			_4tenie(StringSplit($VektoriObu4[1],''))   ;Показывает состояние датчиков визуально индикаторами бота
			GUICtrlSetData($massivi,_ArrayToString($VektoriObu4,@CRLF,1));Переписывает окно со списком векторов обучения
			GUICtrlSetData($_Deistv,$VektoriObu4[1]) ;Устанавливает в строку состояния датчиков текущий вектор из обучения
			$num=_ArraySearch($DT,$VektoriObu4[1],1) ;Поиск в векторах текущего вектора из обучения
			If FileExists(@ScriptDir&'\Scrn\'&$DT[$num][0]&".jpg") Then     ;Если есть картинка для этого вектора
				GUICtrlSetImage($FonScrn, @ScriptDir&'\Scrn\'&$DT[$num][0]&'.jpg') ;Ставит на скрин-окно обучения скрин соответстующего вектора
			Else ;Если нет картинки то ставит пустую
				GUICtrlSetImage($FonScrn, 'Пусто.jpg') ;Ставит на скрин-окно обучения пустую картинку
			EndIf
		Else
			_GuiCreateObu4(4);4-Закрывает  над индикаторами окно со списком векторов
		EndIf
EndFunc
;===========================================================================================
Func _HotkeyObu4($n)
		Switch $n
			Case 1 ;Задает ноткеи для обучения с картинками (скринами)
				HotKeySet('{numpad1}','_KnopGlubok')
				HotKeySet('{numpad2}','_KnopGlubok')
				HotKeySet('{numpad3}','_KnopGlubok')
				HotKeySet('{numpad4}','_KnopGlubok')
				HotKeySet('{numpad5}','_KnopGlubok')
				HotKeySet('{numpad6}','_KnopGlubok')
				HotKeySet('{numpad7}','_KnopGlubok')
				HotKeySet('{numpad8}','_KnopGlubok')
				HotKeySet('{numpad9}','_KnopGlubok')
				HotKeySet('{numpad0}','_KnopGlubok')
				HotKeySet('{numpaddot}','_KnopGlubok')
				HotKeySet('{numpadmult}','_KnopGlubok')
				HotKeySet('{numpaddiv}','_KnopGlubok')
				HotKeySet('{NUMPADADD}','_KnopGlubok')
				HotKeySet('{up}','_KnopGlubok')
				HotKeySet('{end}')
				HotKeySet('{del}','_del')
				GUICtrlSetImage($PicVopros, $srptpic&'Вопрос.jpg')
			Case 2 ;Хоткеи дляя быстрого обучения чтобы задать действие сразу же
				HotKeySet('{numpad1}','_KnopBistroe')
				HotKeySet('{numpad2}','_KnopBistroe')
				HotKeySet('{numpad3}','_KnopBistroe')
				HotKeySet('{numpad4}','_KnopBistroe')
				HotKeySet('{numpad5}','_KnopBistroe')
				HotKeySet('{numpad6}','_KnopBistroe')
				HotKeySet('{numpad7}','_KnopBistroe')
				HotKeySet('{numpad8}','_KnopBistroe')
				HotKeySet('{numpad9}','_KnopBistroe')
				HotKeySet('{numpad0}','_KnopBistroe')
				HotKeySet('{numpaddot}','_KnopBistroe')
				HotKeySet('{numpadmult}','_KnopBistroe')
				HotKeySet('{NUMPADADD}','_KnopBistroe')
				HotKeySet('{numpaddiv}','_KnopBistroe')
				HotKeySet('{end}')
				GUICtrlSetImage($PicVopros, $srptpic&'Вопрос.jpg')
			Case 3 ;Убирает хоткеи
				HotKeySet('{numpad1}')
				HotKeySet('{numpad2}')
				HotKeySet('{numpad3}')
				HotKeySet('{numpad4}')
				HotKeySet('{numpad5}')
				HotKeySet('{numpad6}')
				HotKeySet('{numpad7}')
				HotKeySet('{numpad8}')
				HotKeySet('{numpad9}')
				HotKeySet('{numpad0}')
				HotKeySet('{numpaddot}')
				HotKeySet('{numpadmult}')
				HotKeySet('{numpaddiv}')
				HotKeySet('{NUMPADADD}')
				HotKeySet('{up}')
				HotKeySet('{del}')
				HotKeySet('{end}','eksit')
				GUICtrlSetImage($PicVopros, '')
		EndSwitch
EndFunc
Func _del() ;Удаляет выбранный вектор обучения и картинку к нему если она есть в папке Scrn
	If FileExists(@ScriptDir&'\Scrn\'&$DT[$num][0]&".jpg") Then FileDelete(@ScriptDir&'\Scrn\'&$DT[$num][0]&'.jpg') ;Если есть картинка для этого вектора то удаляет эту картинку
	_ArrayDelete($DT,$num)
	_ArrayDelete($VektoriObu4,1) ;Удаляет первую(верхнюю ячейку)из векторов обучения
	_ArrObu4Pokaz()
EndFunc
Func _KnopGlubok() ;Присваивает значение действия вектору обучения по выбранной кнопке
	If _IsPressed('61') Then $DT[$num][1]=$Dn[1];Нум 1
	If _IsPressed('62') Then $DT[$num][1]=$Dn[2] ;Нум 2
	If _IsPressed('63') Then $DT[$num][1]=$Dn[3] ;Нум 3
	If _IsPressed('64') Then $DT[$num][1]=$Dn[4] ;Нум 4
	If _IsPressed('65') Then $DT[$num][1]=$Dn[5] ;Нум 5
	If _IsPressed('66') Then $DT[$num][1]=$Dn[6] ;Нум 6
	If _IsPressed('67') Then $DT[$num][1]=$Dn[7] ;Нум 7
	If _IsPressed('68') Then $DT[$num][1]=$Dn[8] ;Нум 8
	If _IsPressed('69') Then $DT[$num][1]=$Dn[9] ;Нум 9
	If _IsPressed('60') Then $DT[$num][1]=$Dn[10] ;Нум 0
	If _IsPressed('6E') Then $DT[$num][1]=$Dn[11] ;Нум точка
	If _IsPressed('6B') Then $DT[$num][1]=$Dn[12] ;Нум сложение
	If _IsPressed('6A') Then $DT[$num][1]=$Dn[13] ;Нум умножение
	If _IsPressed('6C') Then $DT[$num][1]=$Dn[14] ;Нум деление
	_ArrayDelete($VektoriObu4,1) ;Удаляет первую(верхнюю ячейку)из векторов обучения
	_ArrObu4Pokaz()
EndFunc
Func _KnopBistroe() ;Присваивает значение действия вектору обучения по выбранной кнопке
	If _IsPressed('61') Then $DT[$num][1]=$Dn[1];Нум 1
	If _IsPressed('62') Then $DT[$num][1]=$Dn[2] ;Нум 2
	If _IsPressed('63') Then $DT[$num][1]=$Dn[3] ;Нум 3
	If _IsPressed('64') Then $DT[$num][1]=$Dn[4] ;Нум 4
	If _IsPressed('65') Then $DT[$num][1]=$Dn[5] ;Нум 5
	If _IsPressed('66') Then $DT[$num][1]=$Dn[6] ;Нум 6
	If _IsPressed('67') Then $DT[$num][1]=$Dn[7] ;Нум 7
	If _IsPressed('68') Then $DT[$num][1]=$Dn[8] ;Нум 8
	If _IsPressed('69') Then $DT[$num][1]=$Dn[9] ;Нум 9
	If _IsPressed('60') Then $DT[$num][1]=$Dn[10] ;Нум 0
	If _IsPressed('6E') Then $DT[$num][1]=$Dn[11] ;Нум точка
	If _IsPressed('6B') Then $DT[$num][1]=$Dn[12] ;Нум сложение
	If _IsPressed('6A') Then $DT[$num][1]=$Dn[13] ;Нум умножение
	If _IsPressed('6C') Then $DT[$num][1]=$Dn[14] ;Нум деление
EndFunc
Func zabort();Скидывание руды за борт когда рядом летает грузовой корабль и собирает руду
   $zab+=1
	If $zab=1 Then
		GUICtrlSetImage($PicZabort, $srptpic&'За борт.jpg')
		$Gruz[1]-=20
	ElseIf $zab<>1 Then
		GUICtrlSetImage($PicZabort, '')
		$Gruz[1]+=20
		$zab=0
	EndIf
EndFunc
;==========================================================================================================
Func pausa() ;Вкл/Выкл работы бота
	$ps+=1
	If $ps=1 Then
		$timer = TimerInit()
;~ 		_BlockInputEx(1,'{space}');  Включает блокировку всех кнопок кроме Pause/Break (На случай кота на столе)
		GUICtrlSetImage($PicPausa, $srptpic&'Работа.jpg')
	ElseIf $ps<>1 Then
;~ 		_BlockInputEx(0);  Разблокирует всё
		GUICtrlSetImage($PicPausa, '')
		$ps=0
	EndIf
EndFunc
Func podskaz() ;Выводит на экран ToolTip cо списком основных горячих клавишь
	$pd+=1
	If $pd=1 Then
		ToolTip('-TAB-               Запуск бота'&@CRLF&'-TAB-                    Справка'&@CRLF&'-ctrl+home-           Обучение бота'&@CRLF&'-home-           Быстрое обучение бота'&@CRLF&'-insert-            Груз за борт'&@CRLF&'-Ctrl+TAB-               ЛогФайл'&@CRLF&'-End-               Выход' ,800 ,200 )
	ElseIf $pd<>1 Then
		ToolTip('')
		$pd=0
	EndIf
EndFunc
Func ArryZap()   ;Сохраняет в .txt массивы векторов
	$File=FileOpen('МайнингМассивы.txt',2)
		_ArraySort($DT, 0, 1, 0, 1);Сортировка в первой колонке двумерного массива (по именам действий) Сортировка с 1-го элемента (в нолевом пусто)
		FileWrite($File,_ArrayToString($DT,',',1) )
	FileClose($File)
EndFunc
Func eksit()
	_LogSbros() ;Сбрасывает логи в .txt
	ArryZap() ;Сохраняет в txt файл векторов с которыми работал
	Exit
EndFunc


Прикрепил текстовый файл с набором векторов-ситуаций и действий по ним
 

Вложения

  • 0220011110010.jpg
    0220011110010.jpg
    113.8 КБ · Просмотры: 67
  • МайнингМассивы.txt
    7.7 КБ · Просмотры: 38

DJ_Tommy

Продвинутый
Сообщения
236
Репутация
57
RavdonikaS сказал(а):
Вот мой бот с немного другим принципом построения
Пытался оформить красиво с картинками пояснениями и описаниями не дает этого сделать пишет то " вы прикрепили более 5 файлов" то "ваш файл слишком большой"
Кратко напишу лишь что основная идея позаимствована из нейронных сетей но выполнено более просто
Бот построен не на многоэтажных If-Then а на составлении из состояний датчиков вектора и сравнение его с действием которое нужно выполнить в данной ситуации Есть графический интерфейс

Смысла выносить все по разным файлам нет никакого. Логика в общем то стандартная, главное что бы у вас все работало.
 

RavdonikaS

Новичок
Сообщения
68
Репутация
4
Продвинутый карибас сказал(а):
Логика в общем то стандартная, главное что бы у вас все работало.
Та ну я помню как первого для EVE писал на If-Then это тихий ужас Вроде описал все возможные ситуации через пять минут всплывает новая ситуация которая при тех If-Then начинает творить ересь вплоть до потери корабля Приходится опять лезть в код переписывать If встраивать в If тот If в еще один If и прикручивать к ним несколько Else Через еще 5 минут выясняется что еще какая то ситуация новая не даёт работать нормально тем конструкциям и в итоге это получается многочасовая правка кода которую если что то не дописано даже страшно оставить на белте (если произойдёт что то неучтенное)

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

Как на If-Then конструкциях описать что эта ситуация нестандартная(не описанная)? Вот и получалось у меня что он либо стоит ничего не делает либо погибает либо долбится в станцию

По наличию в теле Case и датчиков не стоит судить об обычности Смотреть надо как эти все части взаимодействуют вместе
Вот в этом и состоит главное отличие от всего что я видел видел в этой ветке
Говорю же плохо что нет возможности оформить это всё с картинками и пояснениями на первый взгляд основную идею нельзя понять и кажется что это всё то же из представленного выше
 

DJ_Tommy

Продвинутый
Сообщения
236
Репутация
57
RavdonikaS сказал(а):
Продвинутый карибас сказал(а):
Логика в общем то стандартная, главное что бы у вас все работало.
Та ну я помню как первого для EVE писал на If-Then это тихий ужас Вроде описал все возможные ситуации через пять минут всплывает новая ситуация которая при тех If-Then начинает творить ересь вплоть до потери корабля Приходится опять лезть в код переписывать If встраивать в If тот If в еще один If и прикручивать к ним несколько Else Через еще 5 минут выясняется что еще какая то ситуация новая не даёт работать нормально тем конструкциям и в итоге это получается многочасовая правка кода которую если что то не дописано даже страшно оставить на белте (если произойдёт что то неучтенное)

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

Как на If-Then конструкциях описать что эта ситуация нестандартная(не описанная)? Вот и получалось у меня что он либо стоит ничего не делает либо погибает либо долбится в станцию
Каждый датчик - отдельная функция. Каждое действие - отдельная функция. Само тело бота делается через CASE. А смысла городить несколько файлов нет никакого, т.к. они короткие по паре страниц. Зачем самостоятельно создавать путаницу? Но опять же - если все работает, значит программа написана правильно. К тому же у нас нет необходимости в быстродействие, и мы сами же пишем задержки. Так что все норм.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Продвинутый карибас

Предупреждение За нарушение общих правил (пункт В.2):
Старайтесь избегать “Over quoting” (преувеличенное цитирование) - цитируйте только необходимую часть сообщения, которая наилучшим образом подчеркнёт суть цитируемого.


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

RavdonikaS

Новичок
Сообщения
68
Репутация
4
Продвинутый карибас сказал(а):
А смысла городить несколько файлов нет никакого, т.к. они короткие по паре страниц.
Мне например так удобнее и код оценивать и что то править в нём Надо мне что то подправить в датчиках я не прокручиваю 4 страницы до того момента где пошли датчики а всего лишь клацаю на вкладку с файлом датчиков и сразу знаю что ага вот это передо мной всё что связано с датчиками Нужно мне что то в окошках GUI подправить нажимаю на вкладку с файлом GUI всё передо мной ничего не ищю знаю где что находится
Это я объяснил свою логику почему у меня в разных файлах - быстрее и удобнее работать с кодом
 
Верх