- Сообщения
- 8,673
- Репутация
- 2,486
SyDr [?]
Вот скрипт (у меня отрабатывает за 18 секунд проф. режим)...
Minesweeper helper & solver.au3
Если $bAutoSolve = False, скрипт работает как помощник, показывает под курсором нахождение мины.
$sWinMine_Level указывает режим игры - обязательно нужно установить на выбранный режим.
Нет.В первом видео - это просто чтение из памяти процесса значений и клики в нужны местах
Вот скрипт (у меня отрабатывает за 18 секунд проф. режим)...
Minesweeper helper & solver.au3
Код:
#Region Header
; Name...........: Minesweeper helper/solver
; Description....: For each field in the Windows Minesweeper game shows a tooltip with hint about mine (is there a mine or not)
; Author.........: G.Sandler (CreatoR), www.autoit-script.ru
; Modified.......:
; Remarks........: Tested only on WinXP SP3.
; Link...........:
; ===============================================================================================================
#EndRegion Header
#Region Variable & Constants
Global $bAutoSolve = True
Global $hWinMine
Global $hDesktop = WinGetHandle("[CLASS:Progman]")
Global $bCheated = False
Global $bHoverMark = False
Global $iWinMine_FieldSize = 16
Global $iWinMine_FirstFieldTop = 110
Global $nWinMine_FieldColor = 0xC0C0C0
Global $sWinMine_Beginner_Level = "Beginner"
Global $sWinMine_Intermediate_Level = "Intermediate"
Global $sWinMine_Expert_Level = "Expert"
Global $sWinMine_Level = $sWinMine_Expert_Level
Global $iWinMine_Rows = 9
Global $iWinMine_Columns = 9
Global Const $sWinMine_Exe = "winmine.exe"
#EndRegion Variable & Constants
#Region Startup & Options
Switch $sWinMine_Level
Case $sWinMine_Beginner_Level
$iWinMine_Rows = 9
$iWinMine_Columns = 9
Case $sWinMine_Intermediate_Level
$iWinMine_Rows = 16
$iWinMine_Columns = 16
Case $sWinMine_Expert_Level
$iWinMine_Rows = 16
$iWinMine_Columns = 30
EndSwitch
HotKeySet("{ESC}", "_Quit")
Opt("PixelCoordMode", 0)
Opt("MouseCoordMode", 0)
If Not ProcessExists($sWinMine_Exe) Then
Run($sWinMine_Exe)
While Not $hWinMine
$hWinMine = _ProcessGetWindow($sWinMine_Exe, 1, 1)
Sleep(10)
WEnd
;ControlClick("[class:TfrmuvMainForm]", "", "TBitBtn6")
EndIf
$hWinMine = _ProcessGetWindow($sWinMine_Exe, 1, 1)
If @error Then Exit
#EndRegion Startup & Options
#Region Main
_MineSweeper_Cheat()
If $bAutoSolve Then
_MineSweeper_Solve()
Exit
EndIf
While WinExists($hWinMine)
Sleep(10)
If _WinGetHoveredHandle() = $hWinMine Then
$bHoverMark = True
$bFieldIsMine = _MineSweeper_FieldIsMine()
If $bFieldIsMine Then
ToolTip("!!! Mined !!!", Default, Default, "Attention!!!", 2, 4)
Else
ToolTip("NOT Mined!", Default, Default, "OK", 1, 4)
EndIf
ElseIf $bHoverMark And Not $bAutoSolve Then
$bHoverMark = False
ToolTip("")
EndIf
WEnd
#EndRegion Main
#Region Program functions
Func _MineSweeper_Cheat()
SendKeepActive($hWinMine)
Send("xyzzy")
Send("{LShift}")
EndFunc
Func _MineSweeper_Solve()
Local $aWinMinePos = WinGetPos($hWinMine)
Local $aFieldPos
For $iRow = 0 To $iWinMine_Rows - 1
For $iColumn = 0 To $iWinMine_Columns
$aFieldPos = PixelSearch($iColumn * $iWinMine_FieldSize, $iWinMine_FirstFieldTop + ($iRow * $iWinMine_FieldSize), _
$aWinMinePos[2], $aWinMinePos[3], $nWinMine_FieldColor, 0, 2, $hWinMine)
If Not @error Then
;First field
If $iRow + $iColumn = 0 Then
MouseClick("Primary", $aFieldPos[0]+10, $aFieldPos[1], 1, 0)
Sleep(500)
ContinueLoop
EndIf
MouseMove($aFieldPos[0], $aFieldPos[1], 1)
If _MineSweeper_FieldIsMine() Then
;MouseClick("Secondary", $aFieldPos[0], $aFieldPos[1], 1, 1)
Else
MouseClick("Primary", $aFieldPos[0], $aFieldPos[1], 1, 1)
EndIf
If ($iRow + $iColumn) >= ($iWinMine_Rows + $iWinMine_Columns) Then
ExitLoop 2
EndIf
EndIf
Next
Next
EndFunc
Func _MineSweeper_FieldIsMine()
Return (PixelGetColor(0, 0, $hDesktop) <> 0xFFFFFF)
EndFunc
Func _ProcessGetWindow($iPID, $iRet = -1, $iRetVisibleOnly = 0)
Local $aWinList = WinList(), $aRet[2]
If IsString($iPID) Then
$iPID = ProcessExists($iPID)
EndIf
For $i = 1 To UBound($aWinList)-1
If (($iRetVisibleOnly And BitAND(WinGetState($aWinList[$i][1]), 2)) Or Not $iRetVisibleOnly) And WinGetProcess($aWinList[$i][1]) = $iPID Then
$aRet[0] = $aWinList[$i][0] ;Title
$aRet[1] = $aWinList[$i][1] ;WinHandle
If $iRet = 0 Then
Return $aRet[0]
EndIf
If $iRet = 1 Then
Return $aRet[1]
EndIf
Return $aRet
EndIf
Next
Return SetError(1, 0, $aRet)
EndFunc
Func _WinGetHoveredHandle()
Local $iOld_Opt_MCM = Opt("MouseCoordMode", 1)
Local $Ret = DllCall("user32.dll", "int", "WindowFromPoint", "long", MouseGetPos(0), "long", MouseGetPos(1))
Opt("MouseCoordMode", $iOld_Opt_MCM)
Return HWnd($Ret[0])
EndFunc
Func _Quit()
Exit
EndFunc
#EndRegion Program functions
Если $bAutoSolve = False, скрипт работает как помощник, показывает под курсором нахождение мины.
$sWinMine_Level указывает режим игры - обязательно нужно установить на выбранный режим.