约翰·何顿·康威发明的“生命游戏”(Game of Life)。“生命游戏”是一种零玩家游戏,展示了一种基于简单规则的细胞自动机。游戏在一个无限的二维网格上进行,每个格子代表一个“细胞”,它可能“死”状态。
游戏规则如下:
1. 如果一个细胞周围有3个细胞为生(一个细胞周围共有8个细胞),则该细胞为生(即该细胞若原先为死,则转为生,若原先为生,则保持不变)。
2. 如果一个细胞周围有2个细胞为生,则该细胞的生死状态保持不变。
3. 在其它情况下,该细胞为死(即该细胞若原先为生,则转为死,若原先为死,则保持不变)。
项目分析:
1. 设置游戏的宽度和高度:
WIDTH = 60
HEIGHT = 20
这部分代码定义了游戏的宽度和高度,分别为60和20。
2. 生成初始的细胞状态:
nextCells = []
for x in range(WIDTH):
# 创建一个新的表格
column = []
for y in range(HEIGHT):
if random.randint(0, 1) == 0:
# 添加一个活细胞
column.append('#')
else:
column.append(' ')
nextCells.append(column)
这部分代码生成了初始的细胞状态。它遍历了宽度和高度,为每个单元格生成一个随机的状态( '#' 表示活细胞, ' ' 表示死细胞),并将这些状态存储在 nextCells 列表中。
3. 主要循环:
while True:
print('\n\n\n\n\n\n')#在每个步骤之间添加新的换行符
currentCells = copy.deepcopy(nextCells)
#在屏幕上打印当前的单元格内容
for y in range(HEIGHT):
for x in range(WIDTH):
print(currentCells[x][y],end='')#输出中打印出井号(#)或空格
print()#在每行的结尾打印一个换行符
#根据当前步骤的单元格计算下一步的单元格
for x in range(WIDTH):
for y in range(HEIGHT):
#获取邻近坐标
#'% WIDTH' ensures leftCoord is always between 0 and WIDTH - 1
leftCoord = (x - 1)%WIDTH
rightCoord = (x + 1)%WIDTH
aboveCoord = (y - 1))%HEIGHT
belowCoord = (y + 1))%HEIGHT
#统计活着的邻居的数量
numNeighbors = 0
if currentCells[leftCoord][aboveCoord] == '#':
numNeighbors += 1 #左上角邻居是活的
if currentCells[x][aboveCoord] == '#':
numNeighbors += 1 #顶部邻居是活的
if currentCells[rightCoord][aboveCoord] == '#':
numNeighbors += 1 #右上角邻居是活的
if currentCells[leftCoord][y] == ‘#':
numNeighbors +=1 #左边邻居是活的
if currentCells[rightCoord][y] == '#':
numNeighbors +=1 #右边邻居是活的
if currentCells[leftCoord][belowCoord] == '#':
numNeighbors +=1 #底部左侧邻居活着
if currentCells[x][belowCoord] == '#':
numNeighbors += 1 #底部邻居活着
if currentCells[rightCoord][belowCoord] == ‘#’: numNeighbors +=1 #右底部邻居活着
#根据生命游戏的规则设置单元格
if currentCells[x][y] =='#'and (numNeighbors==2 or numNeighbors == 3)
#有 2 或 3 个邻居的活细胞保持存活状
nextCel1s[x][y] = '#':
elif currentCells[×][y]==''and numNeighbors == 3:
#第三行死亡的细胞重生
nextCel1s[×][y] = ‘#'
else:
# 其他的一切我或者保持死亡状态
nextCells[x][y] = ' '
time.sleep(1) #添加一个 1 秒的暂停以减少闪烁
这部分代码是游戏的主要循环。它执行以下操作:
1.打印当前的细胞状态:遍历宽度和高度,打印每个单元格的状态。
2.计算下一步的细胞状态:遍历宽度和高度,根据当前细胞的状态和邻居细胞的状态,计算下一步每个单元格的状态。
2.设置下一步的细胞状态:根据计算的结果,将下一步的细胞状态存储在 nextCells 列表中。
3. 暂停:等待1秒钟,以减少闪烁。
4.循环会一直执行,直到游戏结束。
所有代码如下:
#Conway生命游戏
import random, time, copy
WIDTH=60
HEIGHT = 20
#给细胞创建一个列表
nextCells=[]
for x in range(WIDTH):
#创建一个新的表格
column = []
for y in range(HEIGHT):
if random.randint(0,1) == 0:
#添加一个活细胞
column.append('#')
else:
column.append(' ')#添加一个死细胞
nextCells.append(column)#下一个细胞列表来自column列表
#主要循环
while True:
print('\n\n\n\n\n\n') #在每个步骤之间添加新的换行符
currentCells = copy.deepcopy(nextCells)
#在屏幕上打印当前的单元格内容
for y in range(HEIGHT):
for x in range(WIDTH):
print(currentCells[x][y],end='')#输出中打印出井号(#)或空格
print()#在每行的结尾打印一个换行符
#根据当前步骤的单元格计算下一步的单元格
for x in range(WIDTH):
for y in range(HEIGHT):
#获取邻近坐标
#'% WIDTH' ensures leftCoord is always between 0 and WIDTH - 1
leftCoord = (x - 1)%WIDTH
rightCoord = (x + 1)%WIDTH
aboveCoord = (y - 1))%HEIGHT
belowCoord = (y + 1))%HEIGHT
#统计活着的邻居的数量
numNeighbors = 0
if currentCells[leftCoord][aboveCoord] == '#':
numNeighbors += 1 #左上角邻居是活的
if currentCells[x][aboveCoord] == '#':
numNeighbors += 1 #顶部邻居是活的
if currentCells[rightCoord][aboveCoord] == '#':
numNeighbors += 1 #右上角邻居是活的
if currentCells[leftCoord][y] == ‘#':
numNeighbors +=1 #左边邻居是活的
if currentCells[rightCoord][y] == '#':
numNeighbors +=1 #右边邻居是活的
if currentCells[leftCoord][belowCoord] == '#':
numNeighbors +=1 #底部左侧邻居活着
if currentCells[x][belowCoord] == '#':
numNeighbors += 1 #底部邻居活着
if currentCells[rightCoord][belowCoord] == ‘#’: numNeighbors +=1 #右底部邻居活着
#根据生命游戏的规则设置单元格
if currentCells[x][y] =='#'and (numNeighbors==2 or numNeighbors == 3)
#有 2 或 3 个邻居的活细胞保持存活状
nextCel1s[x][y] = '#':
elif currentCells[×][y]==''and numNeighbors == 3:
#第三行死亡的细胞重生
nextCel1s[×][y] = ‘#'
else:
# 其他的一切我或者保持死亡状态
nextCells[x][y] = ' '
time.sleep(1) #添加一个 1 秒的暂停以减少闪烁
创作不易,点个小赞再走呗,谢谢