Python 康威';s Game of life pygame实现不使用网格副本,不使用numpy
我正在尝试使用pygame在python中实现Conway的生活游戏。然而,主循环中每个单元的计算似乎都有问题。为了确保每次计算同时完成,我创建了一个网格副本,并在该网格上进行了计算。然而,这个程序不起作用,我也弄不明白。这是我的密码副本Python 康威';s Game of life pygame实现不使用网格副本,不使用numpy,python,pygame,Python,Pygame,我正在尝试使用pygame在python中实现Conway的生活游戏。然而,主循环中每个单元的计算似乎都有问题。为了确保每次计算同时完成,我创建了一个网格副本,并在该网格上进行了计算。然而,这个程序不起作用,我也弄不明白。这是我的密码副本 import pygame import time def create_grid(ROWS, COLS, SCREEN): """Creates a grid, sets all values to 0""" assert ROWS >
import pygame
import time
def create_grid(ROWS, COLS, SCREEN):
"""Creates a grid, sets all values to 0"""
assert ROWS > 0, "ROWS must be greater than 0"
assert COLS > 0, "COLS must be greater than 0"
grid = []
for i in range(ROWS):
grid.append([])
for j in range(COLS):
grid[i].append(0)
return grid
pygame.init()
#SCREEN setup
ScreenHeight = 700
ScreenWidth = 700
SCREEN_COLOR = (20, 20, 20)
SCREEN = pygame.display.set_mode((ScreenWidth, ScreenHeight)) #Create Screen
SCREEN.fill(SCREEN_COLOR)
#Number of ROWS and COLUMNS
ROWS = 30
COLS = 40
#How far will the next cube be placed
SQUARESTEPY = ScreenWidth / ROWS
SQUARESTEPX = ScreenWidth / COLS
GREY = (70, 70, 70)
WHITE = (255, 255, 255)
#draw grid
grid = create_grid(ROWS, COLS, SCREEN)
# grid[0][0] = 1
# grid[1][0] = 1
# grid[0][1] = 1
while True:
#create a copy of the grid to calculate the condition of all cells at the same time
copy_of_grid = grid[:]
for ev in pygame.event.get():
#Quit the game
if ev.type == pygame.QUIT:
pygame.quit()
#if mouse click draws or erases a cell
if pygame.MOUSEBUTTONDOWN == ev.type:
posX, posY = pygame.mouse.get_pos()
print(posX, posY)
posX, posY = int(posX / SQUARESTEPX), int(posY / SQUARESTEPY)
grid[posY][posX] = 1 - grid[posY][posX]
#calculate conway's rules and draw each cell
for y in range(ROWS):
for x in range(COLS):
neighbors = copy_of_grid[(y - 1) % ROWS][(x - 1) % COLS] + \
copy_of_grid[y % ROWS][(x - 1) % COLS] + \
copy_of_grid[(y + 1) % ROWS][(x - 1) % COLS] + \
copy_of_grid[(y - 1) % ROWS][x % COLS] + \
copy_of_grid[(y + 1) % ROWS][x % COLS] + \
copy_of_grid[(y - 1) % ROWS][(x + 1) % COLS] + \
copy_of_grid[y % ROWS][(x + 1) % COLS] + \
copy_of_grid[(y + 1) % ROWS][(x + 1) % COLS]
#print(x, y, "neighbors: {}, ON: {}".format(neighbors, grid[y][x]))
#A dead cell surrounded by exactly 3 cells will revive
if copy_of_grid[y][x] == 0 and (neighbors == 3 or neighbors == 2):
grid[y][x] = 1
#A living cell surrounded by less than 2 or more than 3 neighbors wil die
elif grid[y][x] == 1 and (neighbors < 2 or neighbors > 3):
grid[y][x] = 0
#paint
if grid[y][x] == 1:
pygame.draw.rect(SCREEN, WHITE, (SQUARESTEPX * x, SQUARESTEPY * y, SQUARESTEPX, SQUARESTEPY))
else:
pygame.draw.rect(SCREEN, SCREEN_COLOR , (SQUARESTEPX * x, SQUARESTEPY * y, SQUARESTEPX, SQUARESTEPY))
pygame.display.flip()
time.sleep(0.1)
pygame.quit()
导入pygame
导入时间
def创建网格(行、列、屏幕):
“”“创建网格,将所有值设置为0”“”
断言行>0,“行必须大于0”
断言COLS>0,“COLS必须大于0”
网格=[]
对于范围内的i(行):
grid.append([])
对于范围内的j(COLS):
网格[i]。追加(0)
回流栅
pygame.init()
#屏幕设置
屏幕高度=700
屏幕宽度=700
屏幕颜色=(20,20,20)
SCREEN=pygame.display.set_模式((屏幕宽度,屏幕高度))35;创建屏幕
屏幕填充(屏幕颜色)
#行数和列数
行数=30
科尔斯=40
#下一个立方体将放置多远
SQUARESTEPY=屏幕宽度/行数
SQUARESTEPX=屏幕宽度/列
灰色=(70,70,70)
白色=(255,255,255)
#绘制网格
网格=创建网格(行、列、屏幕)
#网格[0][0]=1
#网格[1][0]=1
#网格[0][1]=1
尽管如此:
#创建网格副本以同时计算所有单元格的条件
复制网格的网格=网格[:]
对于pygame.event.get()中的ev:
#退出游戏
如果ev.type==pygame.QUIT:
pygame.quit()
#如果鼠标单击绘制或删除单元格
如果pygame.MOUSEBUTTONDOWN==ev.type:
posX,posY=pygame.mouse.get_pos()
打印(posX、posY)
posX,posY=int(posX/SQUARESTEPX),int(posY/SQUARESTEPY)
grid[posY][posX]=1-grid[posY][posX]
#计算康威规则并绘制每个单元格
对于范围内的y(行):
对于范围内的x(COLS):
邻居=复制网格[(y-1)%ROWS][(x-1)%COLS]+\
复制网格[y%行][(x-1)%COLS]+\
复制网格[(y+1)%ROWS][(x-1)%COLS]+\
复制网格[(y-1)%ROWS][x%COLS]+\
复制网格[(y+1)%ROWS][x%COLS]+\
复制网格[(y-1)%ROWS][(x+1)%COLS]+\
复制网格[y%行][(x+1)%COLS]+\
复制网格[(y+1)%ROWS][(x+1)%COLS]的\u
#打印(x,y,“邻居:{},在:{}上)。格式(邻居,网格[y][x]))
#一个死掉的细胞被3个细胞包围会复活
如果复制网格[y][x]=0和(邻居==3或邻居==2):
网格[y][x]=1
#被不到2个或3个以上邻居包围的活细胞将死亡
elif网格[y][x]==1和(邻域<2或邻域>3):
网格[y][x]=0
#油漆
如果网格[y][x]==1:
pygame.draw.rect(屏幕,白色,(SQUARESTEPX*x,SQUARESTEPY*y,SQUARESTEPX,SQUARESTEPY))
其他:
pygame.draw.rect(屏幕,屏幕颜色,(SQUARESTEPX*x,SQUARESTEPY*y,SQUARESTEPX,SQUARESTEPY))
pygame.display.flip()
睡眠时间(0.1)
pygame.quit()
复制网格=网格[:]
不是网格的副本。它是外部列表的浅拷贝(请参阅)。但是列表copy\u of_grid
中的元素仍然与列表grid
中的元素相同必须在循环中复制嵌套列表:
copy\u of_grid=[]
对于网格中的行:
复制\u网格的\u.append(第[:]行)