Python实战之实现康威生命游戏


Posted in Python onApril 26, 2021

前言

康威生命游戏设计并不难,我的思路就是借助pygame进行外观的展示,最近一段时间的游戏项目都是使用pygame进行的,做起来比较顺利。内部代码的实现也比较简单根据他的规则我们需要的是多次的计算和判断,再刷新数组。

一、康威生命游戏规则

当周围仅有1个或没有存活细胞时, 原来的存活细胞进入死亡状态。(模拟生命数量稀少)当周围有2个或3个存活细胞时, 网格保持原样。当周围有4个及以上存活细胞时,原来的存活细胞亦进入死亡状态。(模拟生命数量过多)当周围有3个存活细胞时,空白网格变成存活细胞。(模拟繁殖)

 二、设计流程

1、引入库

代码如下(示例):

import sys
import random
import numpy as np
import pygame

2、设计思路

在这篇博客里面我们实现了下面第一个图的内容。

Python实战之实现康威生命游戏

感兴趣的朋友也可以加下面的思路:

Python实战之实现康威生命游戏

3、设计窗口

首先我们借用了之前的pygame窗口的代码,实现窗口的调用。与之前有所不同的变化是,我们在展开窗口之前首先确定大小。
我们实现了游戏大小的自定义,窗口大小的自定义,可以与后面游戏设计增加统一性,增加美观性。

中间的部分代码是一些颜色的调出,和窗口的填充。

Python实战之实现康威生命游戏

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, 50),颜色为:black,默认边框为0,即全部填充的矩形,当后面添加一个数字时,代表无填充,框线为数字大小的矩形,如:pygame.draw.rect(screen, GAINSBORO, (i*50, j*50, 50, 50),2)代表不填充,框线为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 相关文章推荐
python抓取京东价格分析京东商品价格走势
Jan 09 Python
关于Python如何避免循环导入问题详解
Sep 14 Python
Python绘制KS曲线的实现方法
Aug 13 Python
Python生成器的使用方法和示例代码
Mar 04 Python
Python3.5内置模块之os模块、sys模块、shutil模块用法实例分析
Apr 27 Python
python nmap实现端口扫描器教程
May 28 Python
python multiprocessing多进程变量共享与加锁的实现
Oct 02 Python
python打印异常信息的两种实现方式
Dec 24 Python
Python-openCV读RGB通道图实例
Jan 17 Python
Python实现一个简单的毕业生信息管理系统的示例代码
Jun 08 Python
python如何输出反斜杠
Jun 18 Python
ffmpeg+Python实现B站MP4格式音频与视频的合并示例代码
Oct 21 Python
Python 制作自动化翻译工具
教你用Python写一个植物大战僵尸小游戏
python爬取新闻门户网站的示例
Apr 25 #Python
python自然语言处理之字典树知识总结
Python自然语言处理之切分算法详解
Apr 25 #Python
Python网络编程之ZeroMQ知识总结
Python 文本滚动播放器的实现代码
Apr 25 #Python
You might like
php获取当月最后一天函数分享
2015/02/02 PHP
php截取视频指定帧为图片
2016/05/16 PHP
PHP 实现从数据库导出到.csv文件方法
2017/07/06 PHP
ThinkPHP5.1框架数据库链接和增删改查操作示例
2019/08/03 PHP
利用PHP内置SERVER开启web服务(本地开发使用)
2020/01/22 PHP
javascript 实现父窗口引用弹出窗口的值的脚本
2007/08/07 Javascript
Javascript的数组与字典用法与遍历对象的属性技巧
2012/11/07 Javascript
jquery trigger伪造a标签的click事件取代window.open方法
2014/06/23 Javascript
jQuery制作简洁的多级联动Select下拉框
2014/12/23 Javascript
nodejs 的 session 简单使用
2016/06/06 NodeJs
轻松掌握JavaScript状态模式
2016/09/07 Javascript
less简单入门(CSS 预处理语言)
2017/03/08 Javascript
jQuery插件HighCharts绘制2D柱状图、折线图和饼图的组合图效果示例【附demo源码下载】
2017/03/09 Javascript
JS实现的找零张数最小问题示例
2017/11/28 Javascript
angularjs通过过滤器返回超链接的方法
2018/10/26 Javascript
解决layui 表单元素radio不显示渲染的问题
2019/09/04 Javascript
你准备好迎接vue3.0了吗
2020/04/28 Javascript
使用Python编写提取日志中的中文的脚本的方法
2015/04/30 Python
python数据结构之链表详解
2017/09/12 Python
python使用pil进行图像处理(等比例压缩、裁剪)实例代码
2017/12/11 Python
Python发送http请求解析返回json的实例
2018/03/26 Python
python pycharm的安装及其使用
2019/10/11 Python
iframe与window.onload如何使用详解
2020/05/07 HTML / CSS
好莱坞百老汇御用王牌美妆:Koh Gen Do 江原道
2018/04/03 全球购物
印度化妆品购物网站:Nykaa
2018/07/22 全球购物
英国Flybe航空官网:欧洲最大的独立支线廉价航空公司
2019/07/15 全球购物
德国家具购物网站:Möbel Höffner
2019/08/26 全球购物
西班牙购买隐形眼镜、眼镜和太阳镜网站:Lentiamo.es
2020/06/11 全球购物
大三预备党员入党思想汇报
2014/01/08 职场文书
小学生期末评语大全
2014/04/21 职场文书
小学校长竞聘演讲稿
2014/05/16 职场文书
教师考察材料范文
2014/06/03 职场文书
先进员工获奖感言
2014/08/14 职场文书
2015年公路养护工作总结
2015/05/13 职场文书
集结号观后感
2015/06/08 职场文书
nginx之queue的具体使用
2022/06/28 Servers