pgzrun 生命游戏制作过程详解

背景资料
        康威生命游戏(Game of Life)是剑桥大学约翰·何顿·康威设计的计算机程序。
        美国趣味数学大师马丁·加德纳(Martin Gardner,1914-2010)通过《科学美国人》杂志,将康威的生命游戏介绍给学术界之外的广大渎者,一时吸引了各行各业一大批人的兴趣,这时细胞自动机课题才吸引了科学家的注意。

生命游戏概述
        生命游戏没有游戏玩家各方之间的竞争,也谈不上输赢,可以把它归类为仿真游戏。事实上,也是因为它模拟和显示的图像看起来颇似生命的出生和繁衍过程而得名为“生命游戏”。在游戏进行中,杂乱无序的细胞会逐渐演化出各种精致、有形的结构;这些结构往往有很好的对称性,而且每一代都在变化形状。一些形状一经锁定就不会逐代变化。有时,一些已经成形的结构会因为一些无序细胞的“入侵”而被破坏。但是形状和秩序经常能从杂乱中产生出来。
        每个方格中都可放置一个生命细胞,每个生命细胞只有两种状态:
        “生”或“死”。用黑色方格表示该细胞为“生”,空格(白色)表示该细胞为“死”。或者说方格网中黑色部分表示某个时候某种“生命”的分布图。生命游戏想要模拟的是:随着时间的流逝,这个分布图将如何一代一代地变化。

康威为“生命游戏”设定了如下规则:
在一个格子世界里,每一个格子里最多可以长一个细胞。细胞根据规则,一代一代地存活、繁殖或死亡。
规则一:生   与2或3个细胞相邻的细胞将活到下一轮;
规则二:死  与4个及以上细胞相邻,则因为过度拥挤而死;与1个或0个细胞相邻,则因为孤独而死;
规则三:繁衍  一个空格若与3个细胞相邻,则在下一轮时,这个空格内将产生一个新细胞。
        在每一代中,生死、繁衍都是同时发生的。每一代的细胞构成了一个群体,或者说“生命历史”中的一小步。
        可以把最初的细胞结构定义为种子,当所有在种子中的细胞同时被以上规则处理后,可以得到第一代细胞图。按规则继续处理当前的细胞图,可以得到下一代的细胞图,周而复始。

以下代码,是一个基于生命游戏规则的细胞自动机模拟。游戏开始时,先初始化细胞的初始状态,并将每个细胞的状态用Actor对象表示,存储在列表Cells中。然后,在每次游戏循环中,通过update_Cel_life函数根据生命游戏规则更新细胞的状态,并将更新后的细胞状态重新渲染到屏幕上。游戏循环不断重复这个过程,实现了细胞状态的演化。

# 生命游戏
# 导入所需模块
import random
from collections import deque
import pgzrun# 设置游戏标题和窗口大小
TITLE = "pgzrun_生命游戏"
row = 100
col = 180
WIDTH = 10 * col
HEIGHT = 10 * row# 创建二维列表Cel_life和列表Cells
Cel_life = [[0] * col for _ in range(row)]
Cells = []# 定义函数First_Cel_life,用于初始化游戏中的细胞状态
def First_Cel_life():# 遍历二维列表Cel_life,根据位置设置初始细胞状态for i in range(row):for j in range(col):if i == 0 or j == 0 or i == row - 1 or j == col - 1:Cel_life[i][j] = 0else:t = random.choice([1, 0])if t == 0:Cel_life[i][j] = 0else:Cel_life[i][j] = 1# 遍历二维列表Cel_life,根据细胞状态创建Actor对象,并添加到列表Cells中for i in range(row):for j in range(col):if Cel_life[i][j] == 1:cel = Actor("live")else:cel = Actor("die")cel.left = j * 10cel.top = i * 10Cells.append(cel)# 定义函数update_Cel_life,用于更新细胞状态
def update_Cel_life():global Cel_life# 创建临时二维列表temp和队列queuetemp = [[0] * col for _ in range(row)]queue = deque()# 遍历二维列表Cel_life,根据规则更新细胞状态并添加到队列queue中for i in range(row):for j in range(col):t = 0for dx, dy in [(-1, -1), (-1, 0), (-1, 1), (0, 1), (1, 1), (1, 0), (1, -1), (0, -1)]:nx, ny = i + dx, j + dyif 0 <= nx < row and 0 <= ny < col and Cel_life[nx][ny] == 1:t += 1if Cel_life[i][j] == 1:if t == 3 or t == 2:temp[i][j] = 1elif t > 3:temp[i][j] = 0elif t < 2:temp[i][j] = 0else:if t == 3:temp[i][j] = 1else:temp[i][j] = 0if Cel_life[i][j] != temp[i][j]:queue.append([i, j, temp[i][j]])# 遍历队列queue,更新Cel_life和Cells列表中的细胞状态while queue:t = queue.popleft()Cel_life[t[0]][t[1]] = t[2]if t[2]:cel = Actor("live")else:cel = Actor("die")cel.left = t[1] * 10cel.top = t[0] * 10Cells[t[0] * col + t[1]] = cel# 调用函数First_Cel_life,初始化细胞状态
First_Cel_life()# 定义函数draw,用于绘制游戏画面
def draw():screen.clear()for cel in Cells:cel.draw()# 定义函数update,用于更新游戏状态
def update():pass# 定义函数output,用于定时调用update_Cel_life函数更新细胞状态
def output():clock.schedule_unique(output, 0.1)update_Cel_life()# 调用output函数开始游戏循环
output()
pgzrun.go()

生命游戏的模式示例
在生命游戏中会出现许多不同类型的模式,这些模式根据其行为进行分类。常见的模式类型包括:
静态:从一代到下一代都不会改变;
振荡态:经过有限的迭代后返回其初始状态;
移动的震荡态:它们可以在整个网格中平移。
静态示例

          方块                             船
震荡态示例

      

脉冲星(周期=3轮)     烽火(周期=2轮)
移动态示例

                   

滑翔机(周期=4轮)    太空船(周期=4轮)

生命游戏的实际应用
生命游戏虽然是一个简单的计算机模拟,但它在许多领域中都有实际的应用。
在生物学研究中,生命游戏可以模拟细胞的分裂、群体行为和进化等生物学现象。当细胞的数量达到一定程度时,它们会开始分裂并形成更大的群体;当生物群体的环境发生变化时,适应环境的个体会存活下来并繁殖,从而使整个群体进化。生命游戏的模拟结果可以帮助生物学家更好地理解自然界中的生物现象,从而推进生物学研究。

在计算机科学中,生命游戏是一个很好的算法演示工具,可以帮助计算机科学家和学生学习和理解一些常见的算法和数据结构,例如递归、分治算法等等。
在艺术创作中,生命游戏的演化过程中产生的各种图案和结构非常美丽,因此它被一些艺术家用于艺术创作,例如设计壁纸、绘画、音乐等等。
在模拟物理现象中,生命游戏可以模拟许多物理现象,例如流体流动、火焰燃烧等等。比如火焰燃烧,通过引入燃烧动力学的规则就可以模拟。我们可以将细胞的状态视为燃烧的状态,根据燃烧的化学反应和传热原理,计算细胞之间的相互作用和火焰的传播情况。然后可以引入燃料的化学组成、燃烧温度、燃烧速率等参数,计算火焰的传播速度和传播方向。这些模拟可以帮助物理学家更好地理解物理现象,从而推进物理学研究。

在神经网络训练中,生命游戏中的规则和神经元之间的信号传递有些相似,在生命游戏中,每个细胞的状态受到其周围细胞的影响,而这种影响可以通过一组简单的规则来描述。类似地,在神经元之间,信号的传递也是基于一组规则,即神经元之间的突触传递机制。在这种机制中,一个神经元通过突触将信息传递给另一个神经元,而这个传递过程也是基于一组规则,例如兴奋性和抑制性信号的作用和传递方式等等。因此生命游戏可以用于训练神经网络,从而提高神经网络的性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/341875.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分享一款刚开源的音乐人声分离工具!无需联网!页面化操作!

前言 人声分离 是一项重要的音频处理技术&#xff0c;它可以将混合音频中的 人声和背景音乐 分离出来&#xff0c;为音频处理和后期制作提供了便利。 随着人声分离技术的发展&#xff0c;越来越多的开源工具被开发出来&#xff0c;为音频处理领域带来了新的发展机遇。小编之前…

Netty开篇——基础介绍与准备(一)

I/O篇 Netty的介绍 Netty 是由JBOSS提供的一个Java开源框架在Github上Netty 是一个异步的、基于事件驱动的网络应用框架&#xff0c;用以快速开发高性能、高可靠性的网络IO程序。Netty 主要针对在TCP协议下面向客户端的高并发应用&#xff0c;或者Peer-to-Peer/P2P场景下的大量…

PPT插件-大珩助手-修改素材名称及搜索功能演示

修改素材名称及搜索功能演示 大珩助手的素材库&#xff0c;支持修改素材的名称&#xff0c;支持动态查找素材&#xff0c;删除素材 移动素材到其他分类 软件介绍 PPT大珩助手是一款全新设计的Office PPT插件&#xff0c;它是一款功能强大且实用的PPT辅助工具&#xff0c;支持…

天津大数据分析培训班 常见的大数据培训课程

大数据现在属于热门职业技能之一&#xff0c;不管是大学毕业生&#xff0c;计算机和数据相关专业青年&#xff0c;已经工作一阵的开发人员&#xff0c;运营小白&#xff0c;还是其他想进入这个行当的&#xff0c;可能还没有编程基础的转行人&#xff0c;都想尝试大数据行业&…

“三指针法“合并两个有序数组(力扣每日一练)

我的第一想法确实是&#xff1a;先合并数组&#xff0c;再排序&#xff0c;搞完。 哈哈哈&#xff0c;想那么多干嘛&#xff0c;目的达成了就好了。 力扣官方题解是双指针&#xff1a; 还有糕手&#xff1a; Python&#xff1a; def merge(nums1, m, nums2, n):# 两个指针分别…

深入理解 Flink(六)Flink Job 提交和 Flink Graph 详解

Flink Program 编程套路回顾 1、获取执行环境对象 StreamExecutionEnvironment env StreamExecutionEnvironment.getExecutionEnvironment(); 2、通过执行环境对象&#xff0c;注册数据源 Source&#xff0c;得到数据抽象 DataStream ds env.socketTextStream(...) 3、调用数…

PostgreSQL内存浅析

体系结构 &#xff08;https://www.postgresql.fastware.com/blog/lets-get-back-to-basics-postgresql-memory-components&#xff09; &#xff08;http://geekdaxue.co/read/fcantsql/qts5is) 共享内存 linux的共享内存实现 (https://momjian.us/main/writings/pgsql/insi…

Blazor快速开发框架Known-V2.0.0

Known2.0 Known是基于Blazor的企业级快速开发框架&#xff0c;低代码&#xff0c;跨平台&#xff0c;开箱即用&#xff0c;一处代码&#xff0c;多处运行。 官网&#xff1a;http://known.pumantech.comGitee&#xff1a; https://gitee.com/known/KnownGithub&#xff1a;ht…

【Linux】Linux 系统编程——tree 命令

文章目录 1. 命令概述2. 命令格式3. 常用选项4. 相关描述4.1 tree 命令安装 5. 参考示例5.1 创建树形目录5.2 使用 tree 命令查看树形目录 1. 命令概述 tree 命令用于在命令行界面以树状图形式显示目录及其子目录的内容。这个命令递归地列出所有子目录&#xff0c;并可选择显示…

品牌渠道治理思路浅谈

渠道是否管控好&#xff0c;体现在渠道中有无低价链接&#xff0c;或者是低价数据的占比是否较低&#xff0c;如果打开电商平台&#xff0c;搜索一款产品的价格&#xff0c;有很多链接的价格低于旗舰店价格&#xff0c;这显然不是一个健康的渠道表现&#xff0c;所以治理渠道就…

odoo linux环境打印乱码或无内容

在odoo打印中会遇到乱码或者无内容显示&#xff0c;需要安装一些包 sudo apt-get install ttf-wqy-zenhei sudo apt-get install ttf-wqy-microhei安装前 安装后

mysql清空并重置自动递增初始值

需求&#xff1a;当上新项目时&#xff0c;测试环境数据库导出来的表id字段一般都有很大的初始递增值了&#xff0c;需要重置一下 先上代码&#xff1a; -- 查看当前自动递增值 SHOW CREATE TABLE table_name; -- 重建自动递增索引&#xff08;可选&#xff09; ALTER TABLE t…