Попытка создать игру жизни. При циклическом просмотре списка ячеек я сканирую только (abs (1-j)) или задаю максимальное значение j, чтобы оно не превышало количество ячеек в программе. Вот мой код:
from graphics import * #Using zelle graphics module for Python
S=20 #Size of each cell. The bigger the number the bigger it is
class Cell: #Cell is a rectangular box. Can be alive or dead
def __init__(self,window,x,y,alive):
self.window=window
self.alive=alive
self.x=x
self.y=y
self.rectangle=Rectangle(Point(x*S,(y*S)+S),Point((x*S)+S,y*S))
self.draw(x,y,self.window)
def __str__(self):
return str(self.getX())+" "+str(self.getY())
def draw(self,x,y,window):
self.rectangle.setFill("black")
self.rectangle.draw(window)
def getX(self):
return self.x*S
def getY(self):
return self.y*S+S
def die(self):
self.rectangle.setFill("black")
self.alive=False
def becomeAlive(self,window):
self.rectangle.setFill("white")
self.alive=True
def isAlive(self):
return self.alive
def clickedOn(self,mouseX,mouseY):
if (mouseX>self.getX() and mouseX<self.getX()+S and mouseY<self.getY()+S and mouseY<self.getY()):
return True
else:
return False
def totalNeighbours(self,cell0,cell1,cell2,cell3,cell4,cell5,cell6,cell7):
localNeighbourhood=[cell0,cell1,cell2,cell3,cell4,cell5,cell6,cell7]
livingNeigbour=0
for cell in localNeighbourhood:
if cell.isAlive():
livingNeigbour+=1
return livingNeigbour
def createGraphics():
win=GraphWin("Game of Life!",1000,1000)
return win
def createGrid(window): #Creating the grid of cell objects
cellList=[]
for x in range(150):
for y in range(150):
cell=Cell(window,x,y,alive=False)
cellList.append(cell)
for i in range(10):
getM=window.getMouse()
j=0
for cells in cellList:
if cellList[j].clickedOn(getM.getX(),getM.getY()): #Checking whether the cell has been clicked.
cellList[j].becomeAlive(window)
break
else:
j=j+1
return cellList
def runSimulation(window,cellList):
j=0
for cell in cellList:
if cell.isAlive():
while j<849: #Making sure j+150 doesn't go above 1000 or the program will crash
if cell.totalNeighbours(cellList[abs(j-1)],cellList[j+1],cellList[j+150]
,cellList[abs(j-150)],cellList[j+151],cellList[abs(j-149)],cellList[j+149],cellList[abs(j-151)])>3:
cellList[j].die()
if cell.totalNeighbours(cellList[j-1],cellList[j+1],cellList[j+150]
,cellList[abs(j-150)],cellList[j+151],cellList[abs(j-149)],cellList[j+149],cellList[abs(j-151)])==3:
pass
if cell.totalNeighbours(cellList[j-1],cellList[j+1],cellList[j+150]
,cellList[abs(j-150)],cellList[j+151],cellList[abs(j-149)],cellList[j+149],cellList[abs(j-151)])==2:
pass
if cell.totalNeighbours(cellList[j-1],cellList[j+1],cellList[j+150]
,cellList[abs(j-150)],cellList[j+151],cellList[abs(j-149)],cellList[j+149],cellList[abs(j-151)])<2:
cellList[j].die()
j=j+1
#debug(cellList,j)
else:
#debug(cellList,j) #Attempting to debug what's wrong
if cell.totalNeighbours(cellList[abs(j-1)],cellList[j+1],cellList[j+150]
,cellList[abs(j-150)],cellList[j+151],cellList[abs(j-149)],cellList[j+149],cellList[abs(j-151)])==3:
cell[j].becomeAlive()
if cell.totalNeighbours(cellList[abs(j-1)],cellList[j+1],cellList[j+150]
,cellList[abs(j-150)],cellList[j+151],cellList[abs(j-149)],cellList[j+149],cellList[abs(j-151)])==2:
cell[j].becomeAlive()
j=j+1
def main():
window=createGraphics()
cellList=createGrid(window)
runSimulation(window,cellList)
def debug(cellList,j):
print(j)
main()
Так почему мой «индекс» находится вне диапазона? В чем тут логика? Я использую графику Zelle Python для моей программы.
Редактировать: В функции runSimulation он проходит по всем ячейкам в списке и возвращает всех своих непосредственных соседей. Это делается путем передачи j + 1, j-1, j + 150 и т. Д. ... в totalNeighbours в классе ячеек. j + 1, например, будет ячейкой под ней, j-1 будет ячейкой сверху, j + 150 будет ячейкой рядом с ней в следующем столбце. Каждая из этих соседних ячеек затем используется путем передачи их в метод «общего количества соседей», и значение соседних значений увеличивается на единицу каждый раз, когда обнаруживается живая ячейка