Индекс выходит за пределы диапазона (даже если я установил максимальное значение) - PullRequest
0 голосов
/ 16 марта 2019

Попытка создать игру жизни. При циклическом просмотре списка ячеек я сканирую только (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 будет ячейкой рядом с ней в следующем столбце. Каждая из этих соседних ячеек затем используется путем передачи их в метод «общего количества соседей», и значение соседних значений увеличивается на единицу каждый раз, когда обнаруживается живая ячейка

1 Ответ

1 голос
/ 16 марта 2019

Быстрая попытка, за исключением того, что показал мне, какое значение j приводит к IndexError:

else:
    # debug(cellList,j) #Attempting to debug what's wrong

    try:
        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
    except IndexError as ie:
        print("Index error on j=", j)
        exit()

На 10-м клике я могу воспроизвести проблему. Это ошибка.

Index error on j= 22349

У вас логическая ошибка в вашем коде. Вы должны это исправить. Подсказка: проверьте размер cellList и рассчитайте j+150 (вы подаете его в качестве индекса в список).

...