|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [архив - Часть 2] AutoIt скрипты |
|
[архив - Часть 2] AutoIt скрипты
|
(*.*) Сообщения: 36564 |
Внимание! Тема переведена в архивное состояние Текущая тема http://forum.oszone.net/thread-98914.html (настоятельно рекомендуется к прочтению/поиску) Руководство к действию по работе c AutoIt. ![]() Сайт программы Русская справка Коллекция AutoIt скриптов от Sanja Alone Коллекция AutoIt скриптов от MSFN (могут быть устаревшие). Справочник по командам rundll32 (команды запуска диалоговых окон и не только...) AutoIt скрипты - введение и FAQ (статья содержит вводную информацию по AutoIt, а также ответы на ЧаВо). Данная тема предназначена для общих вопросов по AutoIt. Вопросы по установке приложений при помощи AutoIt следует задавать в соответствии с правилами форума "Автоматическая установка приложений". Таким образом, если вы хотите узнать как установить Winamp 5.x при помощи AutoIt, то создайте тему [autoit] Winamp 5.х (если таковой еще нет на форуме). Проверить наличие тем можно при помощи поиска или фильтров. Цитата Vadikan:
|
||
------- Отправлено: 00:02, 05-02-2006 |
Ветеран Сообщения: 604
|
Профиль | Отправить PM | Цитировать amel27,
Цитата amel27:
|
|
------- Отправлено: 16:56, 25-08-2007 | #391 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Maza Faka
Цитата:
Creat0R Цитата:
![]() ADD: Цитата:
|
|||
Последний раз редактировалось amel27, 27-08-2007 в 11:11. Отправлено: 10:30, 27-08-2007 | #392 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать amel27,
Цитата:
![]() Всегда получается что кто-то ждёт дольше или меньше.. даже если речь идёт о 5-ти, и даже 4-тёх игроках... В результате сделал типа такого (набросок с реальной бумаги ![]() #include <Array.au3> Global $PlayersString = "Вася|Петя|Паша|Толик|Лёня|Кеша" Global $TotalPlayers = UBound(StringSplit($PlayersString, "|"))-1 Global $TotalGames = ($TotalPlayers * ($TotalPlayers-1)) / 2 Global $GamesListArr = GetRandomGames($PlayersString, $TotalPlayers, $TotalGames) _ArrayDisplay($GamesListArr) Func GetRandomGames($PlayersString, $TotalPlayers, $TotalGames) Local $GamesList = '' Local $PlayersArray = StringSplit($PlayersString, "|") Local $SortArray[$TotalPlayers+1], $GamesStr = '' For $i = 1 To $TotalPlayers $SortArray[$i] = $PlayersArray[Random(1, $TotalPlayers, 1)] While StringInStr($GamesStr, $SortArray[$i]) $SortArray[$i] = $PlayersArray[Random(1, $TotalPlayers, 1)] WEnd $GamesStr &= $SortArray[$i] & @CRLF Next Local $GamesListArr[$TotalGames+1] Switch $TotalPlayers Case 6 $GamesListArr[1] = $SortArray[1] & @Tab & " [vs] " & @Tab & $SortArray[3] $GamesListArr[2] = $SortArray[2] & @Tab & " [vs] " & @Tab & $SortArray[4] $GamesListArr[3] = $SortArray[5] & @Tab & " [vs] " & @Tab & $SortArray[6] $GamesListArr[4] = $SortArray[1] & @Tab & " [vs] " & @Tab & $SortArray[4] $GamesListArr[5] = $SortArray[3] & @Tab & " [vs] " & @Tab & $SortArray[2] $GamesListArr[6] = $SortArray[4] & @Tab & " [vs] " & @Tab & $SortArray[6] $GamesListArr[7] = $SortArray[1] & @Tab & " [vs] " & @Tab & $SortArray[5] $GamesListArr[8] = $SortArray[2] & @Tab & " [vs] " & @Tab & $SortArray[6] $GamesListArr[9] = $SortArray[4] & @Tab & " [vs] " & @Tab & $SortArray[3] $GamesListArr[10] = $SortArray[1] & @Tab & " [vs] " & @Tab & $SortArray[2] $GamesListArr[11] = $SortArray[5] & @Tab & " [vs] " & @Tab & $SortArray[4] $GamesListArr[12] = $SortArray[6] & @Tab & " [vs] " & @Tab & $SortArray[3] $GamesListArr[13] = $SortArray[2] & @Tab & " [vs] " & @Tab & $SortArray[5] $GamesListArr[14] = $SortArray[1] & @Tab & " [vs] " & @Tab & $SortArray[6] $GamesListArr[15] = $SortArray[3] & @Tab & " [vs] " & @Tab & $SortArray[5] EndSwitch Return $GamesListArr EndFunc Сделать всё это без бумаги (т.е программно сгененрировать оптимальные варианты) у меня не удалось, а оно очень помогло бы, т.к могут быть и не 6 игроков, а, скажем 7 или 5 и т.д... для каждого количества игроков я конечно могу также выкрутиться с бумагой (что я и сделал для 5-ти и 4-ёх игроков, для этого в принципе и оставлен Switch в функции ![]() ![]() Цитата:
![]() А на счёт GUI, ну, у меня есть пару вариации с отсчётом и обычные, но дело в том, что довольно сложно подобрать оптимальный вариант когда речь идёт о размерах диалога MsgBox в соответствии с передаваемым текстом, т.е мне до сих пор не удалось просчитать точно какой размер должен иметь гуи, чтобы поместить в себе указанный текст, и при этом не "покрыть" кнопки текстом (ведь передаваться могут также и символы перевода строки, это само по себе припятствие), а также ещё не знаю на какой системный файл можно понадеятся чтобы украсть с него иконки для отображения ![]() |
||
------- Отправлено: 19:46, 27-08-2007 | #393 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Цитата Creat0R:
Вот вариант скрипта, пытающегося перебрать все варианты, в качестве условий я задал постоянство периода для одного игрока и разный период для разных игроков (найдены при анализе задачи). Удачной комбинацией считается использование всех возможных партий хотя бы по разу. Global Const $iCNT = 6 ; Количество игроков Global Const $iMAX = _Factorial($iCNT) / (_Factorial($iCNT-2)*_Factorial(2)) ; Количество всевозможных пар игроков ; Массив "игроки" ; $aPlayers[$i][0] - кол-во сыгранных игроком партий ; $aPlayers[$i][1] - время последней партии игрока (индекс $aTimeLine[]) ; $aPlayers[$i][2] - временной интервал между последней и предпоследней партиями игрока Global $aPlayers[$iCNT+1][3] ; Массив "игровые пары" ; $aPatterns[$i][1] - битовый паттерн пары (не используется) ; $aPatterns[$i][2] - битовый паттерн 1-го игрока (не используется) ; $aPatterns[$i][3] - битовый паттерн 2-го игрока (не используется) ; $aPatterns[$i][4] - номер 1-го игрока ; $aPatterns[$i][5] - номер 2-го игрока Global $aPatterns[$iMAX+1][6], $k=0 ; Заполнение массива всевозможных пар For $i=1 To $iCNT For $j=$i+1 To $iCNT $k+=1 $aPatterns[$k][4]=$i $aPatterns[$k][5]=$j $aPatterns[$k][2]=BitRotate(1, $i-1) $aPatterns[$k][3]=BitRotate(1, $j-1) $aPatterns[$k][1]=BitOR($aPatterns[$k][2],$aPatterns[$k][3]) Next Next ; Массив "линия времени" ; $i - порядковый номер игры (aka "дискретное время") ; $aTimeLine[$i] - пара игроков (индекс массива $aPatterns) Global $aTimeLine[2] = [1,0] ; Основной цикл перебор: ; выход по завершению перебора всех вариантов, ; либо при нахождении нужного While $aTimeLine[0]>0 And Not(_CheckTimeLine()) $ret = _PatternNext() ; ищем следующего предендента If $ret Then _PatternAdd($ret) $aTimeLine[0]+=1 Else _PatternDel() $aTimeLine[0]-=1 EndIf ReDim $aTimeLine[$aTimeLine[0]+1] ; вывод промежуточного результата _TimeLinePrint() WEnd ; Поиск следующей партии, подходящей по условию Func _PatternNext() Local $i For $i=$aTimeLine[$aTimeLine[0]]+1 To $iMAX If _PatternCheck($i) Then Return $i Next Return 0 EndFunc ; Процедура удаления предыдущей комбинации: ; (все возможные партии исчерпаны) Func _PatternDel() Local $iDEL=$aTimeLine[$aTimeLine[0]] ; код последней проверенной партии If $iDEL Then Local $i, $aP[3]=[2, $aPatterns[$iDEL][4], $aPatterns[$iDEL][5]] ; номера игроков ; Обновляем характеристики игроков For $i=1 To $aP[0] $aPlayers[$aP[$i]][0]-=1 ; уменьшаем счетчик игр $aPlayers[$aP[$i]][1]-=$aPlayers[$aP[$i]][2] ; расчет индекса предыдущей игры Next $aPatterns[$iDEL][0]-=1 ; уменьшаем счетчик для партии EndIf EndFunc ; Процедура формирования следующей комбинации: ; (добавление очередной партии) Func _PatternAdd($iNext) _PatternDel() ; удаление предыдущего вариата $aPatterns[$iNext][0]+=1 ; увеличиваем счетчик для партии $aTimeLine[$aTimeLine[0]]=$iNext ; устанавливаем новое значение партии Local $aP[3]=[2, $aPatterns[$iNext][4], $aPatterns[$iNext][5]] ; номера игроков ; Обновляем характеристики игроков For $i=1 To $aP[0] $aPlayers[$aP[$i]][0]+=1 ; увеличиваем счетчик игр If $aPlayers[$aP[$i]][0]=2 Then $aPlayers[$aP[$i]][2]=$aTimeLine[0]-$aPlayers[$aP[$i]][1] ; интервал игр $aPlayers[$aP[$i]][1]=$aTimeLine[0] ; индекс последней игры Next EndFunc ; Условие на добавляемую в конец "линии времени" ; партию ("пару игроков") Func _PatternCheck($iPattern) Local $i, $k, $aL[3]=[2,0,0], $aB[3]=[2,0,0] ; интервалы и результат проверки игроков Local $aP[3]=[2, $aPatterns[$iPattern][4], $aPatterns[$iPattern][5]] ; номера игроков ; Проверка параметров каждого игрока For $k=1 To $aP[0] If $aPlayers[$aP[$k]][0]=1 Then ; для 2-й партии $aL[$k] = $aTimeLine[0]-$aPlayers[$aP[$k]][1] ; устанавливаем значение интервала ; Условия на интервал между играми: If $aL[$k]=1 Then Return False ; запрет на непрерывную игру For $i=1 To $iCNT ; запрет на одинаковые интервалы разных игроков If $i<>$k Then If $aL[$k]=$aPlayers[$i][2] Then Return False EndIf Next ElseIf $aPlayers[$aP[$k]][0]>1 Then ; для последующих партий If $aTimeLine[0]-$aPlayers[$aP[$k]][1]<>$aPlayers[$aP[$k]][2] Then Return False ; проверка на постоянство интервала EndIf Next ; проверка совместных параметров двух игроков If $aPlayers[$aP[1]][0]=1 And $aPlayers[$aP[2]][0]=1 Then If $aL[1]=$aL[2] Then Return False EndIf Return True EndFunc ; Условие на всю последовательность игр, по выполнении которого ; программа считает, что искомый вариант найден Func _CheckTimeLine() Local $i ; проверка на использование всех возможных "пар игроков" For $i=1 To $iMAX If $aPatterns[$i][0]=0 Then Return False Next Return True EndFunc ; Вывод на консоль обрабатываемого варианта Func _TimeLinePrint() Local $s1='', $s2='' For $i=1 To $aTimeLine[0] If $aTimeLine[$i] Then $s1&=$aPatterns[$aTimeLine[$i]][4] &' ' $s2&=$aPatterns[$aTimeLine[$i]][5] &' ' EndIf Next If $aTimeLine[0] Then ConsoleWrite($s1&@CRLF&$s2&@CRLF&@CRLF) Else ConsoleWrite("NULL"&@CRLF) EndIf EndFunc ; Расчет факториала Func _Factorial($int) Local $i, $res=1 For $i=1 To $int $res*=$i Next Return $res EndFunc |
|
Последний раз редактировалось amel27, 28-08-2007 в 06:06. Причина: ошибка в скрипте Отправлено: 05:51, 28-08-2007 | #394 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать amel27,
Цитата:
Цитата:
Я понимаю что задачка немного(?) может показаться смутной, возможно если я приведу пример того что я уже сделал в виде ГУИ интерфейса (где я уже использую выше-приведённый мной метод), это поможет иметь более чёткое представление о задаче? Цитата:
Мне кажется это можно подсчитать таким образом - (Количество игроков * (количество игроков - 1)) / 2... т.е типа такого: Ведь каждый должен сиграть с каждым, и тогда получается что при 6-ти игроках имеем 6 раз по 5, но так как сам с собой игрок играть не может ![]() |
|||
------- Отправлено: 06:20, 28-08-2007 | #395 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Цитата Creat0R:
![]() Цитата Creat0R:
![]() |
||
Отправлено: 06:53, 28-08-2007 | #396 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать amel27,
Цитата:
![]() Цитата:
![]() Чуть позже выложу скрипт с тем что я уже сделал, там всё вручную и никаких проверок, но зато я горжусь там одной функцией CalculateWinner() ![]() |
||
------- Отправлено: 07:15, 28-08-2007 | #397 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Creat0R
Цитата:
![]() Цитата:
![]() |
||
Отправлено: 09:10, 28-08-2007 | #398 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать amel27,
Цитата:
![]() #Include <GuiConstants.au3> $Title = "My Custom MsgBox" $Promt = "Are you sure?" $CheckBoxText = "Don't show again" $hWnd = WinGetHandle("") $Ask = _GuiMsgBox(32, 2, $Title, $Promt, 330, 120, $CheckBoxText, 10, $hWnd, "OK", "Cancel") $CheckBitAnd = BitAND($Ask, 8) $Var = "Pressed " Select Case $Ask - $CheckBitAnd = 1 $Var &= "'OK'" Case $Ask - $CheckBitAnd = 6 $Var &= "'Yes' or 'OK'" Case $Ask - $CheckBitAnd = 7 $Var &= "'No' or 'Cancel'" EndSelect If $CheckBitAnd = 8 Then $Var &= @LF & "And CheckBox <" & $CheckBoxText & "> was Checked" MsgBox(64, "Message", "Returned values:" & @LF & @LF & $Var) Func _GuiMsgBox($IcoType,$Butt_Num,$Title,$Text,$Width,$Height,$CB_Text=-1,$Timer=-1,$hWnd=0,$B1Text=-1,$B2Text=-1,$ExStyle=-1) Local $Yes, $No, $OK, $CheckBox=-1, $Gui, $GuiHeight = $Height, $TitleType = $WS_CAPTION+$WS_POPUP, $Msg, $ReturnVal = 0 Local $DefButton = $OK, $DefButtonText = $B1Text, $Counter Switch $IcoType Case 16 $IcoType = 103 Case 32 $IcoType = 102 Case 48 $IcoType = 101 Case 64 $IcoType = 104 Case Else $IcoType = 102 EndSwitch Local $Old_Opt_GOEM = Opt('GuiOnEventMode', 0) Local $Old_Opt_GCOE = Opt('GUICloseOnESC', 0) If $hWnd <> 0 Then WinSetState($hWnd, "", @SW_DISABLE) If $Butt_Num = 1 Then $TitleType += $WS_SYSMENU If $CB_Text <> -1 Then $GuiHeight += 25 If $B1Text = -1 Then $B1Text = 'OK' If $B2Text = -1 Then $B2Text = 'Cancel' $Gui = GuiCreate($Title, $Width, $GuiHeight, -1, -1, $TitleType, $ExStyle, $hWnd) GUICtrlCreateIcon('user32.dll', $IcoType, 10, 10) GUICtrlCreateLabel($Text, 70, 15, $Width-80, $Height-50) Select Case $Butt_Num = 2 $Yes = GUICtrlCreateButton($B1Text, ($Width/2)-90, $Height-35, 70, 20) $DefButton = $Yes $No = GUICtrlCreateButton($B2Text, ($Width/2)+20, $Height-35, 70, 20) GUICtrlSetState($No, $GUI_ONTOP) GUICtrlSetState($Yes, $GUI_ONTOP+$GUI_DEFBUTTON) Case Else $OK = GUICtrlCreateButton($B1Text, ($Width-70)/2, $Height-35, 70, 20) GUICtrlSetState($OK, $GUI_DEFBUTTON+$GUI_ONTOP) $DefButton = $OK EndSelect If $CB_Text <> -1 Then $CheckBox = GUICtrlCreateCheckbox($CB_Text, 15, $Height-10) GuiSetState(@SW_SHOW, $Gui) If $Timer > 0 Then $Counter = $Timer $Timer = TimerInit() $DefButtonText = GUICtrlRead($DefButton) GUICtrlSetData($DefButton, $DefButtonText & ' (' & $Counter & ')') EndIf While 1 $Msg = GUIGetMsg() If $Timer > 0 And TimerDiff($Timer) >= 1000 Then $Timer = TimerInit() $Counter -= 1 GUICtrlSetData($DefButton, $DefButtonText & ' (' & $Counter & ')') If $Counter < 0 Then $Msg = $DefButton EndIf Select Case $Butt_Num = 2 And $Msg = $Yes $ReturnVal = 6 ExitLoop Case $Butt_Num = 2 And $Msg = $No $ReturnVal = 7 ExitLoop Case $Msg = -3 Or ($Msg = $OK And $Butt_Num <> 2) $ReturnVal = 1 ExitLoop EndSelect Wend If GUICtrlRead($CheckBox) = 1 Then $ReturnVal += 8 If $hWnd <> 0 Then WinSetState($hWnd, "", @SW_ENABLE) GUIDelete($Gui) Opt('GuiOnEventMode', $Old_Opt_GOEM) Opt('GUICloseOnESC', $Old_Opt_GCOE) Return $ReturnVal EndFunc Возвращаемое значение: 6 = Кнопка ОК / Yes была нажата. 7 = Кнопка Cancel / No была нажата. 6+8 = Кнопка ОК / Yes была нажата и была поставлена птичка. 7+8 = Кнопка Cancel / No была нажата и была поставлена птичка. |
|
------- Отправлено: 09:32, 28-08-2007 | #399 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Цитата Creat0R:
![]() по поводу системного окна можно предположить два варианта: 1. Запускать тот же скрипт в другом процессе с передачей ключевого параметра, но тогда возникает проблема с возвратом результата, ее можно решить (к примеру) передачей сообщения основному окну через SendMessage(). 2. Запускать функцию в отдельном потоке того же процесса с использованием CallBack. |
|
Отправлено: 09:51, 28-08-2007 | #400 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Открывая 7z архив пишет не удаётся открыть как архив. Можно ли его восстановить? | DreDo | Хочу все знать | 4 | 01-12-2009 18:54 | |
[Архив - Часть 3] AutoIt скрипты .:[общие вопросы]:. | Vadikan | AutoIt | 1543 | 18-01-2009 10:46 | |
[Архив - Часть 1.3] AutoIt скрипты | biork | AutoIt | 503 | 09-06-2007 11:27 | |
[Архив - Часть 1.2] AutoIt скрипты | Dirk Diggler | AutoIt | 505 | 02-12-2006 11:00 | |
[Архив - Часть 1.1] AutoIt скрипты | EgOrus | AutoIt | 335 | 04-02-2006 16:58 |
|