问题描述
我是 python 和 PyGame 的新手,想通过做我认为是一个简单的项目来获得一些经验。我不知道我的错误是在我的游戏逻辑中还是在我的 PyGame 打印中。我创建了两个函数,一个用随机值填充网格,另一个用“Blinker”填充网格。程序运行没有错误,但是没有遵守游戏规则。例如,当设置了“blinker”时,程序的第二帧清除屏幕而不是旋转“blinker”。 任何诊断此问题的帮助将不胜感激!
import pygame
import random
pygame.init()
# Colors
BLACK = (0,0)
WHITE = (255,255,255)
# Sizes
size = (600,600)
width = 20
height = 20
margin = 1
x_size = 600 / width
y_size = 600 / height
def init_grid():
return [[0 for x in range(x_size)] for y in range(y_size)]
def make_spinner(grind):
grid[0][0] = 1
grid[10][10] = 1
grid[10][11] = 1
grid[10][12] = 1
def random_grid(grid):
for x in range(x_size):
for y in range(y_size):
grid[x][y] = random.randint(0,1)
def print_grid(screen,grid):
for x in range(x_size):
for y in range(y_size):
if grid[x][y] == 1:
pygame.draw.rect(
screen,BLACK,(x * width,y * height,width,height))
else:
pygame.draw.rect(
screen,height),margin)
def count_neighbours(grid,x,y):
count = 0
for i in range(-1,1):
for j in range(-1,1):
count += grid[x + i][y + j]
return count - grid[x][y]
def update_grid(grid):
next_grid = init_grid()
for x in range(x_size):
for y in range(y_size):
if x == 0 or x == x_size - 1 or y == 0 or y == y_size - 1:
next_grid[x][y] = 0
else:
count = count_neighbours(grid,y)
value = grid[x][y]
if value == 1 and (count == 2 or count == 3):
next_grid[x][y] = 1
elif value == 0 and count == 3:
next_grid[x][y] = 1
else:
next_grid[x][y] = 0
return next_grid
# Initialise game engine
screen = pygame.display.set_mode(size)
pygame.display.set_caption("The Game of Life")
running = True
clock = pygame.time.Clock()
grid = init_grid()
# random_grid(grid)
make_spinner(grid)
# Game loop
while running:
# Check for exit
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
screen.fill(WHITE)
print_grid(screen,grid)
next_grid = update_grid(grid)
pygame.display.update()
grid = next_grid
clock.tick(2)
pygame.quit()
解决方法
您的 count_neighbors 函数不会迭代正确的单元格。 range(-1,1)
迭代 {-1,0}
not {-1,1}
。
改为使用:
def count_neighbours(grid,x,y):
count = 0
for i in range(-1,2):
for j in range(-1,2):
count += grid[x + i][y + j]
return count - grid[x][y]