Я работаю над Игра жизни Конвея в настоящее время и застрял. Мой код не работает.
Когда я запускаю свой код в графическом интерфейсе, он говорит:
[[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", это правильный способ сделать это?
Вы можете быстрее получить помощь, если объясните, в чем именно вы «застряли».
@EBGreen Я думал о том же. Что не работает так, как вы ожидаете, и как вы ожидаете, что это будет работать?






Беглый взгляд показывает, что ваши индексы 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 имеет несколько строк, в которых вы хотите присвоить значение чему-либо (то есть '='), но вместо этого вы используете '=='.
извините за мой английский .. я не совсем понимаю .. но, кажется, вы правы (чувствуя :) но что мне делать? спасибо
Большое спасибо! :) но после того, как я добавлю соседи = 0, хотя код работает без ошибок, но он не превращается в то, что я хочу .. (только что показан массив, который дал тестовый код), это что-то не так с параметрами (соседи ) в функции apply_rules?
Это крайне низкосортный ленивый вопрос, но ваша функция number_neighbours не работает, она дважды проверяет universe_array [iy, ix-1] (и, следовательно, пропускает проверку, которую она должна делать).
Эээ ... Не знаю, будет ли это вопрос ленивый для новичка. Я думаю, это может быть немного сурово.
Я думаю, что это тоже может быть так, но по определению все выходит за рамки набора навыков новичка. Расширяя свой набор навыков, вы перестаете быть новичком.
спасибо EB Green, и я не просто скопировал и вставил код ... я написал его сам с небольшой помощью моего друга.
В тот момент, когда я ответил на вопрос, он не содержал никаких подробностей о том, что не удалось - в основном говорилось: «Это не работает, пожалуйста, проверьте это».
Вы пытаетесь увеличить переменную, которая еще не существует. Python не может увеличивать что-либо, если не знает, что это такое. Попробуйте добавить следующую строку в верхней части функции def number_neighbours.
neighbours = 0
но после того, как я добавлю соседи = 0, хотя код работает без ошибок, но он не превращается в то, что я хочу ... (только что показан массив, который дал тестовый код), это что-то не так с параметрами (соседями) в функции apply_rules? большое тебе спасибо:)
Что ж, я полагаю, что вы также новичок в программировании как таковой, иначе у вас не должно возникнуть проблем с интерпретацией этого простого сообщения об ошибке.
Я помогу вам его разобрать:
number_neighboursneighbours+=1UnboundLocalError: local variable 'neighbours' referenced before assignmentЧто это значит? Посмотрим, что делает оператор +=: он что-то добавляет к текущему значению neighbours. Это означает, что он считывает текущее значение, что-то добавляет к нему и, наконец, сохраняет обратно. «Чтение» называется «эталонным» по отношению к переменным.
Какова текущая стоимость neighbours? Что ж, он никогда раньше не использовался, поэтому он не имеет никакого значения - ему никогда не было присвоено значение. Добавлять что-то к «бесполезному» - неразумный поступок. Я предполагаю, что вы ожидаете, что он будет иметь значение 0, но вы должны сообщить это своему интерпретатору. Для этого в начале функции добавьте следующий оператор: neighbours = 0
но после того, как я добавлю соседи = 0, хотя код работает без ошибок, но он не превращается в то, что я хочу ... (только что показан массив, который дал тестовый код), это что-то не так с параметрами (соседями) в функции apply_rules? Большое спасибо за терпеливый и умелый ответ.
Еще одна вещь, которая бросается в глаза, - это то, что вы не смотрите на полный диапазон в apply_rules. Массивы начинают свой индекс с 0, поэтому вы должны использовать range (0, height-1). Вы также должны проверить, есть ли у вас крайняя ячейка в number_neighbours.
@Harleqin: диапазон правильный, если границы игнорируются, но присутствуют, так что код подсчета соседей не должен обрабатывать крайние случаи. вы на самом деле играете 2x2 Life.
Если границы игнорируются, это должен быть диапазон (1, высота-2), нет?
код должен быть с отступом и разделен линией пробела для форматирования