我在stackoverflow上找到了这段代码,并尝试将它用于我自己的代码,但我必须了解每个语句正在做什么。我现在知道感谢jonrshape ,这段代码应检查所有环绕声位置以及是否有邻居1
for x in range(rows):
for y in range(cols-1): #Loop until the second to last element.
lives = 0
if matrix[x][y+1] == 1:
lives += 1
if x == 0: #You probably don't want to check x-1 = -1
continue
if matrix[x-1][y+1] == 1:
lives += 1
所以我希望有些人可以一步一步地解释它
所以我可以尝试实现它而不会让你烦恼
修改
我认为第一个if是检查第一个位置(x / y)但是右边的邻居是什么
代码来源Python Matrix Neighbor Checking
EDIT2
我的意见声明在做什么
for x in range(rows):
for y in range(cols-1): # thats the part i would like to know how it works,what it does really
lives = 0
if matrix[x][y+1] == 1:
lives += 1
|0||0||0||1||0||0||0||0|...
Checking the x coord if it is a 1 -> |1|
it increase the the O above to 1 |0|
|0|
|0|
if x == 0:
continue
Checking the x coord if it is a O -> |0||0||0||1||0||0||0||0|
if its a 0 than it continue to check. |0|
|0|
|0|
|0|
if matrix[x-1][y+1] == 1: # thats the second part i would like to know how it works, what it does really
lives += 1
答案 0 :(得分:0)
要了解此代码的第一个重要事项是每个x
循环迭代中的y
和for
是您当前正在检查的单元格的坐标。然后,您可以在每个坐标中添加或减去1
以找到相邻的单元格,如下所示:
x-1, y-1 | x-1, y | * x-1, y+1
--------------------------------
x, y-1 | x, y | * x, y+1
--------------------------------
x+1, y-1 | x+1, y | x+1, y+1
请注意,有明显的例外情况:
y-1
)上,则无法检查y==0
; y+1
)上,则无法检查y==cols-1
; x-1
),则无法检查x==0
;和x+1
),则无法检查x==rows-1
。您发现的代码以两种稍微不同的方式处理它们;首先,从y
值范围中排除最后一列:
for y in range(cols-1):
由于range
给出的值但不包括 stop
参数,y+1
永远不会超出范围。其次,通过显式调用continue
来跳过循环的其余部分x == 0
:
if x == 0:
continue
因为x-1
会起作用(给-1
),但这会“回绕”检查最后一行;可能不是理想的行为。
要实现的第二个重要事项是,此代码因此为最多两个相邻单元格(右上角和右上角,上面用1
突出显示)添加lives
到*
如果邻居包含1
,则矩阵中的单元格。 lives
是一个单个数字 - 函数不会改变matrix
(尽管您发表了评论,但它实际上并不会“增加0以上“)。为此,您需要明确地更改值,例如:
if matrix[x][y+1] == 1:
matrix[x][y] += 1
你想要的是相似的,但你的函数应该返回一个新的矩阵,其中每个单元格的值是其邻居中'O'
的计数(即一个整数) 0
到8
)。或者,您可能希望将'O'
s包含在输出矩阵中与输入矩阵相同的坐标处。
有两种方法可以做到这一点: