【问题标题】:Conway's game of life list index error康威生命游戏列表索引错误
【发布时间】:2016-11-28 23:40:26
【问题描述】:

所以我正在尝试在 Python/pygame 中制作 Conway 的生活游戏,并且制作新网格的第一次迭代可以工作,但由于列表索引超出范围错误,第二次不会。我一直试图找出问题所在,但列表索引不应该超出范围。这是我的代码,错误应该在changevalue(),但我怀疑不是,因为第一次迭代有效:

import pygame
import random

width = 400
height = 400
blocksize = 10

white = (255, 255, 255)
black = (0, 0, 0)

visual = pygame.display.set_mode((width, height))
clock = pygame.time.Clock()

IsOn = True

grid = []
templist = []
tempgrid = []
class square(object):
    def __init__(self, x, y, alive):
        self.x = x
        self.y = y
        self.alive = alive

for y in range(height/blocksize):
    templist = []
    for x in range(width/blocksize):
        templist.append(square(x, y, random.choice([True, False, False, False])))
    grid.append(templist)

def changevalue(cx, cy, cgrid):
    neighbours = []
    for dy in range(3):
        ddy = dy - 1
        for dx in range(3):
            ddx = dx - 1
            if not (dx - 1 == 0 and dy - 1 == 0):
                #print cgrid[(cy + ddy)%len(cgrid)][(cx + ddx)%len(cgrid[y])].alive
                    #NO ERRORS
                #print len(cgrid) > (cy + ddy)%len(cgrid), len(cgrid[y]) > (cx + ddx)%len(cgrid[cy])
                    #NO ERRORS
                neighbours.append(cgrid[(cy + ddy)%len(cgrid)][(cx + ddx)%len(cgrid[cy])].alive)
    return len(filter(lambda p: p == True, neighbours))

while IsOn:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            IsOn = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_c:
                proceed = True

    tempgrid = []
    for times in range(len(grid)):
        tempgrid.append([])
    for ty in range(len(grid)):
        for tx in range(len(grid[ty])):
            if changevalue(tx, ty, grid) < 2 and grid[ty][tx].alive == True:
                tempgrid[ty].append(square(tx, ty, False))
            elif changevalue(tx, ty, grid) > 3 and grid[ty][tx].alive == True:
                tempgrid[ty].append(square(tx, ty, False))
            elif changevalue(tx, ty, grid) == 3 and grid[ty][tx].alive == False:
                tempgrid[ty].append(square(tx, ty, True))

    grid = list(tempgrid)

    visual.fill(white)
    for y in range(len(grid)):
        for x in range(len(grid[y])):
            if grid[y][x].alive == True:
                pygame.draw.rect(visual, black, (grid[y][x].x*blocksize, grid[y][x].y*blocksize, blocksize, blocksize))
    pygame.display.update()
    clock.tick(2)

pygame.quit()
quit()

感谢您的帮助!

【问题讨论】:

  • while isOn代码块执行一次之后,游戏的“第二次迭代”是否开始?
  • 无法运行您的代码,因为NameError: name 'wait' is not defined
  • @martineau,对不起,我会把它从代码中删除
  • @Sunny Patel,是的,它开始了

标签: python pygame


【解决方案1】:

您不会复制不会改变值的正方形 - 因此新行具有不同的长度 - 后来您遇到index 的问题

你需要这样的东西

if changevalue ...:
   ...
elif changevalue ...:
   ...
elif changevalue ...:
   ... 
else:
   # copy other elements
   tempgrid[ty].append(grid[ty][tx])

【讨论】:

    猜你喜欢
    • 2013-02-21
    • 1970-01-01
    • 2023-03-09
    • 2010-09-07
    • 2017-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多