#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. Конечно! Я знал, что это что-то глупо простое. Я отредактировал его так, как вы сказали, и он отлично работает. Спасибо!