如何通过python实现小程序:Conway的生命游戏

      约翰·何顿·康威发明的“生命游戏”(Game of Life)。“生命游戏”是一种零玩家游戏,展示了一种基于简单规则的细胞自动机。游戏在一个无限的二维网格上进行,每个格子代表一个“细胞”,它可能“死”状态。

 


游戏规则如下:

1. 如果一个细胞周围有3个细胞为生(一个细胞周围共有8个细胞),则该细胞为生(即该细胞若原先为死,则转为生,若原先为生,则保持不变)。

2. 如果一个细胞周围有2个细胞为生,则该细胞的生死状态保持不变。

3. 在其它情况下,该细胞为死(即该细胞若原先为生,则转为死,若原先为死,则保持不变)。


效果展示如何通过python实现小程序:Conway的生命游戏_第1张图片

 


项目分析:



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 秒的暂停以减少闪烁


创作不易,点个小赞再走呗,谢谢

你可能感兴趣的:(python,游戏,pygame)