如何编写一个函数来增加一个盒子周围的地雷数量,并在python(扫雷)中打印该框中的数字

时间:2014-12-01 21:28:27

标签: python

这是我到目前为止的代码。一切都适用于测试用例。我编码非常糟糕,所以我不知道如何编写一个函数来打印指定图块中周围图块中的炸弹数量。我正在考虑找到炸弹瓦片,并在它周围的所有瓷砖上加1,备用已经炸弹的瓷砖。但我不知道如何写这个。

到目前为止的

代码

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():

1 个答案:

答案 0 :(得分:2)

让我们把它分解成碎片。

  1. 给定矩阵,行索引和列索引,您如何找到邻居?
  2. 鉴于邻居,您如何计算有多少是炸弹?
  3. 如何查看矩阵的每一行索引和每列索引?
  4. 第二个和第三个,你已经知道该怎么做了,因为你在现有的代码中做了类似的事情。但第一个是几乎容易:

    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,则会引发异常。
    3. 在这种情况下,你可以忽略第一个问题 - 如果(row, col)不是炸弹,它不会增加计数,如果它是炸弹,我们就不会这样做。关心伯爵。

      第二个是棘手的,但我们可以使用range而不是明确列出这三个值来解决它,并使用maxmin来强制范围的结束在范围内:

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

      现在,你只需要完成那个双循环,添加炸弹检查并计算和存储结果,然后把整个东西放在另一个双循环中,遍历矩阵中的每一行和每一行,你就是&#39 ;完成。

      您可能想要考虑抽象出来 - 您可以将此循环编写为itertools.product的单个调用,将计数作为对sum的调用,使用生成器表达式,然后整个函数只有4行,而且你有办法重用它的一部分。但是首先要使用简单的版本。