Проблема с Python-реализацией Conway's Game of Life

Я сейчас работаю над игрой жизни Конвея и застрял. Мой код не работает.

Когда я запускаю свой код в графическом интерфейсе, он говорит:

 
[[0 0 0 0]
 [0 1 1 0]
 [0 1 0 0]
 [0 0 0 0]]

Traceback (последний вызов был последним):
  Файл "C: \ Users \ Documents \ Physics \ Python \ MainProject \ conway.py", строка 53, в 
    b = apply_rules (a)
  Файл "C: \ Users \ Documents \ Physics \ Python \ MainProject \ conway.py", строка 14, в apply_rules
    соседи = number_neighbours (universe_array, гу, IX)
  Файл "C: \ Users \ Documents \ Physics \ Python \ MainProject \ conway.py", строка 36, в число_соседей
    соседи + = 1
UnboundLocalError: локальная переменная «соседи», на которую ссылаются до назначения

Вот мой код:

'''If a cell is dead at time T with exactly three live neighbours, the cell will be alive at T+1
If a cell is alive at time T with less than two living neighbours it dies at T+1
If a cell is alive at time T with more than three live neighbours it dies at T+1
If a cell is alive at time T with exactly two or three live neighbours it remains alive at T+1'''
import numpy


def apply_rules (universe_array):
    height, width = universe_array.shape
    # create a new array for t+1
    evolved_array = numpy.zeros((height, width),numpy.uint8)
    for iy in range(1, height-1):
        for ix in range(1,width-1):
            neighbours=number_neighbours(universe_array,iy,ix)
            if universe_array[iy,ix]==0 and neighbours==3:
                evolved_array[iy,ix]==1
            elif universe_array[iy,ix]==1 and neighbours<2:
                evolved_array[iy,ix]==0
            elif universe_array[iy,ix]==1 and neighbours>3:
                evolved_array[iy,ix]==0
            elif universe_array[iy,ix]==1 and neighbours==2 or neighbours==3:
                evolved_array[iy,ix]=universe_array[iy,ix]

    return evolved_array

def number_neighbours(universe_array,iy,ix):
    neighbours=0 #fixed this line,thanks:)
    if universe_array[iy-1,ix-1]==1:
            neighbours+=1
    if universe_array[iy,ix-1]==1:
            neighbours+=1
    if universe_array[iy+1,ix-1]==1:
            neighbours+=1
    if universe_array[iy-1,ix]==1:
            neighbours+=1
    if universe_array[iy+1,ix]==1:
            neighbours+=1
    if universe_array[iy-1,ix+1]==1:
            neighbours+=1
    if universe_array[iy,ix+1]==1:
            neighbours+=1
    if universe_array[iy+1,ix+1]==1:
            neighbours+=1
    else:
        neighbours=neighbours
    return neighbours

if __name__ == "__main__":
    a = numpy.zeros((4,4),numpy.uint8)
    a[1,1]=1
    a[1,2]=1
    a[2,1]=1
    print a
    b= apply_rules(a)
    print b

Я новичок в Python, и я не знаю, как исправить ошибку. Я немного смущен о import "neighbours"к function "apply_rules", является то , что правильный способ сделать это?

10.12.2008 23:17:02
код должен быть с отступом и разделен пробелом для форматирования
Jimmy 10.12.2008 23:19:15
Вы можете получить более быструю помощь, если точно объясните, как вы «застряли».
EBGreen 10.12.2008 23:20:29
@EBGreen Я думал о том же. Что не работает, как вы ожидаете, и как вы ожидаете, что это будет работать?
UnkwnTech 10.12.2008 23:21:44
4 ОТВЕТА
РЕШЕНИЕ

Ну, я думаю , что вы также совершенно новые для программирования самих по себе , в противном случае вы не должны иметь какие - либо проблем в интерпретации , что простое сообщение об ошибке.

Я помогу вам разобрать это:

  • Сначала отображаются все «текущие» номера строк файлов вашего проекта в порядке вызова.
  • Затем он показывает вам функцию, в которой произошла ошибка: number_neighbours
  • Затем он показывает вам содержимое строки, содержащей ошибку: neighbours+=1
  • Наконец, он говорит вам, что проблема с этой строкой: UnboundLocalError: local variable 'neighbours' referenced before assignment

Теперь, что это значит? Давайте посмотрим, что +=делает оператор: он добавляет что-то к текущему значению neighbours. Это означает, что он читает текущее значение, добавляет к нему что-то и, наконец, сохраняет его обратно. «Чтение» называется «ссылкой» по отношению к переменным.

Какова текущая стоимость neighbours? Ну, он никогда не использовался раньше, поэтому он не имеет никакого значения - ему никогда не назначалось значение. Добавление чего-либо к «никакой ценности» не является разумной вещью. Я предполагаю, что вы ожидаете, что он будет иметь значение 0, но вы должны сообщить об этом своему переводчику. Для этого добавьте следующий оператор в начале своей функции: neighbours = 0

13
10.12.2008 23:51:46
но после того, как я добавлю соседей = 0, хотя код работает без ошибок, но он не превращается в то, что я хочу .. (только что показал массив, который дал тестовый код), это что-то не так с параметрами (соседями) в функции apply_rules? Большое спасибо за терпение и умелый ответ.
NONEenglisher 10.12.2008 23:57:11
Еще одна вещь, которая бросается в глаза, это то, что вы не смотрите на весь диапазон в apply_rules. Массивы начинают свой индекс с 0, поэтому вы должны использовать 'range (0, height-1)'. Вы также должны проверить, есть ли у вас граничная ячейка в number_neighbours.
Svante 11.12.2008 00:21:16
@Harleqin: диапазон правильный, если границы игнорируются, но присутствуют, так что код подсчета соседей не должен обрабатывать крайние случаи. вы на самом деле играете 2x2 Life, хотя.
Jimmy 11.12.2008 01:10:55
Если границы следует игнорировать, это должно быть «range (1, height-2)», нет?
Svante 11.12.2008 02:27:12

Беглый взгляд показывает, что ваши number_neighborsиндексы выключены.

Кроме того, вы никогда не инициализируете neighbors.

Ответ на комментарий:

def number_neighbours(universe_array,iy,ix):
    if universe_array[iy,ix-1]==1:
        neighbours+=1
    if universe_array[iy,ix-1]==1:
        neighbours+=1
    if universe_array[iy+1,ix-1]==1:
        neighbours+=1

Вы говорите, neighbors +=1что означает добавить 1 к neighbors, но вы никогда не указывали начинать с 0, поэтому он не знает, к чему добавить 1.

Также обратите внимание, что первая и третья строки абсолютно одинаковы. Я уверен, что это не то, что вы хотели. Вот что я имел в виду под "ваши индексы выключены".

Ответ на комментарий 2: apply_rules имеет несколько строк, в которых вы хотите присвоить значение чему-либо (то есть '='), но вместо этого вы используете '=='.

2
14.09.2010 21:05:40
извините за мой английский .. я не совсем понимаю .. но, кажется, вы правы (чувствуя
NONEenglisher 10.12.2008 23:35:10
спасибо большое! :) но после того, как я добавлю соседей = 0, хотя код работает без ошибок, но он не превращается в то, что я хочу .. (только что показал массив, который дал тестовый код), что-то не так с параметрами (соседями ) в функции apply_rules?
NONEenglisher 10.12.2008 23:52:20

Это крайне низкокачественный ленивый вопрос, но ваша функция number_neighbours не работает, она дважды проверяет universe_array [iy, ix-1] (и, следовательно, пропускает проверку, которую следует выполнять).

0
10.12.2008 23:24:28
Эхх ... Я не знаю, что это будет ленивый вопрос для новичка. Я думаю, что это может быть немного резким.
EBGreen 10.12.2008 23:28:34
Я думаю, что это также может иметь место, но по определению, все выходит за рамки навыков новичка. Расширение ваших навыков - это то, как вы перестаете быть новичком.
EBGreen 10.12.2008 23:41:56
спасибо EBGreen, и я не просто скопировал и вставил код ... я написал его самостоятельно с небольшим количеством подсказок от моего друга.
NONEenglisher 10.12.2008 23:47:21
В тот момент, когда я ответил на вопрос, в нем не было никаких подробностей о том, что не получалось - в основном говорилось «это не работает, пожалуйста, проверьте это»
Will Dean 11.12.2008 14:20:51

Вы пытаетесь увеличить переменную, которая еще не существует. Python не может увеличивать что-либо, если он не знает, что это такое. Попробуйте добавить следующую строку вверху вашей функции def number_neighbours.

neighbours = 0
3
10.12.2008 23:39:28
но после того, как я добавлю соседей = 0, хотя код работает без ошибок, но он не превращается в то, что я хочу .. (только что показал массив, который дал тестовый код), это что-то не так с параметрами (соседями) в функции apply_rules? большое спасибо :)
NONEenglisher 10.12.2008 23:52:57