2016-11-28 7 views
0

私はConwayのゲームをPython/pygameで作ろうとしています。新しいグリッドを作った最初の反復はしようとしていますが、リストのインデックスが範囲外です。私は何が間違っているのか把握しようとしていますが、リストのインデックスは範囲外であってはなりません。これは、第1の反復動作するので、間違いがchangevalue()でおそらくですが、私はそれがない疑いが、私のコードです:あなたの助けのためのConwayの人生リスト索引エラーのゲーム

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() 

ありがとう!

+0

が行う「2回目の繰り返しのようなものを必要としindex

に問題があります"while isOn'コードブロックが1回実行された後のゲームの開始の? –

+1

'NameError:name 'wait'が定義されていないため、コードを実行できません。 – martineau

+0

@martineau、残念ながらコードから取り除きます。 – Dennis

答えて

0

あなたが値を変更しない平方コピーしない - ので、新しい行は異なる長さを持っている - と、後であなたがこの

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

ああ、はい!愚かな私、もちろんあなたに感謝! – Dennis

関連する問題