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异常处理总结
Aug 15 Python
python获得linux下所有挂载点(mount points)的方法
Apr 29 Python
python交互式图形编程实例(一)
Nov 17 Python
解决PyCharm控制台输出乱码的问题
Jan 16 Python
pytorch使用Variable实现线性回归
May 21 Python
详解python解压压缩包的五种方法
Jul 05 Python
python根据文本生成词云图代码实例
Nov 15 Python
Python实现基于socket的udp传输与接收功能详解
Nov 15 Python
python 日志 logging模块详细解析
Mar 31 Python
python中adb有什么功能
Jun 07 Python
解决Pytorch dataloader时报错每个tensor维度不一样的问题
May 28 Python
5个pandas调用函数的方法让数据处理更加灵活自如
Apr 24 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 memcache扩展的三种安装方法
2009/04/26 PHP
thinkphp3.2点击刷新生成验证码
2016/02/16 PHP
PHP处理CSV表格文件的常用操作方法总结
2016/07/01 PHP
PHP设计模式之模板方法模式实例浅析
2018/12/20 PHP
php数组遍历类与用法示例
2019/05/24 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
JavaScript 字符串连接性能优化
2008/12/20 Javascript
Jquery Validation插件防止重复提交表单的解决方法
2010/03/05 Javascript
各浏览器中querySelector和querySelectorAll的实现差异分析
2012/05/23 Javascript
JSON传递bool类型数据的处理方式介绍
2013/09/18 Javascript
setTimeout()与setInterval()方法区别介绍
2013/12/24 Javascript
后端接收不到AngularJs中$http.post发送的数据原因分析及解决办法
2016/07/05 Javascript
JavaScript实战之带收放动画效果的导航菜单
2016/08/16 Javascript
jQuery插件ajaxFileUpload使用详解
2017/01/10 Javascript
关于Vue Webpack2单元测试示例详解
2017/08/14 Javascript
jQuery实现checkbox的简单操作
2017/11/18 jQuery
js 图片转base64的方式(两种)
2018/04/24 Javascript
Puppeteer 爬取动态生成的网页实战
2018/11/14 Javascript
Cocos2d实现刮刮卡效果
2018/12/20 Javascript
vue实现页面滚动到底部刷新
2019/08/16 Javascript
ES6的异步操作之promise用法和async函数的具体使用
2019/12/06 Javascript
Vue-router 报错NavigationDuplicated的解决方法
2020/03/31 Javascript
JS字符串补全方法padStart()和padEnd()
2020/05/27 Javascript
[51:29]Alliance vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
跟老齐学Python之不要红头文件(2)
2014/09/28 Python
python用10行代码实现对黄色图片的检测功能
2015/08/10 Python
python密码错误三次锁定(实例讲解)
2017/11/14 Python
Python将多份excel表格整理成一份表格
2018/01/03 Python
Python批量查询关键词微信指数实例方法
2019/06/27 Python
python3 实现调用串口功能
2019/12/26 Python
员工自我鉴定
2013/10/09 职场文书
自动化专业毕业生自荐信
2013/11/01 职场文书
保密协议书范本
2014/04/22 职场文书
办公室主任竞聘演讲稿
2014/05/15 职场文书
井冈山红色之旅感想
2014/10/07 职场文书
2014教师专业技术工作总结
2014/12/03 职场文书