2014-12-01 40 views
0

這是我迄今爲止的代碼。一切適用於測試用例。我在編碼方面非常糟糕,所以我不知道如何編寫一個函數,在指定的圖塊中打印周圍圖塊中的炸彈數量。我正在考慮尋找炸彈磚,並將其周圍的所有瓷磚加1,備用瓷磚已經是炸彈。但我不知道該怎麼寫。我該如何編寫一個函數來增加一個盒子周圍的地雷數量,並在python(掃雷)中打印該盒子中的數字

代碼到目前爲止

def makemat(x): 
    for a in range(x): 
     list1=[] 
     b=0 
     while b<x: 
      list1.append(0) 
      b+=1 
     mat1.append(list1) 
    for c in range(x): 
     list2=[] 
     d=0 
     while d<x: 
      list2.append('-') 
      d+=1 
     mat2.append(list2) 
makemat(8) 

def printmat(mat): 
    for y in mat: 
     print(str(y)+"\t") 
printmat(mat1) 
print() 

def addmines(z): 
    count=1 
    while count<=z: 
     p=randrange(len(mat1)) 
     t=randrange(len(mat1)) 
     if mat1[p][t]=="b": 
      count+=0 
     else: 
      mat1[p][t]="b" 
      count+=1 
    printmat(mat1) 
addmines(10) 

def addscores(): 
+0

「其他所有工作」在什麼意義上?如果你運行這個,你只會得到'NameError's到處都是,因爲有一些全局變量你不會定義。 – abarnert 2014-12-01 21:48:21

回答

1

讓我們打破這成碎片。

  1. 給定矩陣,行索引和列索引,你如何找到鄰居?
  2. 鑑於鄰居,你如何計算炸彈有多少?
  3. 你如何瀏覽矩陣的每一行索引和每列索引?

第二和第三,你已經知道該怎麼做,因爲你在現有的代碼中做類似的事情。但是,第一個是幾乎容易:

for neighbor_row in row-1, row, row+1: 
    for neighbor_col in col-1, col, col+1: 

有兩個問題,這個簡單的代碼:

  1. 它將計算(row, col)作爲自己的鄰居。
  2. 它會破壞矩陣的邊緣。如果row爲0,row-1爲-1,這是合法的,但不是你想要的;如果row是7,row+1是8,這將引發異常。

在這種情況下,你可以忽略第一個問題,如果(row, col)是不是炸彈,也不會添加到計數,如果是炸彈,我們不關心計數。

第二個是棘手的,但是我們可以通過使用range代替顯式列出的三個值,並且使用maxmin迫使範圍的端部解決它是範圍內:

for neighbor_row in range(max(row-1, 0), min(row+1, len(mat)-1)): 

現在,您只需完成雙循環,添加炸彈檢查並計算並存儲結果,然後將整個事件放入另一個遍歷矩陣中每行和每列的雙循環中,然後就完成了。

你可能想要考慮抽象出來 - 你可以把這個循環寫成itertools.product的單個調用,使用生成器表達式來計算sum,然後整個函數只有4行,再加上你已經有辦法重用其中的一部分。但先讓簡單的版本工作。

相關問題