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命令行参数解析模块optparse使用实例
Apr 13 Python
python通过pip更新所有已安装的包实现方法
May 19 Python
Python3多线程爬虫实例讲解代码
Jan 05 Python
基于scrapy的redis安装和配置方法
Jun 13 Python
python读取csv和txt数据转换成向量的实例
Feb 12 Python
Python面向对象程序设计类的多态用法详解
Apr 12 Python
python登录WeChat 实现自动回复实例详解
May 28 Python
PyQt5重写QComboBox的鼠标点击事件方法
Jun 25 Python
Python+Opencv身份证号码区域提取及识别实现
Aug 25 Python
一篇文章搞懂python的转义字符及用法
Sep 03 Python
pandas 按日期范围筛选数据的实现
Feb 20 Python
Python爬虫数据的分类及json数据使用小结
Mar 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连接数据库代码应用分析
2011/05/29 PHP
获取用户Ip地址通用方法与常见安全隐患(HTTP_X_FORWARDED_FOR)
2013/06/01 PHP
对PHP新手的一些建议(PHP学习经验总结)
2014/08/20 PHP
javascript编程起步(第五课)
2007/02/27 Javascript
复制小说文本时出现的随机乱码的去除方法
2010/09/07 Javascript
各浏览器中querySelector和querySelectorAll的实现差异分析
2012/05/23 Javascript
JS原型对象通俗"唱法"
2012/12/27 Javascript
验证码在IE中不刷新而谷歌等浏览器正常的解决方案
2014/03/18 Javascript
Jquery设置attr的disabled属性控制某行显示或者隐藏
2014/09/25 Javascript
JavaScript中的Promise使用详解
2015/06/24 Javascript
jQuery树形下拉菜单特效代码分享
2015/08/15 Javascript
理解javascript定时器中的单线程
2016/02/23 Javascript
Jquery Easyui分割按钮组件SplitButton使用详解(17)
2016/12/18 Javascript
深入学习jQuery中的data()
2016/12/22 Javascript
jQuery简易时光轴实现方法示例
2017/03/13 Javascript
详解基于angular-cli配置代理解决跨域请求问题
2017/07/05 Javascript
解决vue的 v-for 循环中图片加载路径问题
2018/09/03 Javascript
Node.js中的不安全跳转如何防御详解
2018/10/21 Javascript
Vuerouter的beforeEach与afterEach钩子函数的区别
2018/12/26 Javascript
vue-next/runtime-core 源码阅读指南详解
2019/10/25 Javascript
vue 监听 Treeselect 选择项的改变操作
2020/08/31 Javascript
[04:28]DOTA2亚洲邀请赛小组赛第五日 TOP10精彩集锦
2015/02/03 DOTA
理解Python中的With语句
2015/02/02 Python
python使用BeautifulSoup分析网页信息的方法
2015/04/04 Python
一文带你了解Python中的字符串是什么
2018/11/20 Python
IntelliJ IDEA安装运行python插件方法
2018/12/10 Python
Django中信号signals的简单使用方法
2019/07/04 Python
python Gunicorn服务器使用方法详解
2019/07/22 Python
Python 字节流,字符串,十六进制相互转换实例(binascii,bytes)
2020/05/11 Python
RentCars.com巴西:汽车租赁网站
2016/08/22 全球购物
以设计师精品品质提供快速时尚:Mostata
2019/05/10 全球购物
高中毕业典礼演讲稿
2014/09/09 职场文书
2014年协会工作总结
2014/11/22 职场文书
小爸爸观后感
2015/06/15 职场文书
nginx反向代理时如何保持长连接
2021/03/31 Servers
Redis实战之Lettuce的使用技巧详解
2022/12/24 Redis