#cs
Бот для игры Сапёр.
Версия 6
#ce
HotKeySet("!{F11}", "Terminate") ; Alt + F11
Func Terminate()
ConsoleWrite("остановлено"&@CR&"-----------"&@CR)
Exit 0
EndFunc
HotKeySet("{F11}", "Minesweeper")
Global $poleSizeX, $poleSizeY, $MaxMineNumber
Global $MinesFound ; количество найденных мин
Global $OpenFlag
Global $pole[1][1]
Global $tmpCellColors[11]
Global $CellColors[11] = [0xC0C0C0, 0x0000FF, 0x008000, 0xFF0000, 0x000080, 0x800000, 0x008080, 0x000000, 0xFFFFFF, 0xFFFFFF, 0xFF0000]
; принятые значения полей
; 0 - открытое поле, рядом 0 мин
; 1 - открытое поле, рядом 1 мина
; 2 - открытое поле, рядом 2 мины
; 3 - открытое поле, рядом 3 мины
; 4 - открытое поле, рядом 4 мины
; 5 - открытое поле, рядом 5 мин
; 6 - открытое поле, рядом 6 мин
; 7 - открытое поле, рядом 7 мин
; 8 - мифичесоке открытое поле, рядом 8 мин
; 10 - неоткрытое необозначенное поле
; 11 - мина
#include <file.au3>
If _FileReadToArray("CellColors.dat", $tmpCellColors) Then
For $i=0 To 10
$CellColors[$i] = Number($tmpCellColors[$i+1])
Next
EndIf
While 1
Sleep(10000)
WEnd
Func Minesweeper()
If Not WinExists("Сапер") Then MsgBox(4096, "Error", "Сапер не запущен")
WinActivate("Сапер")
Sleep(1000)
$size = WinGetClientSize("[active]")
Select
Case $size[0]=164 And $size[1]=207 ; Новичок
$poleSizeX = 9
$poleSizeY = 9
$MaxMineNumber = 10
Case $size[0]=276 And $size[1]=319 ; Любитель
$poleSizeX = 16
$poleSizeY = 16
$MaxMineNumber = 40
Case $size[0]=500 And $size[1]=319 ; Профи
$poleSizeX = 30
$poleSizeY = 16
$MaxMineNumber = 99
Case Else
Send("{F10}")
Send("{DOWN 5}")
Send("{ENTER}")
$oText = WinGetText("Специальное поле")
Send("{ESC}")
ConsoleWrite($oText)
$aParam = StringRegExp($oText,".*?(\d+).*?",3)
$poleSizeX = $aParam[0]
$poleSizeY = $aParam[1]
$MaxMineNumber = $aParam[2]
EndSelect
ReDim $pole[$poleSizeX][$poleSizeY]
Opt("PixelCoordMode", 0)
Opt("MouseCoordMode", 0)
If PixelGetColor(22+16*Floor($poleSizeX/2),77) = 0x000000 Or MinesweeperExplosion() Then
MouseMove(19+16*Floor($poleSizeX/2),81,0)
Sleep(100)
MouseClick("Left", 19+16*Floor($poleSizeX/2),81)
EndIf
While 1
If MinesweeperExplosion() Then Return ;если подорвался
MinesweeperScan() ; Шаг 1
MinesweeperCheckCells() ; Шаг 2
$MinesFound = MinesweeperCalculateMines() ; посчитать найденные мины
If $MinesFound = $MaxMineNumber Then ; если все мины найдены
MinesweeperOpenAllClearCells() ; то открываем все оставшиеся клетки
Return
EndIf
MinesweeperOpenCells() ; Шаг 3
If Not $OpenFlag Then ; Шаг 3.5
For $i = 0 To $poleSizeX-1
For $j = 0 To $poleSizeY-1
If MinesweeperAdvansedOpenCell($Pole, $i, $j) Then
$OpenFlag = True
ExitLoop 2
EndIf
Next
Next
EndIf
If Not $OpenFlag Then MinesweeperOpenRandomCell() ; Шаг 4
WEnd
EndFunc
Func MinesweeperScan()
Local $x
For $i = 0 To $poleSizeX-1
For $j = 0 To $poleSizeY-1
If PixelGetColor(15+16*$i,105+16*$j) = 0xFFFFFF Then
If PixelGetColor(22+16*$i,108+16*$j) = $CellColors[10] Then
$pole[$i][$j] = 11
Else
$pole[$i][$j] = 10
EndIf
Else
$color = PixelGetColor(22+16*$i,108+16*$j)
Switch $color
Case $CellColors[0]
$pole[$i][$j] = 0
Case $CellColors[1]
$pole[$i][$j] = 1
Case $CellColors[2]
$pole[$i][$j] = 2
Case $CellColors[3]
$pole[$i][$j] = 3
Case $CellColors[4]
$pole[$i][$j] = 4
Case $CellColors[5]
$pole[$i][$j] = 5
Case $CellColors[6]
$pole[$i][$j] = 6
Case $CellColors[7]
$pole[$i][$j] = 7
Case $CellColors[8]
$pole[$i][$j] = 8
Case Else
MouseMove(23+16*$i,109+16*$j,0)
$x = InputBox("error", "Неизвестное количество мин в поле "&$i&"x"&$j&@CR&"цвет 0x"&Hex($color,6)&@CR&"введите количество мин, которое изображено в этой клетке"&@CR&"0 - открытая пустая клетка"&@CR&"9 - неоткрытое поле")
$CellColors[$x] = $color
$pole[$i][$j] = $x
if $x>8 Then $pole[$i][$j] += 1 ; для констант обозначающих пустое поле и мину
$file = FileOpen("CellColors.dat",2)
For $t=0 To 10
FileWriteLine($file, "0x"&Hex($CellColors[$t],6))
Next
FileClose($file)
EndSwitch
EndIf
Next
Next
EndFunc
Func MinesweeperCheckCells()
Local $m
For $x = 0 To $poleSizeX-1
For $y = 0 To $poleSizeY-1
If $pole[$x][$y] < 10 Then
$m = 0
For $i = -1 To 1
If $x+$i < 0 Then ContinueLoop
If $x+$i > $poleSizeX-1 Then ContinueLoop
For $j = -1 To 1
If $y+$j < 0 Then ContinueLoop
If $y+$j > $poleSizeY-1 Then ContinueLoop
If $pole[$x+$i][$y+$j] >= 10 Then $m += 1
Next
Next
EndIf
If $pole[$x][$y] = $m Then
For $i = -1 To 1
If $x+$i < 0 Then ContinueLoop
If $x+$i > $poleSizeX-1 Then ContinueLoop
For $j = -1 To 1
If $y+$j < 0 Then ContinueLoop
If $y+$j > $poleSizeY-1 Then ContinueLoop
If $pole[$x+$i][$y+$j] = 10 Then
MouseMove(22+16*($x+$i),110+16*($y+$j),0)
Sleep(100)
MouseClick("Right", 22+16*($x+$i),110+16*($y+$j))
$pole[$x+$i][$y+$j] = 11
EndIf
Next
Next
EndIf
Next
Next
EndFunc
Func MinesweeperOpenCells()
Local $m
$OpenFlag = False
For $x = 0 To $poleSizeX-1
For $y = 0 To $poleSizeY-1
If $pole[$x][$y] < 10 Then
$m = 0
For $i = -1 To 1
If $x+$i < 0 Then ContinueLoop
If $x+$i > $poleSizeX-1 Then ContinueLoop
For $j = -1 To 1
If $y+$j < 0 Then ContinueLoop
If $y+$j > $poleSizeY-1 Then ContinueLoop
If $pole[$x+$i][$y+$j] = 11 Then $m += 1
Next
Next
EndIf
If $pole[$x][$y] = $m Then
For $i = -1 To 1
If $x+$i < 0 Then ContinueLoop
If $x+$i > $poleSizeX-1 Then ContinueLoop
For $j = -1 To 1
If $y+$j < 0 Then ContinueLoop
If $y+$j > $poleSizeY-1 Then ContinueLoop
If $pole[$x+$i][$y+$j] = 10 Then
If PixelGetColor(15+16*($x+$i),105+16*($y+$j)) = 0xFFFFFF Then
MouseMove(22+16*($x+$i),110+16*($y+$j),0)
Sleep(100)
MouseClick("Left", 22+16*($x+$i),110+16*($y+$j))
$OpenFlag = True
EndIf
EndIf
Next
Next
EndIf
Next
Next
EndFunc
Func MinesweeperCalculateMines()
Local $m = 0
For $x = 0 To $poleSizeX-1
For $y = 0 To $poleSizeY-1
If $pole[$x][$y] = 11 Then $m += 1
Next
Next
Return $m
EndFunc
Func MinesweeperOpenRandomCell()
While 1
$x = Random(0, $poleSizeX-1, 1)
$y = Random(0, $poleSizeY-1, 1)
If $pole[$x][$y] = 10 Then
ConsoleWrite("рандомный клик "&$x&","&$y&@CR)
MouseMove(22+16*($x),110+16*($y),0)
Sleep(100)
MouseClick("Left", 22+16*$x,110+16*$y)
Return
EndIf
WEnd
EndFunc
Func MinesweeperOpenAllClearCells()
For $x = 0 To $poleSizeX-1
For $y = 0 To $poleSizeY-1
If $pole[$x][$y] = 10 Then
MouseMove(22+16*($x),110+16*($y),0)
Sleep(100)
MouseClick("Left", 22+16*$x,110+16*$y)
EndIf
Next
Next
EndFunc
Func MinesweeperExplosion()
If PixelGetColor(19+16*Floor($poleSizeX/2),81) = 0x000000 Then
Return True
Else
Return False
EndIf
EndFunc
Func MinesweeperAdvansedOpenCell($aPole, $cellX, $cellY)
;ConsoleWrite("вокруг "&$cellX&","&$cellY&@CR)
If $aPole[$cellX][$cellY] = 0 Then Return False
If $aPole[$cellX][$cellY] > 8 Then Return False
Local $sum10 = 0, $sum11 = 0
For $i = -1 To 1
If $cellX+$i < 0 Then ContinueLoop
If $cellX+$i > $poleSizeX-1 Then ContinueLoop
For $j = -1 To 1
If $cellY+$j < 0 Then ContinueLoop
If $cellY+$j > $poleSizeY-1 Then ContinueLoop
If $aPole[$cellX+$i][$cellY+$j] = 11 Then $sum11 += 1
If $aPole[$cellX+$i][$cellY+$j] = 10 Then $sum10 += 1
Next
Next
If $aPole[$cellX][$cellY] <> $sum11+1 Then Return False
If $sum10 = 0 Then Return False
For $i = -1 To 1
If $cellX+$i < 0 Then ContinueLoop
If $cellX+$i > $poleSizeX-1 Then ContinueLoop
For $j = -1 To 1
If $cellY+$j < 0 Then ContinueLoop
If $cellY+$j > $poleSizeY-1 Then ContinueLoop
If $aPole[$cellX+$i][$cellY+$j] = 10 Then $aPole[$cellX+$i][$cellY+$j] = 1 / $sum10
Next
Next
Local $m, $s
For $x = $cellX-2 To $cellX+2
If $x < 0 Then ContinueLoop
If $x > $poleSizeX-1 Then ContinueLoop
For $y = $cellY-2 To $cellY+2
If $y < 0 Then ContinueLoop
If $y > $poleSizeY-1 Then ContinueLoop
If ($aPole[$x][$y] < 10) And ($aPole[$x][$y] >= 1) Then
$m = 0
$s = 0
For $i = -1 To 1
If $x+$i < 0 Then ContinueLoop
If $x+$i > $poleSizeX-1 Then ContinueLoop
For $j = -1 To 1
If $y+$j < 0 Then ContinueLoop
If $y+$j > $poleSizeY-1 Then ContinueLoop
If $aPole[$x+$i][$y+$j] = 11 Then $m += 1
If $aPole[$x+$i][$y+$j] = 10 Then $s += 1
If $aPole[$x+$i][$y+$j] < 1 Then $m += $aPole[$x+$i][$y+$j]
Next
Next
If $aPole[$x][$y] = $m Then
For $i = -1 To 1
If $x+$i < 0 Then ContinueLoop
If $x+$i > $poleSizeX-1 Then ContinueLoop
For $j = -1 To 1
If $y+$j < 0 Then ContinueLoop
If $y+$j > $poleSizeY-1 Then ContinueLoop
If $aPole[$x+$i][$y+$j] = 10 Then
If PixelGetColor(15+16*($x+$i),105+16*($y+$j)) = 0xFFFFFF Then
MouseMove(22+16*($x+$i),110+16*($y+$j),0)
Sleep(100)
MouseClick("Left", 22+16*($x+$i),110+16*($y+$j))
ConsoleWrite("вокруг "&$cellX&","&$cellY&" ["&$aPole[$cellX][$cellY]&"] клетка "&$x&","&$y&" ["&$aPole[$x][$y]&"] открыта"&@CR)
Return True
EndIf
EndIf
Next
Next
EndIf
If $aPole[$x][$y] = ($s+$m) Then
For $i = -1 To 1
If $x+$i < 0 Then ContinueLoop
If $x+$i > $poleSizeX-1 Then ContinueLoop
For $j = -1 To 1
If $y+$j < 0 Then ContinueLoop
If $y+$j > $poleSizeY-1 Then ContinueLoop
If $aPole[$x+$i][$y+$j] = 10 Then
If PixelGetColor(15+16*($x+$i),105+16*($y+$j)) = 0xFFFFFF Then
MouseMove(22+16*($x+$i),110+16*($y+$j),0)
Sleep(100)
MouseClick("Right", 22+16*($x+$i),110+16*($y+$j))
ConsoleWrite("вокруг "&$cellX&","&$cellY&" ["&$aPole[$cellX][$cellY]&"] клетка "&$x&","&$y&" ["&$aPole[$x][$y]&"] отмечена"&@CR)
Return True
EndIf
EndIf
Next
Next
EndIf
EndIf
Next
Next
Return False
EndFunc