題目描述
繪制一個掃雷的游戲,給定三個輸入的變數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)
運行結果如下:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/343094.html
標籤:其他
上一篇:超級馬里奧VS2019簡單操作
