[英]Python implementation of Conway's Game of Life
出於學習目的,我開始創建Conway的《人生游戲》的實現。 我使用numpy來存儲大數組,處理死細胞和活細胞,然后遵循Conway的規則來創建細胞生命機制。 為了管理網格和圖形,我使用了pygame模塊。 經過多次審查,並以多種方式重寫了代碼,我無法找出問題出在哪里,所以我決定問您。 例如,我嘗試制作滑翔機(如代碼所示),但他在3個循環周期后死亡。 謝謝您的幫助和提示。 你能幫我找出為什么細胞不繁殖嗎? 提前致謝。 碼:
import pygame
import numpy as np
BLACK = (0, 0, 0)
GREEN = (0, 255, 0)
N = 195
WIDTH = 10
HEIGHT = 10
grid = np.zeros(shape=(N, N), dtype=np.int32)
glider = np.array([[0, 0, 1],
[1, 0, 1],
[0, 1, 1]])
grid[3:6, 3:6] = glider
pygame.init()
WINDOW_SIZE = [980, 980]
screen = pygame.display.set_mode(WINDOW_SIZE)
pygame.display.set_caption("GAME OF LIFE")
done = False
clock = pygame.time.Clock()
while not done:
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
for row in range(N):
for column in range(N):
color = BLACK
if grid[row][column] == 1:
color = GREEN
pygame.draw.rect(screen, color,
[WIDTH * column,
HEIGHT * row,
WIDTH,
HEIGHT])
newGrid = grid.copy()
for i in range(N):
for j in range(N):
total = grid[(i-1) % N:(i+1) % N, (j-1) % N:(j+1) % N].sum() - grid[i, j]
if grid[i, j] == 1:
if(total < 2) or (total > 3):
newGrid[i, j] = 0
else:
if total == 3:
newGrid[i, j] = 1
grid = newGrid
clock.tick(60)
pygame.display.flip()
pygame.quit()
我認為您在實施Conway規則時會遇到一些細微的錯誤。 有關詳細信息,請參見代碼中的注釋:
for i in range(N):
for j in range(N):
# I changed the range of the extent of the sum, note +2 rather than +1 !
total = grid[(i-1) % N:(i+2) % N, (j-1) % N:(j+2) % N].sum() - grid[i, j]
if grid[i, j] == 1:
if(total < 2) or (total > 3):
newGrid[i, j] = 0
# allow for survival in case of total = 2 or 3 (this could be dropped though)
else:
newGrid[i, j] = 1
# allow for reproduction if cell is empty
else:
if total == 3:
newGrid[i, j] = 1
通過這些編輯,滑翔機應滑行:)
可能newGrid循環中的else子句縮進了嗎? 因為到目前為止,網格僅從1變為0,從不從0變為1。這可能是由於數組切片:[(i-1)%n:(i + 1)%n]。 有兩個問題:
這是一個把戲
a.take(range(-1,2),mode='wrap', axis=0).take(range(-1,2),mode='wrap',axis=1)
從這篇文章中將切片環繞在numpy中的2D數組的邊緣 。 我已使用此技巧修改了以下代碼。
import pygame
import numpy as np
BLACK = (0, 0, 0)
GREEN = (0, 255, 0)
N = 195
WIDTH = 10
HEIGHT = 10
grid = np.zeros(shape=(N, N), dtype=np.int32)
glider = np.array([[0, 0, 1],
[1, 0, 1],
[0, 1, 1]])
grid[3:6, 3:6] = glider
pygame.init()
WINDOW_SIZE = [980, 980]
screen = pygame.display.set_mode(WINDOW_SIZE)
pygame.display.set_caption("GAME OF LIFE")
done = False
clock = pygame.time.Clock()
while not done:
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
for row in range(N):
for column in range(N):
color = BLACK
if grid[row][column] == 1:
color = GREEN
pygame.draw.rect(screen, color,
[WIDTH * column,
HEIGHT * row,
WIDTH,
HEIGHT])
newGrid = grid.copy()
for i in range(N):
for j in range(N):
total = grid.take(range(i-1,i+2),mode='wrap', axis=0).take(range(j-1,j+2),mode='wrap',axis=1).sum() - grid[i, j]
if grid[i, j] == 1:
if(total < 2) or (total > 3):
newGrid[i, j] = 0
else:
if total == 3:
newGrid[i, j] = 1
grid = newGrid
clock.tick(60)
pygame.display.flip()
pygame.quit()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.