2024年最新2024最新大厂Python面试集合,【Python】实现自动扫雷,挑战世界纪录_ms-arbiter(1),2024年最新2024非科班生的Python面试之路

收集整理了一份《2024年最新Python全套学习资料》免费送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img



既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Python知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来

如果你需要这些资料,可以添加V无偿获取:hxbc188 (备注666)
img

正文

4.opencv-python

5.win32gui、win32api依赖库

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


### - 扫雷软件


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


http://saolei.net/Download/Arbiter\_0.52.3.zip


当然,在正式开始之前,我们还需要了解一下扫雷的基础知识。如果不清楚的同学可以参考中国最大的扫雷论坛saolei.net中的文章:


http://saolei.net/BBS/Title.asp?Id=177


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


### ▍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系统下,不保证相对位置的正确性,因为老版本的系统可能有


不同宽度的窗体边框。


![在这里插入图片描述](https://img-blog.csdnimg.cn/5442435845f8452a8ff43dde4ed122cd.jpeg)


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


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


### - 02 雷块分割


![在这里插入图片描述](https://img-blog.csdnimg.cn/5c7e2f14a6f04e52b09cd631fdff5657.jpeg)


在进行雷块分割之前,我们事先需要了解雷块的尺寸以及它的边框大小。经过笔者的测量,在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 mineself.blocks\_num[x][y] = 9 
elif self.equal(block[5, 8], self.rgb_to_bgr((255, 0, 0))):            
# Is flagself.blocks\_num[x][y] = 0else:self.blocks\_num[x][y] = 7
elif self.equal(block_color, self.rgb_to_bgr((128, 128, 128))):
self.blocks_num[x][y] = 8else:
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.再次遍历每一个有数字的雷块,取九宫格范围内所有未被打开的雷块,去除已经被上一次遍历标记为地雷的雷块,记录并且点


开。


**(1)Python所有方向的学习路线(新版)**  

这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

最近我才对这些路线做了一下新的更新,知识体系更全面了。



![在这里插入图片描述](https://img-blog.csdnimg.cn/1f807758e039481fa866130abf71d796.png#pic_center)



**(2)Python学习视频**



包含了Python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然没有那么全面,但是对于入门来说是没问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。

![在这里插入图片描述](https://img-blog.csdnimg.cn/d66e3ad5592f4cdcb197de0dc0438ec5.png#pic_center)



**(3)100多个练手项目**

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。

![在这里插入图片描述](https://img-blog.csdnimg.cn/f5aeb4050ab547cf90b1a028d1aacb1d.png#pic_center)




**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**如果你需要这些资料,可以添加V无偿获取:hxbc188 (备注666)**
![img](https://img-blog.csdnimg.cn/img_convert/87a8985caf3fc180ab79af0dcd5853fa.png)

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

![在这里插入图片描述](https://img-blog.csdnimg.cn/f5aeb4050ab547cf90b1a028d1aacb1d.png#pic_center)




**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**如果你需要这些资料,可以添加V无偿获取:hxbc188 (备注666)**
[外链图片转存中...(img-MHLpCCFk-1713817446169)]

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值