题目描述
绘制一个扫雷的游戏,给定三个输入的变量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)
运行结果如下: