Ошибка поиска соседних ячеек в «Игре жизни» с помощью pygame

#python #pygame

#python #pygame

Вопрос:

Я создаю версию «игры жизни Конвея» на python и pygame, но у меня возникают проблемы с поиском соседних ячеек. Ниже приведена большая часть кода. Я отредактировал ненужные части, потому что проблема связана с функцией cell.get_neighbors(). Если вы хотите увидеть остальное, вы можете прочитать это здесь.

 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, казалось бы, случайных ячеек черными. Я сделал эту запись экрана, чтобы продемонстрировать проблему. Как вы можете видеть, если я нажимаю в верхнем левом углу или вверху, это работает так, как должно, но когда я нажимаю в середине, это делает что-то вроде этого:

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:

В вашем опубликованном коде у вас есть

 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
  

Обратите внимание, как на ваших изображениях переключаемые ячейки, кажется, опускаются вниз. Это связано с тем, что вы изменяете y три раза во внутреннем цикле, прежде чем он будет сброшен на одно из значений [-1, 0, 1] . Запустив только цикл и распечатав значения, вы увидите y изменения во внутреннем цикле, когда этого не должно быть.

При нажатии вверху все выглядит нормально, потому что увеличенное значение y self.y равно нулю. Обратите также внимание, как шаг становится более преувеличенным, чем дальше вы нажимаете на окно.

Измените свой запущенный код на опубликованный вами код, и он должен работать нормально.

Комментарии:

1. Конечно! Я знал, что это что-то глупо простое. Я отредактировал его так, как вы сказали, и он отлично работает. Спасибо!