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 变量类型及命名规则介绍
Jun 08 Python
Python使用新浪微博API发送微博的例子
Apr 10 Python
利用Pandas 创建空的DataFrame方法
Apr 08 Python
django基于restframework的CBV封装详解
Aug 08 Python
django-crontab 定时执行任务方法的实现
Sep 06 Python
Python 转换RGB颜色值的示例代码
Oct 13 Python
Pytorch之保存读取模型实例
Dec 30 Python
tensorboard实现同时显示训练曲线和测试曲线
Jan 21 Python
Python3 Tensorlfow:增加或者减小矩阵维度的实现
May 22 Python
python属于跨平台语言码
Jun 09 Python
pandas使用函数批量处理数据(map、apply、applymap)
Nov 27 Python
python利用while求100内的整数和方式
Nov 07 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在文件指定行中写入代码的方法
2012/05/23 PHP
php获取ajax的headers方法与内容实例
2017/12/27 PHP
ThinkPHP5.0框架控制器继承基类和自定义类示例
2018/05/25 PHP
Thinkphp5框架实现图片、音频和视频文件的上传功能详解
2019/08/27 PHP
为Yahoo! UI Extensions Grid增加内置的可编辑器
2007/03/10 Javascript
仿163填写邮件地址自动显示下拉(无优化)
2008/11/05 Javascript
jQuery Study Notes学习笔记 (二)
2010/08/04 Javascript
jQuery 源码分析笔记(4) Ready函数
2011/06/02 Javascript
Three.js源码阅读笔记(基础的核心Core对象)
2012/12/27 Javascript
jQuery.extend()的实现方式详解及实例
2013/06/29 Javascript
时间戳转换为时间 年月日时间的JS函数
2013/08/19 Javascript
jQuery Validate插件实现表单强大的验证功能
2015/12/18 Javascript
javascript中eval解析JSON字符串
2016/02/27 Javascript
基于BootStrap Metronic开发框架经验小结【九】实现Web页面内容的打印预览和保存操作
2016/05/12 Javascript
json对象转为字符串,当做参数传递时加密解密的实现方法
2016/06/29 Javascript
解决一个微信号同时支持多个环境网页授权问题
2019/08/07 Javascript
[02:30]DOTA2放量测试专访海涛:呼吁保护新手玩家
2013/08/26 DOTA
[49:18]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 OG vs TNC
2018/04/01 DOTA
Python Tkinter基础控件用法
2014/09/03 Python
Django框架中的对象列表视图使用示例
2015/07/21 Python
Python面向对象程序设计中类的定义、实例化、封装及私有变量/方法详解
2019/02/28 Python
基于python生成器封装的协程类
2019/03/20 Python
Django外键(ForeignKey)操作以及related_name的作用详解
2019/07/29 Python
python numpy 反转 reverse示例
2019/12/04 Python
Python urlopen()和urlretrieve()用法解析
2020/01/07 Python
python框架flask入门之环境搭建及开启调试
2020/06/07 Python
AmazeUI 等分网格的实现示例
2020/08/25 HTML / CSS
屈臣氏菲律宾官网:Watsons菲律宾
2020/06/30 全球购物
八一慰问活动方案
2014/02/07 职场文书
在校实习生求职信
2014/06/18 职场文书
有关九一八事变的演讲稿
2014/09/14 职场文书
护理专业自荐信范文
2015/03/06 职场文书
律师函格式范本
2015/05/27 职场文书
运动会闭幕式致辞
2015/07/29 职场文书
一文搞懂Golang 时间和日期相关函数
2021/12/06 Golang
vue+echarts实现多条折线图
2022/03/21 Vue.js