破世界纪录了0.74秒!用Python实现自动扫雷!

教你用Python实现自动扫雷,你就是最亮的仔~ 扫雷,相信80、90后的小伙伴肯定不陌生,在电脑还没有彻底普及的年代,能够玩上扫雷和纸牌就已经非常不容易了,今天小千就来给大家分享一期使用Python代码实现自动扫雷的教程,代码都在文章中,同学们可以学习和参考一下。 自动扫雷一般分为两种,一种是读取内存数据,而另一种是通过分析图片获得数据,并通过模拟鼠标操作,这里我用的是第二种方式。 一、准备工作 我的版本是 python 3.6.1 python的第三方库: win32api win32gui win32con Pillow n 阅读详情

来源丨https://zhuanlan.zhihu.com/p/35755039

大家好,我是菜鸟哥~

用Python+OpenCV实现了自动扫雷,突破世界记录,我们先来看一下效果吧。

ce0fa9200e51cd9085bcc56cbc6bd79a.gif

中级 - 0.74秒 3BV/S=60.81

相信许多人很早就知道有扫雷这么一款经典的游(显卡测试)戏(软件),更是有不少人曾听说过中国雷圣,也是中国扫雷第一、世界综合排名第二的郭蔚嘉的顶顶大名。扫雷作为一款在Windows9x时代就已经诞生的经典游戏,从过去到现在依然都有着它独特的魅力:快节奏高精准的鼠标操作要求、快速的反应能力、刷新纪录的快感,这些都是扫雷给雷友们带来的、只属于扫雷的独一无二的兴奋点。

▍0x00 准备

准备动手制作一套扫雷自动化软件之前,你需要准备如下一些工具/软件/环境

- 开发环境

  1. Python3 环境 - 推荐3.6或者以上 [更加推荐Anaconda3,以下很多依赖库无需安装]

  2. numpy依赖库 [如有Anaconda则无需安装]

  3. PIL依赖库 [如有Anaconda则无需安装]

  4. opencv-python

  5. win32gui、win32api依赖库

  6. 支持Python的IDE [可选,如果你能忍受用文本编辑器写程序也可以]

- 扫雷软件

· Minesweeper Arbiter(必须使用MS-Arbiter来进行扫雷!)

好啦,那么我们的准备工作已经全部完成了!让我们开始吧~

▍0x01 实现思路

在去做一件事情之前最重要的是什么?是将要做的这件事情在心中搭建一个步骤框架。只有这样,才能保证在去做这件事的过程中,尽可能的做到深思熟虑,使得最终有个好的结果。我们写程序也要尽可能做到在正式开始开发之前,在心中有个大致的思路。

对于本项目而言,大致的开发过程是这样的:

  1. 完成窗体内容截取部分

  2. 完成雷块分割部分

  3. 完成雷块类型识别部分

  4. 完成扫雷算法

好啦,既然我们有了个思路,那就撸起袖子大力干!

- 01 窗体截取

其实对于本项目而言,窗体截取是一个逻辑上简单,实现起来却相当麻烦的部分,而且还是必不可少的部分。我们通过Spy++得到了以下两点信息:

class_name = "TMain"
title_name = "Minesweeper Arbiter "
  • ms_arbiter.exe的主窗体类别为"TMain"

  • ms_arbiter.exe的主窗体名称为"Minesweeper Arbiter "

注意到了么?主窗体的名称后面有个空格。正是这个空格让笔者困扰了一会儿,只有加上这个空格,win32gui才能够正常的获取到窗体的句柄。

本项目采用了win32gui来获取窗体的位置信息,具体代码如下:

hwnd = win32gui.FindWindow(class_name, title_name)
if hwnd:
left, top, right, bottom = win32gui.GetWindowRect(hwnd)

通过以上代码,我们得到了窗体相对于整块屏幕的位置。之后我们需要通过PIL来进行扫雷界面的棋盘截取。

我们需要先导入PIL库

from PIL import ImageGrab

然后进行具体的操作。

left += 15
top += 101
right -= 15
bottom -= 43


rect = (left, top, right, bottom)
img = ImageGrab.grab().crop(rect)

聪明的你肯定一眼就发现了那些奇奇怪怪的Magic Numbers,没错,这的确是Magic Numbers,是我们通过一点点细微调节得到的整个棋盘相对于窗体的位置。

注意:这些数据仅在Windows10下测试通过,如果在别的Windows系统下,不保证相对位置的正确性,因为老版本的系统可能有不同宽度的窗体边框。

9b8189ba5cf99b3b4dae528cc9c635ed.png

橙色的区域是我们所需要的

好啦,棋盘的图像我们有了,下一步就是对各个雷块进行图像分割了~

- 02 雷块分割

5aa9f1bc11b615c632deff242be75451.png

在进行雷块分割之前,我们事先需要了解雷块的尺寸以及它的边框大小。经过笔者的测量,在ms_arbiter下,每一个雷块的尺寸为16px*16px。

知道了雷块的尺寸,我们就可以进行每一个雷块的裁剪了。首先我们需要知道在横和竖两个方向上雷块的数量。

block_width, block_height = 16, 16
  blocks_x = int((right - left) / block_width)
  blocks_y = int((bottom - top) / block_height)

之后,我们建立一个二维数组用于存储每一个雷块的图像,并且进行图像分割,保存在之前建立的数组中。

def crop_block(hole_img, x, y):
        x1, y1 = x * block_width, y * block_height
        x2, y2 = x1 + block_width, y1 + block_height
return hole_img.crop((x1, y1, x2, y2))


blocks_img = [[0 for i in range(blocks_y)] for i in range(blocks_x)]


for y in range(blocks_y):
for x in range(blocks_x):
        blocks_img[x][y] = crop_block(img, x, y)

将整个图像获取、分割的部分封装成一个库,随时调用就OK啦~在笔者的实现中,我们将这一部分封装成了imageProcess.py,其中函数get_frame()用于完成上述的图像获取、分割过程。

- 03 雷块识别

这一部分可能是整个项目里除了扫雷算法本身之外最重要的部分了。笔者在进行雷块检测的时候采用了比较简单的特征,高效并且可以满足要求。

def analyze_block(self, block, location):
    block = imageProcess.pil_to_cv(block)


    block_color = block[8, 8]
    x, y = location[0], location[1]


    # -1:Not opened
    # -2:Opened but blank
    # -3:Un initialized


    # Opened
if self.equal(block_color, self.rgb_to_bgr((192, 192, 192))):
if not self.equal(block[8, 1], self.rgb_to_bgr((255, 255, 255))):
self.blocks_num[x][y] = -2
self.is_started = True
else:
self.blocks_num[x][y] = -1


    elif self.equal(block_color, self.rgb_to_bgr((0, 0, 255))):
self.blocks_num[x][y] = 1


    elif self.equal(block_color, self.rgb_to_bgr((0, 128, 0))):
self.blocks_num[x][y] = 2


    elif self.equal(block_color, self.rgb_to_bgr((255, 0, 0))):
self.blocks_num[x][y] = 3


    elif self.equal(block_color, self.rgb_to_bgr((0, 0, 128))):
self.blocks_num[x][y] = 4


    elif self.equal(block_color, self.rgb_to_bgr((128, 0, 0))):
self.blocks_num[x][y] = 5


    elif self.equal(block_color, self.rgb_to_bgr((0, 128, 128))):
self.blocks_num[x][y] = 6


    elif self.equal(block_color, self.rgb_to_bgr((0, 0, 0))):
if self.equal(block[6, 6], self.rgb_to_bgr((255, 255, 255))):
            # Is mine
self.blocks_num[x][y] = 9
        elif self.equal(block[5, 8], self.rgb_to_bgr((255, 0, 0))):
            # Is flag
self.blocks_num[x][y] = 0
else:
self.blocks_num[x][y] = 7


    elif self.equal(block_color, self.rgb_to_bgr((128, 128, 128))):
self.blocks_num[x][y] = 8
else:
self.blocks_num[x][y] = -3
self.is_mine_form = False


if self.blocks_num[x][y] == -3 or not self.blocks_num[x][y] == -1:
self.is_new_start = False

可以看到,我们采用了读取每个雷块的中心点像素的方式来判断雷块的类别,并且针对插旗、未点开、已点开但是空白等情况进行了进一步判断。具体色值是笔者直接取色得到的,并且屏幕截图的色彩也没有经过压缩,所以通过中心像素结合其他特征点来判断类别已经足够了,并且做到了高效率。

在本项目中,我们实现的时候采用了如下标注方式:

  • 1-8:表示数字1到8

  • 9:表示是地雷

  • 0:表示插旗

  • -1:表示未打开

  • -2:表示打开但是空白

  • -3:表示不是扫雷游戏中的任何方块类型

通过这种简单快速又有效的方式,我们成功实现了高效率的图像识别。

- 04 扫雷算法实现

这可能是本篇文章最激动人心的部分了。在这里我们需要先说明一下具体的扫雷算法思路:

  1. 遍历每一个已经有数字的雷块,判断在它周围的九宫格内未被打开的雷块数量是否和本身数字相同,如果相同则表明周围九宫格内全部都是地雷,进行标记。

  2. 再次遍历每一个有数字的雷块,取九宫格范围内所有未被打开的雷块,去除已经被上一次遍历标记为地雷的雷块,记录并且点开。

  3. 如果以上方式无法继续进行,那么说明遇到了死局,选择在当前所有未打开的雷块中随机点击。(当然这个方法不是最优的,有更加优秀的解决方案,但是实现相对麻烦)

基本的扫雷流程就是这样,那么让我们来亲手实现它吧~

首先我们需要一个能够找出一个雷块的九宫格范围的所有方块位置的方法。因为扫雷游戏的特殊性,在棋盘的四边是没有九宫格的边缘部分的,所以我们需要筛选来排除掉可能超过边界的访问。

def generate_kernel(k, k_width, k_height, block_location):


     ls = []
     loc_x, loc_y = block_location[0], block_location[1]


for now_y in range(k_height):
for now_x in range(k_width):
if k[now_y][now_x]:
                 rel_x, rel_y = now_x - 1, now_y - 1
                 ls.append((loc_y + rel_y, loc_x + rel_x))
return ls


 kernel_width, kernel_height = 3, 3


# Kernel mode:[Row][Col]
 kernel = [[1, 1, 1], [1, 1, 1], [1, 1, 1]]


# Left border
if x == 0:
for i in range(kernel_height):
         kernel[i][0] = 0


# Right border
if x == self.blocks_x - 1:
for i in range(kernel_height):
         kernel[i][kernel_width - 1] = 0


# Top border
if y == 0:
for i in range(kernel_width):
         kernel[0][i] = 0


# Bottom border
if y == self.blocks_y - 1:
for i in range(kernel_width):
         kernel[kernel_height - 1][i] = 0


# Generate the search map
 to_visit = generate_kernel(kernel, kernel_width, kernel_height, location)

我们在这一部分通过检测当前雷块是否在棋盘的各个边缘来进行核的删除(在核中,1为保留,0为舍弃),之后通过generate_kernel函数来进行最终坐标的生成。

def count_unopen_blocks(blocks):
    count = 0
for single_block in blocks:
if self.blocks_num[single_block[1]][single_block[0]] == -1:
            count += 1
return count


def mark_as_mine(blocks):
for single_block in blocks:
if self.blocks_num[single_block[1]][single_block[0]] == -1:
self.blocks_is_mine[single_block[1]][single_block[0]] = 1


unopen_blocks = count_unopen_blocks(to_visit)
if unopen_blocks == self.blocks_num[x][y]:
     mark_as_mine(to_visit)

在完成核的生成之后,我们有了一个需要去检测的雷块“地址簿”:to_visit。之后,我们通过count_unopen_blocks函数来统计周围九宫格范围的未打开数量,并且和当前雷块的数字进行比对,如果相等则将所有九宫格内雷块通过mark_as_mine函数来标注为地雷。

def mark_to_click_block(blocks):
for single_block in blocks:


# Not Mine
if not self.blocks_is_mine[single_block[1]][single_block[0]] == 1:
# Click-able
if self.blocks_num[single_block[1]][single_block[0]] == -1:


# Source Syntax: [y][x] - Converted
if not (single_block[1], single_block[0]) in self.next_steps:
self.next_steps.append((single_block[1], single_block[0]))


def count_mines(blocks):
    count = 0
for single_block in blocks:
if self.blocks_is_mine[single_block[1]][single_block[0]] == 1:
            count += 1
return count


mines_count = count_mines(to_visit)


if mines_count == block:
    mark_to_click_block(to_visit)

扫雷流程中的第二步我们也采用了和第一步相近的方法来实现。先用和第一步完全一样的方法来生成需要访问的雷块的核,之后生成具体的雷块位置,通过count_mines函数来获取九宫格范围内所有雷块的数量,并且判断当前九宫格内所有雷块是否已经被检测出来。

如果是,则通过mark_to_click_block函数来排除九宫格内已经被标记为地雷的雷块,并且将剩余的安全雷块加入next_steps数组内。

# Analyze the number of blocks
self.iterate_blocks_image(BoomMine.analyze_block)


# Mark all mines
self.iterate_blocks_number(BoomMine.detect_mine)


# Calculate where to click
self.iterate_blocks_number(BoomMine.detect_to_click_block)


if self.is_in_form(mouseOperation.get_mouse_point()):
for to_click in self.next_steps:
         on_screen_location = self.rel_loc_to_real(to_click)
         mouseOperation.mouse_move(on_screen_location[0], on_screen_location[1])
         mouseOperation.mouse_click()

在最终的实现内,笔者将几个过程都封装成为了函数,并且可以通过iterate_blocks_number方法来对所有雷块都使用传入的函数来进行处理,这有点类似Python中Filter的作用。

之后笔者做的工作就是判断当前鼠标位置是否在棋盘之内,如果是,就会自动开始识别并且点击。具体的点击部分,笔者采用了作者为"wp"的一份代码(从互联网搜集而得),里面实现了基于win32api的窗体消息发送工作,进而完成了鼠标移动和点击的操作。具体实现封装在mouseOperation.py中,有兴趣可以在文末的Github Repo中查看。

aea3b51753000027f6596e5911e864cb.png

有兴趣的同学可以火速加入我们的星球

3周零基础入门提供10节课程

每个月一个实战项目,

奖励优秀的Top3同学送书

专业的答疑群,大厂的老师保姆式的教学

如果不满意,三天内随意退款!一年88,现在优惠16元

b19ece0d5df693787ce85f0a0558c3f2.png

扫码加入,3周零基础入门


 
推荐阅读:
入门: 最全的零基础学Python的问题  | 零基础学了8个月的Python  | 实战项目 |学Python就是这条捷径
干货:爬取豆瓣短评,电影《后来的我们》 | 38年NBA最佳球员分析 |   从万众期待到口碑扑街!唐探3令人失望  | 笑看新倚天屠龙记 | 灯谜答题王 |用Python做个海量小姐姐素描图 |碟中谍这么火,我用机器学习做个迷你推荐系统电影
趣味:弹球游戏  | 九宫格  | 漂亮的花 | 两百行Python《天天酷跑》游戏!
AI: 会做诗的机器人 | 给图片上色 | 预测收入 | 碟中谍这么火,我用机器学习做个迷你推荐系统电影
小工具: Pdf转Word,轻松搞定表格和水印! | 一键把html网页保存为pdf!|  再见PDF提取收费! | 用90行代码打造最强PDF转换器,word、PPT、excel、markdown、html一键转换 | 制作一款钉钉低价机票提示器! |60行代码做了一个语音壁纸切换器天天看小姐姐!|

年度爆款文案

点阅读原文,看200个Python案例!

[Python] 自动扫雷 闲来无事,打开虚拟机上的扫雷玩了玩,觉得自己计算很浪费时间,还容易遗漏,就做了个自动扫雷。 简单模式下很容易通关,困难的就看脸了,感兴趣的可以拿去运行一下。 自动化处理核心代码段在 168~273行。 ======================== 次日,发现自动扫雷算法并不完整,上次的代码仅对单个数字周围进行判断。 但在一些情况下,单个数字无法判断,要综合一片小区域确定某些方块是否一定是炸弹,或者一定安全。 暂且称为高级算法。(并不是算法有多高级,本质上还是取集合(区域),进行大量的判断,难在复杂判断的 阅读详情

相关推荐

Python实现自动扫雷,轻松挤上世界排行榜,破世界纪录~

导语: 对于许多90后、00后来说,扫雷这个电脑上自带的小游戏早就变成古早的历史,再一次提到扫雷这个名字的时候,对许多人来说,仿佛就是上世纪的事情了 扫雷 就像是偶尔点开微信的跳一跳小游戏,发现排行榜上还有人在孤独的霸榜一样。已经2020年了,还有许多90后、00后坚守在扫雷这个游戏上。 在扫雷的世界里,已经进化到了神仙打架,都想争夺那个世界第一的称号,走上扫雷的神坛。 关于扫雷游戏,甚至还有世界排行榜,放眼望去,关于这个神坛之争,光中国人就占到了一半多: 不要被这个古早的网页迷惑,认为.

a55656aq的博客 2021

python版扫雷(基于tkinter),教你学python

python版本扫雷游戏,具有标准模板tkinter,学习python啦!!!

boonion的博客 7517

2024年【Python】实现自动扫雷,挑战世界纪录_ms-arbiter

大家好,欢迎来到 编程教室!今天给大家分享的这个案例是用 Python+OpenCV 实现了自动扫雷,并突破了人类的世界记录。(当然这不算哈)咱们废话不多说,先看成果~中级 - 0.74秒 3BV/S=60.81相信许多人很早就知道有扫雷这么一款经典的游(显卡测试)戏(软件),更是有不少人曾听说过中国雷圣,也是中国扫雷第一、世界综合排名第二的郭蔚嘉的顶顶大名。扫雷作为一款在Windows9x时代就已经诞生的经典游戏,从过去到现在依然都有着。

2401_84563561的博客 1452

python实现《扫雷》小游戏

主程序不到60行就完成了《扫雷》经典小游戏,你确定不来看看嘛

qq_65120254的博客 1万+

Python实现自动扫雷的方法

通过以上代码,我们实现了一个自动扫雷的Python程序。该程序通过递归算法和逻辑推理来自动揭示方块,帮助玩家解决扫雷游戏。你可以根据需要调整游戏板的大小和地雷数量,并观察程序的输出结果。自动扫雷是一种常见的计算机游戏,目标是在一个由方块组成的网格中揭示出所有非地雷方块,同时避免触雷。本文将介绍如何使用Python编写自动扫雷程序,通过逻辑推理和算法来自动解决扫雷游戏。希望这个例子能够帮助你理解如何使用Python编写自动扫雷程序!如果你有任何其他问题,请随时提问。

UkyzJava的博客 357

python实战教程之自动扫雷

前言 自动扫雷一般分为两种,一种是读取内存数据,而另一种是通过分析图片获得数据,并通过模拟鼠标操作,这里我用的是第二种方式。 一、准备工作 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,但是有的要把pywin

破世界纪录了 0.74 秒!用 Python 实现自动扫雷!

用Python+OpenCV实现了自动扫雷,突破世界记录,我们先来看一下效果吧。相信许多人很早就知道有扫雷这么一款经典的游(显卡测试)戏(软件),更是有不少人曾听说过中国雷圣,也是中国扫雷第一、世界综合排名第二的郭蔚嘉的顶顶大名。扫雷作为一款在Windows9x时代就已经诞生的经典游戏,从过去到现在依然都有着它独特的魅力:快节奏高精准的鼠标操作要求、快速的反应能力、刷新纪录的快感,这些都是扫雷给雷友们带来的、只属于扫雷的独一无二的兴奋点。0x00 准备。

Python栈_基的博客 1105

【LabVIEW懒人系列教程-视觉入门】2.6LabVIEW模板匹配之创建模板

上期2.5在Labview软件框架中实现了模板匹配功能的运用,然而我们的模板图像是通过视觉助手创建出来的,在实际项目中这样做 ,难免有些不妥。所以,今天就给大家讲解一下,如何编写创建模板功能,模板图像的创建与加载需要注意一些什么。 模板图片的创建,大家可以理解为将图像中的一个特征区域扣下来,通过Labview函数进行信息学习,然后保存成带有图像信息的模板图。 具体做法,下面为大家演示一下 百度网盘视频链接:https://pan.baidu.com/s/1-zxcJBxPgk4t1Ej..

视觉龙哥 2168

破世界纪录了0.74秒!用代码实现自动扫雷!

来源丨https://zhuanlan.zhihu.com/p/35755039文末有送书福利,别错过啦用Python+OpenCV实现了自动扫雷,突破世界记录,我们先来看一下效果吧。中级...

程序IT圈 1450

Windows 11 的C盘User(用户)文件夹下的用户文件夹名称的修改

背景介绍:由于系统重装导致Windows 11的系统用户名与C盘User(用户)文件夹下的用户名文件夹(公用文件夹旁边的文件夹)出现名称不一致,事例中系统用户名命名为“寂萧”,User(用户)文件夹下的文件夹名称却是“77555”。【QQ邮箱前五位真的真的看着很别扭】注:改名有风险,三思而后行。User(用户)文件夹下的用户名是中文在某些软件的应用场景下产生不便,导致很多软件莫名其妙报错,甚至无法使用,笔者不建议修改为中文名。//和笔者一样的强迫症除外//

2302_79084172的博客 10万+

从原理到实践:详解RGBD相机深度与彩色图像对齐(D2C)算法

本文深入解析了RGBD相机深度与彩色图像对齐(D2C)算法的原理与实现。针对自组装相机中深度图与彩色图不匹配的核心痛点,文章从相机模型、坐标系变换等数学基础讲起,剖析了传统点映射算法的缺陷,并重点介绍了高效的矩形区域映射算法。该算法通过将深度像素视为矩形区域进行映射,有效解决了空洞和遮挡问题,并附有可直接复用的C++代码与优化技巧,为三维重建、机器人视觉等应用奠定坚实基础。

weixin_28363123的博客 243

破世界纪录了!用Python实现自动扫雷

来源:zhuanlan.zhihu.com/p/35755039用Python+OpenCV实现了自动扫雷,突破世界记录,我们先来看一下效果吧。中级 - 0.74秒 3BV/S=60.81...

Python小二 1159

真双口RAM---Quartus与Vivado开发环境区别对比

2、写和写冲突:表示两个端口写使能同时有效且写地址相同,此时需要关断一个写,把两个写端口都需要更新的值处理到一个写端口上面,任何的DP RAM 都不支持写和写冲突。以上述直方图统计使用为例,博主在仿真过程中发现,vivado真双口RAM--B端口读写延迟2个clk;1、读和写冲突:如果读和写同时有效,且读和写是同一个地址时,发生RAM读写冲突,此时会把最新的写数据直接赋给读数据,称为写穿通到读。

weixin_54470733的博客 3583

破世界纪录了!用Python实现自动扫雷!

扫雷作为一款在Windows9x时代就已经诞生的经典游戏,从过去到现在依然都有着它独特的魅力:快节奏高精准的鼠标操作要求、快速的反应能力、刷新纪录的快感,这些都是扫雷给雷友们带来的、只属于扫雷的独一无二的兴奋点。先用和第一步完全一样的方法来生成需要访问的雷块的核,之后生成具体的雷块位置,通过count_mines函数来获取九宫格范围内所有雷块的数量,并且判断当前九宫格内所有雷块是否已经被检测出来。因为扫雷游戏的特殊性,在棋盘的四边是没有九宫格的边缘部分的,所以我们需要筛选来排除掉可能超过边界的访问。

优快云_224022的博客 880

OWASP-ZAP扫描器的使用

目录 OWASP-ZAP 更新 代理 目录扫描 主动扫描(Active Scan) 扫描结果 生成报告 OWASP-ZAP OWASP Zed攻击代理(ZAP)是世界上最受欢迎的免费安全审计工具之一,由数百名国际志愿者积极维护。它可以帮助你在开发和测试应用程序时自动查找Web应用程序中的安全漏洞。 也可以说ZAP是一个中间人代理。它能够获取你对Web应用程序发出的所有请求以...

谢公子的博客 2万+

【35】软考软件设计师——设计模式代码填空(C++版)满分精讲|第5/6题二选一必考

本文是《软件设计师·50讲通关|从零基础到工程师职称》专栏第35篇,聚焦下午选做题**第5/6题C++版设计模式代码填空**,与上一篇Java版形成双子配套,单题分值稳定12~15分。全文超4000字深度拆解C++独有核心考点:虚函数/纯虚函数、构造与析构函数规范、继承权限、模板类编程在设计模式中的应用;精讲单例、工厂、策略、观察者、适配器五大高频模式的C++专属代码写法,标注所有填空核心点位、语法陷阱、内存安全规范

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 547

Python+OpenCV实现自动扫雷,挑战扫雷世界记录!

扫雷作为一款在Windows9x时代就已经诞生的经典游戏,从过去到现在依然都有着它独特的魅力:快节奏高精准的鼠标操作要求、快速的反应能力、刷新纪录的快感,这些都是扫雷给雷友们带来的、只属于扫雷的独一无二的兴奋点。先用和第一步完全一样的方法来生成需要访问的雷块的核,之后生成具体的雷块位置,通过count_mines函数来获取九宫格范围内所有雷块的数量,并且判断当前九宫格内所有雷块是否已经被检测出来。因为扫雷游戏的特殊性,在棋盘的四边是没有九宫格的边缘部分的,所以我们需要筛选来排除掉可能超过边界的访问。

CDB3399的博客 5459

海康视觉算法平台VisionMaster 4.3.0 C# 二次开发01 加载方案并获取结果

第一次使用海康视觉算法平台VisionMaster 4.3.0,项目中要使用这个平台进行视觉处理并获取结果。

StevenChen的博客 7878

破世界纪录了0.74秒,用Python实现自动扫雷

用Python+OpenCV实现了自动扫雷,突破世界记录,我们先来看一下效果吧。 中级 - 0.74秒 3BV/S=60.81 相信许多人很早就知道有扫雷这么一款经典的游(显卡测试)戏(软件),更是有不少人曾听说过中国雷圣,也是中国扫雷第一、世界综合排名第二的郭蔚嘉的顶顶大名。扫雷作为一款在Windows9x时代就已经诞生的经典游戏,从过去到现在依然都有着它独特的魅力:快节奏高精准的鼠标操作要求、快速的反应能力、刷新纪录的快感,这些都是扫雷给雷友们带来的、只属于扫雷的独一无二的兴奋点。 ▍0x00

码农黑羽的博客 215

第一讲:halcon模板匹配捆绑测量矩形检测芯片针脚

使用halcon模板匹配捆绑测量矩形,检测位置发生变换的芯片针脚缺陷。

uiopmn1的博客 2995

SAP B1中文培訓教材_SDK

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

破世界纪录了 0.74 秒,用 Python 实现自动扫雷

破世界纪录了 0.74 秒!用 Python 实现自动扫雷! 相信许多人很早就知道有扫雷这么一款经典的游(显卡测试)戏(软件),更是有不少人曾听说过中国雷圣,也是中国扫雷第一、世界综合排名第二的郭蔚嘉的顶顶大名。 扫雷作为一款在Windows9x时代就已经诞生的经典游戏,从过去到现在依然都有着它独特的魅力:快节奏高精准的鼠标操作要求、快速的反应能力、刷新纪录的快感,这些都是扫雷给雷友们带来的、只属于扫雷的独一无二的兴奋点。 ▍0x00 准备 准备动手制作一套扫雷自动化软件之前,你需要准备如下一些工具/软件

大模型教程的博客 195

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【Python】实现自动扫雷,挑战世界纪录

大家好,欢迎来到 编程教室 !今天给大家分享的这个案例是用 Python+OpenCV 实现了自动扫雷,并突破了人类的世界记录。(当然这不算哈)咱们废话不多说,先看成果~中级 - 0.74秒 3BV/S=60.81相信许多人很早就知道有扫雷这么一款经典的游(显卡测试)戏(软件),更是有不少人曾听说过中国雷圣,也是中国扫雷第一、世界综合排名第二的郭蔚嘉的顶顶大名。扫雷作为一款在Windows9x时代就已经诞生的经典游戏,从过去到现在依然都有着它独特的魅力:快节奏高精准的鼠标操作要求、快速的反应能力、刷新纪录的

xff123456_的博客 1311

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

上一篇: 没有50W彩礼 女友被强行拽走! Python分析全国彩礼情况,心凉了!
下一篇: 我用Python追到了全公司最漂亮的小姐姐!
菜鸟学Python
博客等级 码龄9年 8086粉丝 571原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值