Проблема с реализацией Python игры Конвея "Игра жизни"

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

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

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

Traceback (most recent call last):
  File "C:\Users\Documents\Physics\Python\MainProject\conway.py", line 53, in 
    b= apply_rules(a)
  File "C:\Users\Documents\Physics\Python\MainProject\conway.py", line 14, in apply_rules
    neighbours=number_neighbours(universe_array,iy,ix)
  File "C:\Users\Documents\Physics\Python\MainProject\conway.py", line 36, in number_neighbours
    neighbours+=1
UnboundLocalError: local variable 'neighbours' referenced before assignment

Вот мой код:

'''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", это правильный способ сделать это?

код должен быть с отступом и разделен линией пробела для форматирования

Jimmy 11.12.2008 02:19

Вы можете быстрее получить помощь, если объясните, в чем именно вы «застряли».

EBGreen 11.12.2008 02:20

@EBGreen Я думал о том же. Что не работает так, как вы ожидаете, и как вы ожидаете, что это будет работать?

UnkwnTech 11.12.2008 02:21
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
1 571
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Беглый взгляд показывает, что ваши индексы 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 имеет несколько строк, в которых вы хотите присвоить значение чему-либо (то есть '='), но вместо этого вы используете '=='.

извините за мой английский .. я не совсем понимаю .. но, кажется, вы правы (чувствуя :) но что мне делать? спасибо

NONEenglisher 11.12.2008 02:35

Большое спасибо! :) но после того, как я добавлю соседи = 0, хотя код работает без ошибок, но он не превращается в то, что я хочу .. (только что показан массив, который дал тестовый код), это что-то не так с параметрами (соседи ) в функции apply_rules?

NONEenglisher 11.12.2008 02:52

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

Эээ ... Не знаю, будет ли это вопрос ленивый для новичка. Я думаю, это может быть немного сурово.

EBGreen 11.12.2008 02:28

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

EBGreen 11.12.2008 02:41

спасибо EB Green, и я не просто скопировал и вставил код ... я написал его сам с небольшой помощью моего друга.

NONEenglisher 11.12.2008 02:47

В тот момент, когда я ответил на вопрос, он не содержал никаких подробностей о том, что не удалось - в основном говорилось: «Это не работает, пожалуйста, проверьте это».

Will Dean 11.12.2008 17:20

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

neighbours = 0

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

NONEenglisher 11.12.2008 02:52
Ответ принят как подходящий

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

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

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

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

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

но после того, как я добавлю соседи = 0, хотя код работает без ошибок, но он не превращается в то, что я хочу ... (только что показан массив, который дал тестовый код), это что-то не так с параметрами (соседями) в функции apply_rules? Большое спасибо за терпеливый и умелый ответ.

NONEenglisher 11.12.2008 02:57

Еще одна вещь, которая бросается в глаза, - это то, что вы не смотрите на полный диапазон в apply_rules. Массивы начинают свой индекс с 0, поэтому вы должны использовать range (0, height-1). Вы также должны проверить, есть ли у вас крайняя ячейка в number_neighbours.

Svante 11.12.2008 03:21

@Harleqin: диапазон правильный, если границы игнорируются, но присутствуют, так что код подсчета соседей не должен обрабатывать крайние случаи. вы на самом деле играете 2x2 Life.

Jimmy 11.12.2008 04:10

Если границы игнорируются, это должен быть диапазон (1, высота-2), нет?

Svante 11.12.2008 05:27

Другие вопросы по теме