pgzrun 生命游戏制作过程详解

news2024/11/17 21:37:32

背景资料
        康威生命游戏(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] = 0
            else:
                t = random.choice([1, 0])
                if t == 0:
                    Cel_life[i][j] = 0
                else:
                    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 * 10
            cel.top = i * 10
            Cells.append(cel)

# 定义函数update_Cel_life,用于更新细胞状态
def update_Cel_life():
    global Cel_life
    # 创建临时二维列表temp和队列queue
    temp = [[0] * col for _ in range(row)]
    queue = deque()

    # 遍历二维列表Cel_life,根据规则更新细胞状态并添加到队列queue中
    for i in range(row):
        for j in range(col):
            t = 0
            for dx, dy in [(-1, -1), (-1, 0), (-1, 1), (0, 1), (1, 1), (1, 0), (1, -1), (0, -1)]:
                nx, ny = i + dx, j + dy
                if 0 <= nx < row and 0 <= ny < col and Cel_life[nx][ny] == 1:
                    t += 1
            if Cel_life[i][j] == 1:
                if t == 3 or t == 2:
                    temp[i][j] = 1
                elif t > 3:
                    temp[i][j] = 0
                elif t < 2:
                    temp[i][j] = 0
            else:
                if t == 3:
                    temp[i][j] = 1
                else:
                    temp[i][j] = 0
            if 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] * 10
        cel.top = t[0] * 10
        Cells[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.coloradmin.cn/o/1376273.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

互联网大厂职场各职级P6/P7和核心能力

目录 具体能力要求总结 具体能力要求 专业工匠 p5 被别人带领p6 独立完成项目全流程&#xff0c;指导 2-3 人 乐队指挥 p7 带行政团队 7-10 &#xff0c;项目团队&#xff0c;专项团队&#xff0c;复杂系统设计 1-3 个一般系统构成p8 领域专家 垂直 3 个团队 &#xff0c;横…

蓝桥杯基础知识3 memset()

蓝桥杯基础知识3 memset() #include <bits/stdc.h> using namespace std;int main(){int a[5]; //随机数for(int i 0;i < 5; i)cout << a[i] << \n;cout << \n;memset(a, 0, sizeof a); //0for(int i 0;i < 5; i)cout << a[i] << …

Proteus仿真stm32f103r6输出PWM/正弦波

资料下载地址&#xff1a;Proteus仿真stm32f103r6输出PWM/正弦波 一、仿真图 Proteus仿真stm32f103r6输出PWM/正弦波 二、程序 #include "pbdata.h"u16 fre; void RCC_Configuration(void); void GPIO_Configuration(void); void TIM3_Configuration();void Dela…

Kotlin程序设计(三)高级用法

Kotlin程序设计高级篇 在学习了前面的内容之后&#xff0c;相信各位小伙伴应该对Kotlin这门语言有了一些全新的认识&#xff0c;我们已经了解了大部分的基本内容&#xff0c;从本章开始&#xff0c;就是对我们之前所学的基本内容的进一步提升。 泛型 在前面我们学习了最重要…

【信息论与编码】【北京航空航天大学】实验二、哈夫曼编码【C语言实现】(下)图像编码压缩

实验2 哈夫曼编码&#xff08;下&#xff09;&#xff08;图像编码&#xff09; 实验简介&#xff1a; 本次实验为实验1&#xff1a;哈夫曼编码的后续补充&#xff0c;实验1见博客&#xff1a;实验一、哈夫曼编码【C语言实现】&#xff08;上&#xff09; 说明&#xff1a; 实…

Redis系列-15.Redis的IO多路复用原理解析

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码、Kafka原理、分布式技术原理、数据库技术&#x1f525;如果感觉博主的文章还不错的…

【REST2SQL】05 GO 操作 达梦 数据库

【REST2SQL】01RDB关系型数据库REST初设计 【REST2SQL】02 GO连接Oracle数据库 【REST2SQL】03 GO读取JSON文件 【REST2SQL】04 REST2SQL第一版Oracle版实现 信创要求用国产数据库&#xff0c;刚好有项目用的达梦&#xff0c;研究一下go如何操作达梦数据库 1 准备工作 1.1 安…

查询速度提升15倍!银联商务基于 Apache Doris 的数据平台升级实践

本文导读&#xff1a; 在长期服务广大规模商户的过程中&#xff0c;银联商务已沉淀了庞大、真实、优质的数据资产数据&#xff0c;这些数据不仅是银联商务开启新增长曲线的基础&#xff0c;更是进一步服务好商户的关键支撑。为更好提供数据服务&#xff0c;银联商务实现了从 H…

关于高通Android 平台上qssi的介绍

1. QSSI 是 Qualcomm Single System Image 的缩写。 2. Android Q上开始支持QSSI。 3. QSSI 是用来编译system.img的 3.1 QSSI编译注意事项 lunch qssi ------ 编译system.img lunch target ------ 编译其余的image 3.2 有QSSI和没有QSSI的编译流程对比 没有QS…

3Dmax不能渲染怎么办?

使用3Dmax渲染异常的话&#xff0c;主要在于以下几点&#xff1a; 1.素材丢失导致渲染效果错误 max文件贴图丢失或对应路径不存在 2.相机位置 先要考虑是相机位置&#xff0c;不管用的普通相机还是物理相机。 看它的位置是不是放在了模型的里面或者是墙体的外面&#xff0c;…

如何构建Prompt,帮我生成QA,作为召回率检索的测试集?

最近在做搜索召回率的提升工作。粮草未动兵马先行&#xff01;在做之前应该先有一把尺子来衡量召回率的好坏。所以应该先构建测试数据集&#xff0c;然后去做标准化测试。 有了测试机集以后。再去做搜索优化&#xff0c;才能看出来效果。 当然可以选择一些开源的测试集。如果可…

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

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

合并 K 个升序链表[困难]

一、题目 给你一个链表数组&#xff0c;每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 示例 1&#xff1a; 输入&#xff1a;lists [[1,4,5],[1,3,4],[2,6]] 输出&#xff1a;[1,1,2,3,4,4,5,6] 解释&#xff1a;链表数组如…

经管类CSSCI、北核期刊投稿指南数据(2023年更新)/经管类的期刊投稿指南

经管类CSSCI、北核期刊投稿指南&#xff08;2023年更新&#xff09; 1、内容包括&#xff1a;投稿指南-CSSCI版本、CSSCI扩展版本、北大核刊版本、建议期刊版本、所有期刊。 2、范围&#xff1a;CSSCI、CSSCI扩展、北大核刊 3、说明&#xff1a;包含经管类期刊的发表难度&am…

Spark六:Spark 底层执行原理SparkContext、DAG、TaskScheduler

Spark底层执行原理 学习Spark运行流程 学习链接&#xff1a;https://mp.weixin.qq.com/s/caCk3mM5iXy0FaXCLkDwYQ 一、Spark运行流程 流程&#xff1a; SparkContext向管理器注册并向资源管理器申请运行Executor资源管理器分配Executor&#xff0c;然后资源管理器启动Execut…

Day4Qt

1.头文件: #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTime>//时间类 #include <QTimer>//时间事件类 #include <QTimerEvent>//定时器类 #include <QTextToSpeech> namespace Ui { class Widget; }class Widget : publi…

Leetcode2982. 找出出现至少三次的最长特殊子字符串 II

Every day a Leetcode 题目来源&#xff1a;2982. 找出出现至少三次的最长特殊子字符串 II 解法1&#xff1a;字符串分割 分类讨论 按照相同字母分组&#xff0c;每组统计相同字母连续出现的长度。例如 aaaabbbabb 把 a 分成一组&#xff0c;组内有长度 4 和长度 1&#x…

2022-ECCV-Explaining Deepfake Detection by Analysing Image Matching

一、研究背景 1.大量工作将深度伪造检测作为一个二分类任务并取得了良好的性能。 2.理解模型如何在二分类标签的监督下学习伪造相关特征仍难是个艰巨的任务。 3.视觉概念&#xff1a;具有语义的人脸区域&#xff0c;如嘴、鼻子、眼睛。 二、研究目标 1.验证假设&#xff0c;并…

centos8部署MySQL5.7故障集

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 在centos8系统上安装MySQL&#xff0c;使用的是centos7上安装MySQL的脚本&#xff0c;出现了以下问题&#xff0c;以做记录&…

Spark原理——逻辑执行图

逻辑执行图 明确逻辑计划的边界 在 Action 调用之前&#xff0c;会生成一系列的RDD,这些RDD之间的关系&#xff0c;其实就是整个逻辑计划 val conf new SparkConf().setMaster("local[6]").setAppName("wordCount_source") val sc new SparkContext(conf)v…