python编写扫雷_利用Python编写自动扫雷程序(1)-初始化雷区

最早想到编程扫雷程序的灵感,是来自于B站Up主:魔法小分队队长 的一个视频:

视频中他使用C语言编写了模拟扫雷的程序,刚好最近自己正沉迷py无法自拔,便思考到是否可以利用Python编程实现扫雷程序。

首先考虑通过矩阵模拟扫雷面板,可以设置相应大小的雷区矩阵board。

若该位置值为1,则该处为地雷,若该位置为0,该位置无雷。

Python的优势在于它拥有各类功能强大的模块,我们可以通过numpy模块产生雷区矩阵(board)

from numpy import *

class Board(object):

def __init__(self,width=10,height=10,miner_number=20):

#初始化雷区

self.width,self.height=width,height

self.miner_number=miner_number

#创建长度为设定地雷数量的ones向量

self.board=ones(miner_number)

#添加长度为剩余数量的zeros向量

self.board=append(self.board,zeros(width*height-miner_number)

#打乱这些向量中0与1元素的顺序

random.shuffle(self.board)

#把向量变形成为固定长宽的矩阵

self.board=self.board.reshape(width,height)

建立了雷区矩阵之后,我们还需要建立另一个矩阵,来实现扫雷的另一个功能。即在雷区附近的3*3方格内,我们点开它后,会显示数字告诉我们这个方格周围存在着多少颗地雷。

为了实现这个功能,我们需要建立另一个矩阵number,来储存这些信息。那么如何方便快捷地计算得到这些信息呢?我们可以通过对雷区矩阵与另一个卷积核矩阵(下图)做矩阵卷积

卷积运算可以看做对雷区矩阵各个元素,令卷积核矩阵的中心(10)与之重合。再计算各个重合元素乘积之和,得到新的矩阵各处元素值。

(新矩阵(2,2)处即为如图蓝色数字与红色数字对应乘积之和)

经此运算,则得到我们的雷数矩阵(number)为了在雷数矩阵中区分普通数字以及地雷,我们特意设置卷积核矩阵中心为10,以确保在雷数矩阵中,地雷位置的元素值大于9,方便我们加以区分。

from scipy import convolve2d

#(在 Class Board中 def __init__...... 下)

#对雷区矩阵进行矩阵卷积

self.number=convolve2d(self.board,[[1,1,1],[1,10,1],[1,1,1]],'same')

'same'的意思为结果取与雷区矩阵相同大小的矩阵。

这样,我们便初始化生成了最基础的雷区,之后所需要做的是编写相应的算法,以标注可见不可见区域,再经由不同的操作,实现逐步打开雷区。

作者:李鋆胤

刚开始学习Python,写这篇文章纯作为分享思路,如果有编程思路上的问题,欢迎指正并交流~

附:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值