使用pygame在“生命游戏”中查找相邻单元格的错误

时间:2014-06-25 20:10:05

标签: python pygame

我在python和pygame中制作了“Conway的生命游戏”版本,但是我找不到相邻的细胞。以下是大部分代码。我编辑了不必要的部分,因为问题在于cell.get_neighbors()函数。如果您想查看其余内容,可以阅读here

def main():
    while True:

        draw_board()
        update_cells()

        pygame.display.update()
        fpsClock.tick(FPS)

def update_cells():
    event_handling()

    if clicked == True:
        cell = where_clicked(mousex, mousey)
        if cell != None:
            print (cell.get_neighbors())

class cell:
    #The problem is with this function
    def get_neighbors(self):
        neighbors = []
        for y in (-1, 0, 1):
            for x in (-1, 0, 1):
                neighbor = find_cell(x + self.x, y + self.y)
                if neighbor not in (None, self):
                    neighbors.append(neighbor)
                    #I added neighbor.switch() so that I could easily see which cells were being returned by the get_neighbors() function.
                    neighbor.switch()
        return neighbors

    def switch(self):
        if self.alive == False:
            self.alive = True
        else:
            self.alive = False

def find_cell(x, y):
    for CELL in board:
        if CELL.x == x:
            if CELL.y == y:
                return CELL

if __name__ == '__main__':
    main()

上面写的get_neighbors()函数应该将所有8个相邻单元格变为黑色,而是将4-10个看似随机的单元格变为黑色。我做了this屏幕录制来演示问题。正如你所看到的,如果我点击左上角或顶部,它就会像它应该的那样工作,但是当我点击中间时,它会像这样:

http://www.imagesup.net/?di=8140372670715

或者这个:

http://www.imagesup.net/?di=1514037265628

或者这个:

http://www.imagesup.net/?di=1014037266308

我错过了什么吗?因为cell.get_neighbors()应该正常工作。 find_cell()正常工作,

for y in (-1, 0, 1):
    for x in (-1, 0, 1):
        ...
        find_cell(x, y)

应该像这样找到每个相邻的单元格。

(-1, -1), (-1, 0), (-1, 1)
( 0, -1), ( 0, 0), ( 0, 1)
( 1, -1), ( 1, 0), ( 1, 1)

if neighbor not in (None, self):

应该防止它返回板外的任何单元,并防止它自行返回。 (因为一个小区不能是它自己的邻居)。

感谢任何帮助!

1 个答案:

答案 0 :(得分:4)

在您发布的代码中

neighbor = find_cell(x + self.x, y + self.y)

但是,在您的链接代码中

for y in (-1, 0, 1):
    for x in (-1, 0, 1):
        x += self.x
        y += self.y

请注意,在您的图像中,切换后的细胞似乎向下移动。这是因为在重置为[-1,0,1]值之一之前,您正在内循环中修改y 三次。只运行循环并打印出值,你会看到y内部循环发生变化时不应该这样做。

单击顶部时看起来很好,因为递增的y值self.y为零。另请注意,单击窗口越远,步进越夸张。

将运行代码更改为您发布的代码,它应该可以正常工作。