Python实战:基于Pygame实现康威生命游戏

山海之间
山海之间
发布时间:2026-10-14 | 5人浏览过
原创

本文详细介绍如何使用Python和Pygame库实现康威生命游戏。文章从游戏规则入手,解析了初始化窗口、随机生成初始矩阵、检测周围生命状态及根据规则更新生命状态的核心逻辑。通过完整的代码示例,展示了如何利用二维数组和循环算法模拟生命演化过程,并提供了渲染方格的绘图技巧,适合Python初学者进行游戏开发实战练习。

前言

康威生命游戏的逻辑设计相对直观,本文采用Pygame库负责图形界面的渲染与交互。近期多个游戏项目均基于该库开发,因此实现过程较为顺畅。核心算法部分主要涉及对生命状态的多次迭代计算与判断,并通过刷新数组来呈现动态效果。

一、康威生命游戏规则

游戏遵循以下四条核心规则: 1. 死亡规则(孤独):若一个存活细胞周围存活邻居少于2个(即1个或0个),该细胞因孤独而死亡。 2. 生存规则:若一个存活细胞周围有2个或3个存活邻居,该细胞保持存活状态。 3. 死亡规则(拥挤):若一个存活细胞周围有4个或更多存活邻居,该细胞因过度拥挤而死亡。 4. 繁殖规则:若一个空白网格周围恰好有3个存活邻居,该网格将生成一个新的存活细胞。

二、设计流程

1. 引入库

代码如下(示例):


import sys
import random
import numpy as np
import pygame

2. 设计思路

本文实现了上述规则对应的图形化界面,具体效果可参考文中第一张示意图。

感兴趣的读者可以尝试扩展以下思路:

3. 设计窗口

首先复用之前编写的Pygame窗口初始化代码,实现窗口的调用与显示。与以往不同的是,在展开窗口前需预先确定窗口尺寸。我们实现了游戏网格大小与窗口显示大小的自定义配置,这有助于保持游戏设计与界面美观的一致性。

中间部分的代码主要负责颜色定义及窗口背景的填充处理。


import sys
import random
import numpy as np
import pygame
pygame.init()#初始化init()及设置
n=int(input("请输入阶数:"))
size=width,height=50*n+2,50*n+2
screen=pygame.display.set_mode(size)#窗口大小
pygame.display.set_caption("康威生命游戏")#窗口名字
icon=pygame.image.load("Icon.jpg")
pygame.display.set_icon(icon)
BLACK=pygame.Color("black")
GAINSBORO=pygame.Color("gainsboro")
MOCCASIN=pygame.Color("moccasin")
WHITE=pygame.Color("white")
screen.fill(MOCCASIN)
fps=5
fclock=pygame.time.Clock()#创建一个Clock对象用于操作时间

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:  # 点击了退出
            sys.exit()  # 退出

    pygame.display.update()  # 对显示窗口进行更新,默认窗口全部重绘
    fclock.tick(fps)  # 窗口刷新速度,每秒3次

三、初始生命矩阵

通过循环生成随机数来构建随机的初始生命分布状态。

random.randint(a,b):产生一个位于a-b之间的随机整数,包括a,b。


## 生成初始生命
a=[]
for i in range(0,n):
    a.append([])
    for j in range(0,n):
        a[i].append(random.randint(0,1))

四、周围生命的检测

我们将生命周围八个相邻位置的索引差值存储在一个列表中,通过循环遍历检测有效位置上存活生命的数量,并将结果存入计数列表。此过程包含两个关键判断步骤。

1. 首先判断目标位置是否在网格范围内(有效性)。

2. 其次判断该位置是否存在存活生命。


direction = [[-1, -1], [0, -1], [1, -1], [1, 0], [1, 1], [0, 1], [-1, 1], [-1, 0]]
    c = []
    # 计算周围生命个数
    for i in range(0, n):
        c.append([])
        for j in range(0, n):
            count = 0   # 每一个方格
            for o in direction:
                ide = np.array([i, j]) + np.array(o)
                # 保证判断的位置在范围内,针对边界方格
                if 0 <= ide[0] < n and 0 <= ide[1] < n:
                    if a[ide[0]][ide[1]] == 1:
                        count += 1
            c[i].append(count)

五、生命的变化

根据上一步生成的计数列表,对每个位置的生命状态进行更新,从而生成新的生命矩阵。


## 按照生命的发展规律进行新一轮的生面变化
    for i in range(0, n):
        for j in range(0, n):
            if c[i][j] <= 1 or c[i][j] >= 4:#当生命稀少或者过多时生命死亡
                a[i][j] = 0
            elif c[i][j] == 3:#当生命的周围有三个生命时,生成新生命
                a[i][j] = 1

六、生命的展示

绘制生命方格较为简单,主要调用Pygame的图形绘制函数。

pygame.draw.rect(screen, BLACK, (i*50, j*50, 50, 50)):此语句用于绘制一个填充矩形,显示在screen屏幕上,初始坐标为(i * 50, j * 50),宽高均为50,颜色为黑色。默认边框宽度为0,即完全填充的矩形。若添加第五个参数指定边框宽度(如数字2),则变为不填充且边框宽度为2的矩形,例如:pygame.draw.rect(screen, GAINSBORO, (i*50, j*50, 50, 50),2)。

通过图形的重叠绘制,我们实现了生命之间的间隔样式,从而增强视觉渲染效果。


for i in range(0, n):
        for j in range(0, n):
            if a[i][j]==1:
                #先画一个满填充的方格,有生命方格
                pygame.draw.rect(screen, BLACK, (i*50, j*50, 50, 50))
                #再画一个不填充,框线为2的方格,套在上面的方格上面
                pygame.draw.rect(screen, GAINSBORO, (i*50, j*50, 50, 50),2)

            else:#无生命方格
                pygame.draw.rect(screen, WHITE, (i*50, j*50, 50, 50))
                pygame.draw.rect(screen, GAINSBORO, (i*50, j*50, 50, 50),2)

七、完整代码


"""
# -*- coding: utf-8 -*-
# @Time    : 2021/4/23 0023 17:14
# @Author  : 源来很巧
# @FileName: 康威生命游戏2.py
# @Software: PyCharm
# @Blog    :https://blog.csdn.net/qq_44793283
"""
import sys
import random
import numpy as np
import pygame
pygame.init()#初始化init()及设置
n=int(input("请输入阶数:"))
size=width,height=50*n+2,50*n+2
screen=pygame.display.set_mode(size)#窗口大小
pygame.display.set_caption("康威生命游戏")#窗口名字
icon=pygame.image.load("Icon.jpg")
pygame.display.set_icon(icon)
BLACK=pygame.Color("black")
GAINSBORO=pygame.Color("gainsboro")
MOCCASIN=pygame.Color("moccasin")
WHITE=pygame.Color("white")
screen.fill(MOCCASIN)
fps=1
fclock=pygame.time.Clock()#创建一个Clock对象用于操作时间


## 生成初始生命
a=[]
for i in range(0,n):
    a.append([])
    for j in range(0,n):
        a[i].append(random.randint(0,1))

## 八个方位的索引变化
direction = [[-1, -1], [0, -1], [1, -1], [1, 0], [1, 1], [0, 1], [-1, 1], [-1, 0]]
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:  # 点击了退出
            sys.exit()  # 退出
    c = []
    # 计算周围生命个数
    for i in range(0, n):
        c.append([])
        for j in range(0, n):
            count = 0   # 每一个方格
            for o in direction:
                ide = np.array([i, j]) + np.array(o)
                # 保证判断的位置在范围内,针对边界方格
                if 0 <= ide[0] < n and 0 <= ide[1] < n:
                    if a[ide[0]][ide[1]] == 1:
                        count += 1
            c[i].append(count)
    ## 按照生命的发展规律进行新一轮的生面变化
    for i in range(0, n):
        for j in range(0, n):
            if c[i][j] <= 1 or c[i][j] >= 4:#当生命稀少或者过多时生命死亡
                a[i][j] = 0
            elif c[i][j] == 3:#当生命的周围有三个生命时,生成新生命
                a[i][j] = 1
    for i in range(0, n):
        for j in range(0, n):
            if a[i][j]==1:
                #先画一个满填充的方格,有生命方格
                pygame.draw.rect(screen, BLACK, (i*50, j*50, 50, 50))
                #再画一个不填充,框线为2的方格,套在上面的方格上面
                pygame.draw.rect(screen, GAINSBORO, (i*50, j*50, 50, 50),2)

            else:#无生命方格
                pygame.draw.rect(screen, WHITE, (i*50, j*50, 50, 50))
                pygame.draw.rect(screen, GAINSBORO, (i*50, j*50, 50, 50),2)
    print(np.array(a))
    pygame.display.update()  # 对显示窗口进行更新,默认窗口全部重绘
    fclock.tick(fps)  # 窗口刷新速度,每秒3次

总结

该游戏的实际开发难度并不高,关键在于理清具体思路,明确执行顺序以及所需存储的矩阵结构。唯一的难点在于周围生命个数的检测,本文采用穷举法,手动计算并存储每个位置的索引差值。在网格规模较小的情况下,这种循环计算不会造成显著的性能损耗。如果您有更好的优化建议,欢迎交流。此外,关于游戏结束条件的处理,后续可能会补充相关实现。

到此这篇关于Python实战之实现康威生命游戏的文章就介绍到这了,更多相关Python实现康威生命游戏内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表