Python自动扫雷实现方法
本文实例讲述了Python自动扫雷实现方法。分享给大家供大家参考。具体如下:
#pyWinmineCrack.py
#coding:utf-8
importwin32gui
importwin32process
importwin32con
importwin32api
fromctypesimport*
#雷区最大行列数
MAX_ROWS=24
MAX_COLUMNS=30
#雷区格子在窗体上的起始坐标及每个格子的宽度
MINE_BEGIN_X=0xC
MINE_BEGIN_Y=0x37
MINE_GRID_WIDTH=0x10
MINE_GRID_HEIGHT=0x10
#边框、无雷、有雷的内部表示
MINE_BOARDER=0x10
MINE_SAFE=0x0F
MINE_DANGER=0x8F
#“雷区”在扫雷程序中的存储地址
BOARD_ADDR=0x1005340
classSMineCtrl(Structure):
_fields_=[("hWnd",c_uint),
("board",(c_byte*(MAX_COLUMNS+2))*(MAX_ROWS+2)),
("rows",c_byte),
("columns",c_byte)
]
kernel32=windll.LoadLibrary("kernel32.dll")
ReadProcessMemory=kernel32.ReadProcessMemory
WriteProcessMemory=kernel32.WriteProcessMemory
OpenProcess=kernel32.OpenProcess
ctrlData=SMineCtrl()
#找到扫雷程序并打开对应进程
try:
ctrlData.hWnd=win32gui.FindWindow("扫雷","扫雷")
except:
win32api.MessageBox(0,"请先运行扫雷程序","错误!",win32con.MB_ICONERROR)
exit(0)
hreadID,processID=win32process.GetWindowThreadProcessId(ctrlData.hWnd)
hProc=OpenProcess(win32con.PROCESS_ALL_ACCESS,0,processID)
#读取雷区数据
bytesRead=c_ulong(0)
ReadProcessMemory(hProc,BOARD_ADDR,byref(ctrlData.board),SMineCtrl.board.size,byref(bytesRead))
if(bytesRead.value!=SMineCtrl.board.size):
str="ReadProcessMemoryerror,onlyread",bytesRead.value,"shouldread",SMineCtrl.board.size
win32api.MessageBox(0,str,"错误!",win32con.MB_ICONERROR)
exit()
#获取本次程序雷区的实际大小
ctrlData.rows=0
ctrlData.columns=0
foriinrange(0,MAX_COLUMNS+2):
ifMINE_BOARDER==ctrlData.board[0]:
ctrlData.columns+=1
else:
break
ctrlData.columns-=2
foriinrange(1,MAX_ROWS+1):
ifMINE_BOARDER!=ctrlData.board[1]:
ctrlData.rows+=1
else:
break
#模拟鼠标点击动作
foriinrange(0,ctrlData.rows):
forjinrange(0,ctrlData.columns):
ifMINE_SAFE==ctrlData.board[i+1][j+1]:
win32api.SendMessage(ctrlData.hWnd,
win32con.WM_LBUTTONDOWN,
win32con.MK_LBUTTON,
win32api.MAKELONG(MINE_BEGIN_X+MINE_GRID_WIDTH*j+MINE_GRID_WIDTH/2,
MINE_BEGIN_Y+MINE_GRID_HEIGHT*i+MINE_GRID_HEIGHT/2))
win32api.SendMessage(ctrlData.hWnd,
win32con.WM_LBUTTONUP,
win32con.MK_LBUTTON,
win32api.MAKELONG(MINE_BEGIN_X+MINE_GRID_WIDTH*j+MINE_GRID_WIDTH/2,
MINE_BEGIN_Y+MINE_GRID_HEIGHT*i+MINE_GRID_HEIGHT/2))
#搞定!
win32api.MessageBox(0,"搞定!","信息",win32con.MB_ICONINFORMATION)
希望本文所述对大家的Python程序设计有所帮助。