利用Python实现自动扫雷小脚本!神奇的Python!

“跟童老师学编程”专栏目录 最开始写这个专栏,来自于2017年的一篇回答:对于一个大一计科新生,有什么代码行数在 500~1000 的程序(C 语言)可以试着写来练手?2017年写了一本C语言游戏开发的实践教材:童晶:做游戏,学编程(C语言)教材《C语言课程设计与游戏开发实践教程》出版了《C语言课程设计与游戏开发实践教程》的相关教程:童晶:做游戏,学编程(C语言) 1 实现弹跳小球童晶:做游戏,学编程(C语言) 2 最简单的... 阅读详情

自动扫雷一般分为两种,一种是读取内存数据,而另一种是通过分析图片获得数据,并通过模拟鼠标操作,这里我用的是第二种方式。

一、准备工作

1.扫雷游戏

我是win10,没有默认的扫雷,所以去扫雷网下载

http://www.saolei.net/BBS/

 

 

2.python 3

我的版本是 python 3.6.1

3.python的第三方库

win32api,win32gui,win32con,Pillow,numpy,opencv

可通过 pip install --upgrade SomePackage 来进行安装

注意:有的版本是下载pywin32,但是有的要把pywin32升级到最高并自动下载了pypiwin32,具体情况每个python版本可能都略有不同

我给出我的第三方库和版本仅供参考

 

 

二、关键代码组成

1.找到游戏窗口与坐标

#扫雷游戏窗口  
class_name = "TMain"  
title_name = "Minesweeper Arbiter "  
hwnd = win32gui.FindWindow(class_name, title_name)  
#窗口坐标  
left = 0  
top = 0  
right = 0  
bottom = 0  
if hwnd:  
    print("找到窗口")  
    left, top, right, bottom = win32gui.GetWindowRect(hwnd)  
    #win32gui.SetForegroundWindow(hwnd)  
    print("窗口坐标:")  
    print(str(left)+' '+str(right)+' '+str(top)+' '+str(bottom))  
else:  
    print("未找到窗口") 

2.锁定并抓取雷区图像

#锁定雷区坐标  
#去除周围功能按钮以及多余的界面  
#具体的像素值是通过QQ的截图来判断的  
left += 15  
top += 101  
right -= 15  
bottom -= 42  
#抓取雷区图像  
rect = (left, top, right, bottom)  
img = ImageGrab.grab().crop(rect) 

3.各图像的RGBA值

#数字1-8 周围雷数  
#0 未被打开  
#ed 被打开 空白  
#hongqi 红旗  
#boom 普通雷  
#boom_red 踩中的雷  
rgba_ed = [(225, (192, 192, 192)), (31, (128, 128, 128))]  
rgba_hongqi = [(54, (255, 255, 255)), (17, (255, 0, 0)), (109, (192, 192, 192)), (54, (128, 128, 128)), (22, (0, 0, 0))]  
rgba_0 = [(54, (255, 255, 255)), (148, (192, 192, 192)), (54, (128, 128, 128))]  
rgba_1 = [(185, (192, 192, 192)), (31, (128, 128, 128)), (40, (0, 0, 255))]  
rgba_2 = [(160, (192, 192, 192)), (31, (128, 128, 128)), (65, (0, 128, 0))]  
rgba_3 = [(62, (255, 0, 0)), (163, (192, 192, 192)), (31, (128, 128, 128))]  
rgba_4 = [(169, (192, 192, 192)), (31, (128, 128, 128)), (56, (0, 0, 128))]  
rgba_5 = [(70, (128, 0, 0)), (155, (192, 192, 192)), (31, (128, 128, 128))]  
rgba_6 = [(153, (192, 192, 192)), (31, (128, 128, 128)), (72, (0, 128, 128))]  
rgba_8 = [(149, (192, 192, 192)), (107, (128, 128, 128))]  
rgba_boom = [(4, (255, 255, 255)), (144, (192, 192, 192)), (31, (128, 128, 128)), (77, (0, 0, 0))]  
rgba_boom_red = [(4, (255, 255, 255)), (144, (255, 0, 0)), (31, (128, 128, 128)), (77, (0, 0, 0))] 

4.扫描雷区图像保存至一个二维数组map

#扫描雷区图像  
def showmap():  
    img = ImageGrab.grab().crop(rect)  
    for y in range(blocks_y):  
        for x in range(blocks_x):  
            this_image = img.crop((x * block_width, y * block_height, (x + 1) * block_width, (y + 1) * block_height))  
            if this_image.getcolors() == rgba_0:  
                map[y][x] = 0  
            elif this_image.getcolors() == rgba_1:  
                map[y][x] = 1  
            elif this_image.getcolors() == rgba_2:  
                map[y][x] = 2  
            elif this_image.getcolors() == rgba_3:  
                map[y][x] = 3  
            elif this_image.getcolors() == rgba_4:  
                map[y][x] = 4  
            elif this_image.getcolors() == rgba_5:  
                map[y][x] = 5  
            elif this_image.getcolors() == rgba_6:  
                map[y][x] = 6  
            elif this_image.getcolors() == rgba_8:  
                map[y][x] = 8  
            elif this_image.getcolors() == rgba_ed:  
                map[y][x] = -1  
            elif this_image.getcolors() == rgba_hongqi:  
                map[y][x] = -4  
            elif this_image.getcolors() == rgba_boom or this_image.getcolors() == rgba_boom_red:  
                global gameover  
                gameover = 1  
                break  
                #sys.exit(0)  
            else:  
                print("无法识别图像")  
                print("坐标")  
                print((y,x))  
                print("颜色")  
                print(this_image.getcolors()) 
                sys.exit(0)  
    #print(map) 

5.扫雷算法

这里我采用的最基础的算法

1.首先点出一个点

2.扫描所有数字,如果周围空白+插旗==数字,则空白均有雷,右键点击空白插旗

3.扫描所有数字,如果周围插旗==数字,则空白均没有雷,左键点击空白

4.循环2、3,如果没有符合条件的,则随机点击一个白块

后记

近期有很多朋友通过私信咨询有关Python学习问题。为便于交流,点击蓝色自己加入讨论解答资源基地

源码

#插旗  
def banner():  
    showmap()  
    for y in range(blocks_y):  
        for x in range(blocks_x):  
            if 1 <= map[y][x] and map[y][x] <= 5:  
                boom_number = map[y][x]  
                block_white = 0  
                block_qi = 0  
                for yy in range(y-1,y+2):  
                    for xx in range(x-1,x+2):  
                        if 0 <= yy and 0 <= xx and yy < blocks_y and xx < blocks_x:  
                            if not (yy == y and xx == x):if map[yy][xx] == 0:  
                                    block_white += 1  
                                elif map[yy][xx] == -4:  
                                    block_qi += 1if boom_number == block_white + block_qi:for yy in range(y - 1, y + 2):  
                        for xx in range(x - 1, x + 2):  
                            if 0 <= yy and 0 <= xx and yy < blocks_y and xx < blocks_x:  
                                if not (yy == y and xx == x):  
                                    if map[yy][xx] == 0:  
                                        win32api.SetCursorPos([left+xx*block_width, top+yy*block_height])  
                                        win32api.mouse_event(win32con.MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0)  
                                        win32api.mouse_event(win32con.MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0) 
                                         showmap()   
#点击白块  
def dig():  
    showmap()  
    iscluck = 0  
    for y in range(blocks_y):  
        for x in range(blocks_x):  
            if 1 <= map[y][x] and map[y][x] <= 5:  
                boom_number = map[y][x]  
                block_white = 0  
                block_qi = 0  
                for yy in range(y - 1, y + 2): 
                    for xx in range(x - 1, x + 2):  
                        if 0 <= yy and 0 <= xx and yy < blocks_y and xx < blocks_x:  
                            if not (yy == y and xx == x):  
                                if map[yy][xx] == 0:  
                                    block_white += 1  
                                elif map[yy][xx] == -4:  
                                    block_qi += 1if boom_number == block_qi and block_white > 0:for yy in range(y - 1, y + 2):  
                        for xx in range(x - 1, x + 2):  
                            if 0 <= yy and 0 <= xx and yy < blocks_y and xx < blocks_x:  
                                if not(yy == y and xx == x):  
                                    if map[yy][xx] == 0:  
                                        win32api.SetCursorPos([left + xx * block_width, top + yy * block_height])  
                                        win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)  
                                        win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)  
                                        iscluck = 1  
    if iscluck == 0:  
        luck()  
#随机点击  
def luck():  
    fl = 1  
    while(fl):  
        randomrandom_x = random.randint(0, blocks_x - 1)  
        randomrandom_y = random.randint(0, blocks_y - 1)  
        if(map[random_y][random_x] == 0):  
            win32api.SetCursorPos([left + random_x * block_width, top + random_y * block_height])  
            win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)  
            win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)  
            fl = 0  
def gogo():  
    win32api.SetCursorPos([left, top])  
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)  
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)  
    showmap()  
    global gameover  
    while(1):  
        if(gameover == 0):  
            banner()  
            banner()  
            dig()  
        else:  
            gameover = 0  
            win32api.keybd_event(113, 0, 0, 0)  
            win32api.SetCursorPos([left, top])  
            win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)  
            win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)  
            showmap()  


 

 

算法竞赛备考冲刺必刷题(Python) | 汇总 学习Python从娃娃抓起!记录下蓝桥杯备考比赛学习过程中的题目,记录每一个瞬间。 阅读详情

相关推荐

自动扫雷 winmine C++

自动扫雷程序,C++代码编写,附带说明文档。功能包括显示游戏布局,让计时器时间停止,自动玩硬扫雷。具体方法是修改内存。

自动扫雷脚本.zip

自动扫雷脚本,对新手很有帮助。

用python编写扫雷游戏

python是一种很强大的编程语言,可以实现很多操作。今天,小编为大家带来了一个由python编写的扫雷游戏。希望以上内容可以对大家有帮助!注:转载请注明出处。

m0_53697837的博客 915

ERDAS 2022与ArcGIS共存安装教程:如何避免端口冲突(详细配置步骤)

本文提供了一份详细的ERDAS 2022与ArcGIS共存安装教程,核心在于解决两者因FlexNet许可证服务器导致的端口冲突问题。通过分步指导,包括检查现有端口占用、修改ERDAS许可证文件端口号、配置防火墙及客户端设置,确保两款专业GIS与遥感软件能在同一系统上稳定运行。

weixin_29279047的博客 253

国产操作系统应用迁移与适配

了解国产操作系统的背景及意义

2301_77609559的博客 2677

基于雷电模拟器的python脚本(乱斗西游2自动收礼包)

乱斗不过是个过气的网易弃游罢了。额,虽然但是,作为在安卓2战区享有一定知名度的业余币商,每天无脑上100来个号,重复充值领取等几个固定操作也是着实让我有点厌恶。因此,我乘着寒假这几天用尽毕生所学写了个自动收币的python程序,实现了从自动收币到自动记录在Excel上的一系列小功能。这一举动也成功将我带上了..

m0_53737869的博客 7779

修改串口服务器,串口虚拟化 | 串口服务器Nport 5630 设置

原标题:串口虚拟化 | 串口服务器Nport 5630 设置JZGKCHINA项目改造,客户需要对IFix4.5进行升级,并优化通讯,在不改变原来配置的基础上逐步进行替换。需要将IFix升级到IFix5.9,数据库升级为SQL Server 2016,客户现场使用的智能仪表都是支持Modbus RTU协议的,因原来的手拉手的通讯方式的,当一台仪表掉线后,会影响到其他仪表的通讯,所以此次在不改变原有...

weixin_31688465的博客 2408

使用PIL截取屏幕时的DPI问题

当我们使用python进行屏幕截取时,我们通常会使用如下代码: from PIL import ImageGrab img = ImageGrab.grab() img.save('xxx.png') img.close() 但是,当我们再次加载时,就会发现,截取的屏幕和实际的屏幕不一致。具体表现为:重新读取后的图像,有点放大或者缩小的样子。原因在于,我们电脑的屏幕设置问题。 拿我自己的笔记本电脑为例,在桌面右键,点开显示设置,可以看到在缩放与布局这一栏,系统推荐的是125%。 而这,就是导致了我么使

ZeroSwift的博客 1331

WPS接入DeepSeek,实现AI辅助功能

总的来说,借助 WPS 中宏功能与 DeepSeek 大模型的结合,文档处理、内容创作和数据分析等任务都能更加智能化、自动化。这不仅大幅提升了工作效率,也为办公场景带来了全新的智能化办公体验。

运维老生常谈 3804

setup time和hold time的计算

内容仅仅为了方便记忆,与原理无关

sddhyl的博客 7814

python写扫雷脚本_利用Python实现自动扫雷小脚本!神奇的Python!

原标题:利用Python实现自动扫雷小脚本!神奇的Python!自动扫雷一般分为两种,一种是读取内存数据,而另一种是通过分析图片获得数据,并通过模拟鼠标操作,这里我用的是第二种方式。一、准备工作1.扫雷游戏我是win10,没有默认的扫雷,所以去扫雷网下载http://www.saolei.net/BBS/ 2.python 3我的版本是 python 3.6.13.python的第三方库win32...

weixin_39624389的博客 286

PyRoki 入门教程(二)安装与使用

PyRoki是一个用于机器人运动学优化的Python库,具有模块化设计、可扩展性和跨平台支持等特点。它支持逆运动学、轨迹优化和动作重定位等任务,采用Levenberg-Marquardt优化器提高效率。主要功能包括:基于URDF的可微分正向运动学模型、自动生成碰撞基元、通用成本因子和自定义成本函数等。PyRoki支持CPU、GPU和TPU运行,适用于从单机器人到大规模并行处理场景。目前存在一些限制,如仅支持软约束、静态形状和特定关节类型等。官方提供了多个应用示例,包括基础逆运动学、碰撞检测、轨迹优化和手部/

机器人控制与仿真应用 1251

作死了一次Ubuntu卸载Python了...

事件起因 本来好好的电脑,就是感觉平时也不咋用Python,然后就吧Python卸载了,然后神奇的一幕发生了,软件图标一个个减少,人都懵逼了,什么鬼 再然后电脑就开不开机了,开机就黑屏 解决方法 Ctrl + Alt + F2 切换tty2 然后执行下面代码 sudo apt-get install ubuntu-desktop 然后桌面就回来了,东西还在,虚惊一场 不过,莫名其妙的又吧什么扫雷、纸牌安装回来了。。。 ...

Timeless小帅的博客 1160

YOLOv8中的可变形卷积改进 | 从DCNv1到DCNv3的多位置替换可变形卷积保姆级实操

可变形卷积(Deformable Convolution)最早由Dai等人在2017年提出,其核心思想是在标准卷积操作的基础上,引入可学习的偏移量(offsets),使卷积核能够自适应调整其采样位置,从而增强模型对目标变形的感知能力。return x本文通过深入探讨可变形卷积在YOLOv8中的应用,详细介绍了DCNv1、DCNv2和DCNv3的原理和实现,并通过实验验证了其在目标检测任务中的有效性。未来,我们将继续探索更多优化策略和技术,提升YOLOv8模型的性能,以应对更复杂的目标检测任务。

一键难忘的博客 4049

车企自动泊车技术全解|纯视觉/多传感器融合双路线、端到端大模型革新 助力机械车位/无划线车位/极窄车位精准泊车落地

随着智能驾驶技术全面下沉,自动泊车已从高端车型专属配置,普及至十万级家用车型,成为车载核心刚需功能。但市面主流车企的泊车能力差距极大,核心差异源于传感器硬件架构、算法迭代逻辑、场景训练体系的全方位分化。传统规则式泊车算法仅适配标准划线车位,面对地库暗光、标线磨损、机械双层车位、极窄靠墙车位、无划线空地泊车等真实长尾场景极易失效。

getusushu的博客 105

全部python编程语言-可以用 Python 编程语言做哪些神奇好玩的事情?

贪吃蛇、迷宫、吃豆人、扫雷、Flappy Bird...这些游戏可以是非常经典,甚至伴随着很多人的童年回忆。那么,你是否想过自己开发一款专属游戏?是否思考过开发这样一款游戏需要多少工作量?游戏开发在互联网行业算是一个门槛较高的方向,因此,对于非专业的游戏开发者来说,开发一款游戏一直是一件让人望而却步的事情,遥不可及。那么,今天要介绍的这款Python项目就可以轻松实现你成为游戏开发者的想法,实现前...

weixin_37988176的博客 203

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

python语言可以编程游戏么_可以用 Python 编程语言做哪些神奇好玩的事情?

贪吃蛇、迷宫、吃豆人、扫雷、Flappy Bird...这些游戏可以是非常经典,甚至伴随着很多人的童年回忆。那么,你是否想过自己开发一款专属游戏?是否思考过开发这样一款游戏需要多少工作量?游戏开发在互联网行业算是一个门槛较高的方向,因此,对于非专业的游戏开发者来说,开发一款游戏一直是一件让人望而却步的事情,遥不可及。那么,今天要介绍的这款Python项目就可以轻松实现你成为游戏开发者的想法,实现前...

weixin_39611275的博客 177

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

神了,Python竟然可以这样学!

今天推荐一个宝藏老男孩和他的公众号:麦叔编程。麦叔毕业于浙大,前阿里技术专家,现外企VP,热爱编程和分享知识。写过两本Python书籍,B站发过超多干货视频。公众号主要涵盖:Python,Java,爬虫,机器学习和深度学习,架构,程序员职场。关注公众号:麦叔编程后台回复【大礼包】麦叔亲自邀请你加入Python或Java群,并赠送麦叔原创【硬核Python】电子书;数百节Python教学视频;Pyt...

weixin_43373042的博客 339

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

利用十大最佳游戏开发工具开发游戏

游戏无疑是最神奇的和有趣的休闲活动。每个人都喜欢玩游戏,所有年龄组的人喜欢玩游戏但游戏的类型可能会有所不同。有些人可能喜欢玩动作游戏,有些人喜欢玩关卡类游戏。而我只喜欢玩扫雷。 人们非常喜欢游戏,有时候会想自己能否也做一个游戏出来,但这个过程非常的复杂。不过现在的技术已经如此先进,利用这些技术可以容易的使你的梦想变为现实。今天我们为你介绍 10 个最棒的游戏开发工具。 1) Game

黄沙百战穿金甲,不破楼兰终不还。 1954

游戏编程中的人工智能 三 (Python改编)

本文改编自Mat Buckland的游戏开发中的人工智能技术中的Chapter 7 扫雷机的实现,C++代码重新用python来实现(本文所有遗传算法/神经网络相关代码均改编值Mat的C++代码,如有雷同,纯属巧合)。在本章节中Mat Buckland实现了一个利用神经网络和遗传算法进化的扫雷机,扫雷机从初始的几乎只会原地打转,最终可以进化到自行寻找地图上的地雷。废话不多说,先看示意图,进化开始的时

crazyskady的博客 2337

Python游戏编程_植物大战讲僵尸_贪吃蛇

曾经我也沉迷游戏,连续玩十几个小时竞技游戏可以不吃饭。游戏只是别人写好程序,与其沉迷于他人设计好程序,为何不自己设计游戏,至少学会编程后,我们的月收入上万不是问题。于是便有了录制这部[pygame菜鸟游戏编程教程]动力。不要沉迷于游戏,我们人生还有许多事情要做,旅游,找到另一个伴侣,成立一个家庭,照顾父母。。。。 编程正在逐步改变世界,程序员不是搬砖的。但传统计算教育程面临枯燥乏味课程,让学生感到乏味。 兴趣是学习最好老师!此课程目的是激发大家对编程兴趣,给广大Python入门初学者带来无穷乐趣。 游戏涉.

toby001111的博客 1万+

Java和python哪个 更适合初学者

我个人不是很喜欢讨论这个问题,为什么呢,每个人都学习能力不一样,你要是不行,哪个对于你也不简单。 客观分析,这两种语言都在程序员的工具箱中都占有一席之地。学习哪个并不重要,个人觉得对于入门级同学来说,你要学的是“编程思想的基础知识“,而不是”特定的编程语言“。 那这两门语言有区别吗?当然有,对于有一定编程经验的人来说,哪个更顺滑当然能感觉都到。 非要比比呢,那就比比。 同样都功能,用Java和Python编写 这么看你觉得哪个简单?如果是你纯小白,我相信你看这两个哪个也不简单。 进一步分析 你玩儿的最6的语

weixin_49216824的博客 326
上一篇: Python分析5000+抖音大V,发现大家都喜欢这类视频!
下一篇: 用Python写个开心消消乐小游戏!自己写的游戏就是好玩!
pythonlaodi
博客等级 码龄6年 286粉丝 244原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值