Python自动扫雷实现方法


Posted in Python onJuly 25, 2015

本文实例讲述了Python自动扫雷实现方法。分享给大家供大家参考。具体如下:

#pyWinmineCrack.py
# coding: utf-8
import win32gui
import win32process
import win32con
import win32api
from ctypes import *
#雷区最大行列数
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
class SMineCtrl(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 = "ReadProcessMemory error, only read ", bytesRead.value, " should read ", SMineCtrl.board.size
 win32api.MessageBox(0, str, "错误!", win32con.MB_ICONERROR)
 exit()
#获取本次程序雷区的实际大小
ctrlData.rows = 0
ctrlData.columns = 0
for i in range(0, MAX_COLUMNS + 2):
 if MINE_BOARDER == ctrlData.board[0]:
 ctrlData.columns += 1
 else :
 break
ctrlData.columns -= 2 
for i in range(1, MAX_ROWS + 1):
 if MINE_BOARDER != ctrlData.board[1]:
 ctrlData.rows += 1
 else:
 break
#模拟鼠标点击动作
for i in range(0, ctrlData.rows):
 for j in range(0, ctrlData.columns):
 if MINE_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程序设计有所帮助。

Python 相关文章推荐
python使用BeautifulSoup分页网页中超链接的方法
Apr 04 Python
详细解析Python中__init__()方法的高级应用
May 11 Python
Python 3.x 新特性及10大变化
Jun 12 Python
python3中set(集合)的语法总结分享
Mar 24 Python
python3监控CentOS磁盘空间脚本
Jun 21 Python
python傅里叶变换FFT绘制频谱图
Jul 19 Python
Python实现直播推流效果
Nov 26 Python
Windows上安装tensorflow  详细教程(图文详解)
Feb 04 Python
pytorch对梯度进行可视化进行梯度检查教程
Feb 04 Python
python 线性回归分析模型检验标准--拟合优度详解
Feb 24 Python
python 基于卡方值分箱算法的实现示例
Jul 17 Python
Python加速程序运行的方法
Jul 29 Python
Python导出DBF文件到Excel的方法
Jul 25 #Python
Python实现的RSS阅读器实例
Jul 25 #Python
Python获取央视节目单的实现代码
Jul 25 #Python
Python实现将DOC文档转换为PDF的方法
Jul 25 #Python
将Django框架和遗留的Web应用集成的方法
Jul 24 #Python
将Python的Django框架与认证系统整合的方法
Jul 24 #Python
Django与遗留的数据库整合的方法指南
Jul 24 #Python
You might like
PHP安全编程之加密功能
2006/10/09 PHP
php中$_REQUEST、$_POST、$_GET的区别和联系小结
2011/11/23 PHP
php不使用插件导出excel的简单方法
2014/03/04 PHP
Windows下的PHP安装文件线程安全和非线程安全的区别
2014/04/23 PHP
分享php代码将360浏览器导出的favdb的sqlite数据库文件转换为html
2015/12/09 PHP
PHP实现搜索地理位置及计算两点地理位置间距离的实例
2016/01/08 PHP
php 运算符与表达式详细介绍
2016/11/30 PHP
ExtJS GTGrid 简单用户管理
2009/07/01 Javascript
javascript 获取select下拉列表值的代码
2009/09/07 Javascript
javascript new fun的执行过程
2010/08/05 Javascript
js 获取浏览器版本以此来调整CSS的样式
2014/06/03 Javascript
js实现Form栏显示全格式时间时钟效果代码
2015/08/19 Javascript
jQuery实现鼠标选文字发新浪微博的方法
2016/04/02 Javascript
Bootstrap滚动监听(Scrollspy)插件详解
2016/04/26 Javascript
JavaScript实现复制或剪切内容到剪贴板功能的方法
2016/05/23 Javascript
微信小程序 PHP后端form表单提交实例详解
2017/01/12 Javascript
Angular2 组件通信的实例代码
2017/06/23 Javascript
js 开发之autocomplete="off"在chrom中失效的解决办法
2017/09/28 Javascript
JS小球抛物线轨迹运动的两种实现方法详解
2017/12/20 Javascript
使用ajax的post同步执行(实现方法)
2017/12/21 Javascript
vue使用element-ui的el-input监听不了回车事件的解决方法
2018/01/12 Javascript
MVVM框架下实现分页功能示例
2018/06/14 Javascript
Vue与Node.js通过socket.io通信的示例代码
2018/07/25 Javascript
react native基于FlatList下拉刷新上拉加载实现代码示例
2018/09/30 Javascript
微信小程序 setData 对 data数据影响问题
2019/04/18 Javascript
vue 插件的方法代码详解
2019/06/06 Javascript
[09:37]2018DOTA2国际邀请赛寻真——不懈追梦的Team Serenity
2018/08/13 DOTA
python urllib爬取百度云连接的实例代码
2017/06/19 Python
Python之csv文件从MySQL数据库导入导出的方法
2018/06/21 Python
详解Python 最短匹配模式
2020/07/29 Python
Foot Locker德国官方网站:美国运动服和鞋类零售商
2018/11/01 全球购物
保加利亚运动鞋购物网站:SneakerStudio.bg
2020/12/23 全球购物
大学应届毕业生个人求职信
2013/09/23 职场文书
写好自荐信的要点
2013/11/06 职场文书
2014年行政部工作总结
2014/11/19 职场文书
有关花店创业的计划书模板
2019/08/27 职场文书