数据结构与算法---数组

题目描述

绘制一个扫雷的游戏,给定三个输入的变量M,N,P绘制一个扫雷的棋盘,要求棋盘中每个单元格中雷的概率为p。

思路分析

对于扫雷游戏而言,第一步是要绘制出一个棋盘,但是棋盘大小如果按照M*N进行绘制那么需要考虑很多的边界调节,因为我们在考虑扫雷游戏的每个单元格的时候,单元格中如果不为雷那么其中的数字应该是周围雷的个数,一般来说针对于每一个单元格我们需要考虑的无非是上,下,左,右,斜右上,斜右下,斜左上,斜左下。对于棋框内部的仍可以直接用for语句进行遍历但是对于棋框边界的就不容易了,对于次我们考虑将棋牌的框外接直接给加一层0,以避免边界条件的干扰。

代码流程

输入的是三个变量,我们这里假设之前声明了,m,n,p

1、生成棋盘

broad = [[None]*(n+2) for i in range (m+2)]

2、设置概率p并设置棋盘中单元格为雷的位置,我们将雷的单元格赋值为-1,正常的赋值为0

for i in range(0,m+1):
        for j in range(0,n+1):
            r = random.random()
            broad[i][j] = -1 if r < p else 0

3、有了棋盘中雷的概率,下面我们就要开始绘制棋盘了,我们将雷绘制成为*,正常的绘制成.

for i in range(0,m+1):
        for j in range(0,n+1):
            print("*",end=" ") if broad[i][j] == -1 else print(".",end=" ")
        print()

输出结果为:

4、我们对棋盘中的单元格进行赋值,其中雷的话我们依然绘制成“*”,但是对于非雷的单元格我们就对其进行赋值。

for i in range(0,m+1):
        for j in range(0,n+1):
            if broad[i][j] != -1:
                for k in range(i-1,i+2):
                    for q in range(j-1,j+2):
                        if broad[k][q] == -1:
                            broad[i][j]+=1

    print("---------------------------------------")

 5、最后我们将整个扫雷游戏画出来

for i in range(0,m+1):
        for j in range(0,n+1):
            print("*",end=" ") if broad[i][j] == -1 else print(broad[i][j],end=" ")
        print()

6、完整代码如下:

import random
from typing import Mapping

def minesweept(m,n ,p):
    
    broad = [[None]*(n+2) for i in range(m+2)]

    for i in range(0,m+1):
        for j in range(0,n+1):
            r = random.random()
            broad[i][j] = -1 if r < p else 0
    
    for i in range(0,m+1):
        for j in range(0,n+1):
            print("*",end=" ") if broad[i][j] == -1 else print(".",end=" ")
        print()
    
    for i in range(0,m+1):
        for j in range(0,n+1):
            if broad[i][j] != -1:
                for k in range(i-1,i+2):
                    for q in range(j-1,j+2):
                        if broad[k][q] == -1:
                            broad[i][j]+=1

    print("---------------------------------------")

    for i in range(0,m+1):
        for j in range(0,n+1):
            print("*",end=" ") if broad[i][j] == -1 else print(broad[i][j],end=" ")
        print()


if __name__ == "__main__":
    minesweept(4,5,0.2)
    

运行结果如下:

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Peihj2021

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值