基于python实现生命游戏

news2024/11/24 5:32:39

文章目录

  • 一、生命游戏是什么
  • 二、生命游戏规则解释
    • 1.相邻细胞
    • 2.细胞状态
  • 三、代码实现
    • 1.邻居细胞
    • 2.更新状态
  • 四、整体代码

一、生命游戏是什么

生命游戏(Game of Life)是由英国数学家约翰·何顿·康威在1970年发明的一种细胞自动机(Cellular Automaton),也可以称为生命棋或零玩家游戏。生命游戏的特点主要体现在以下几个方面:

  1. 游戏背景
    生命游戏在一个二维的网格上进行,每个网格(或称为格子、细胞)都可以处于“生”或“死”的状态。网格可以是无穷大的,也可以是一个有限大的矩形。
  2. 游戏规则
    一个细胞的生死状态完全取决于它周围八个相邻细胞的状态。具体规则如下:
当前状态下一代状态
存活如果周围恰好有2个或3个活细胞,则它在下一代仍然存活;如果周围有0个、1个或超过3个的活细胞,则它在下一代死去(因孤独或过度拥挤)
死去如果周围有恰好3个活细胞,则它在下一代复活(模拟繁殖)
  • 游戏特性
    生命游戏是一个零玩家游戏,即没有玩家的干预或输入,所有变化都遵循预设的规则。
    随着游戏的进行,杂乱无序的细胞会逐渐演化出各种精致、有形的结构,有时这些结构会保持稳定,有时会因为无序细胞的“入侵”而被破坏。生命游戏的规则简单,但能够产生出复杂且富有变化的模式,这体现了从简单规则中产生复杂性的原理。
  • 应用场景
    生命游戏不仅在数学和计算机科学领域具有研究价值,也常被用于演示元胞自动机的原理和特性。在艺术和设计领域,生命游戏也被用于生成独特的纹理和图案。生命游戏是一个简单但强大的模型,它展示了从简单规则中涌现出复杂性和多样性的能力,对理解自然界和社会现象提供了有趣的视角。

二、生命游戏规则解释

1.相邻细胞

对于如下3×3的9宫格, i i i号细胞的周围八个相邻细胞分别是 a 、 b 、 c 、 d 、 e 、 f 、 g 、 h a、b、c、d、e、f、g、h abcdefgh
[ a b c d i e f g h ] \left[ \begin{matrix} a & b & c \\ d & i & e \\ f & g & h \\ \end{matrix} \right] adfbigceh

2.细胞状态

1表示细胞存活状态,0表示细胞死去状态。

  • 当前状态为存活,下一代继续存活
    假设当前细胞 i i i为存活状态,如果相邻细胞的状态如下所示,则细胞 i i i下一代继续存活,因为其周围有3个活细胞。
    [ 0 0 1 0 1 1 1 0 0 ] \left[ \begin{matrix} 0 & 0 & 1 \\ 0 & 1 & 1 \\ 1 & 0 & 0 \\ \end{matrix} \right] 001010110
  • 当前状态为存活,下一代不能存活
    假设当前细胞 i i i为存活状态,如果相邻细胞的状态如下所示,则细胞 i i i下一代不能存活,因为其周围有4个活细胞,拥挤死去。
    [ 0 0 1 1 1 1 1 0 0 ] \left[ \begin{matrix} 0 & 0 & 1 \\ 1 & 1 & 1 \\ 1 & 0 & 0 \\ \end{matrix} \right] 011010110
  • 当前状态为死去,下一代复活
    假设当前细胞 i i i为死去状态,如果相邻细胞的状态如下所示,则细胞 i i i复活,因为其周围恰有3个活细胞。
    [ 1 0 0 1 0 0 0 0 1 ] \left[ \begin{matrix} 1 & 0 & 0 \\ 1 & 0 & 0 \\ 0& 0 & 1 \\ \end{matrix} \right] 110000001
  • 当前状态为死去,下一代继续为死去状态
    假设细胞 i i i为死去状态, 如果相邻细胞的状态如下所示,则细胞 i i i继续为死去状态,因为其周围有1个活细胞。
    [ 0 0 0 1 0 0 0 0 0 ] \left[ \begin{matrix} 0 & 0 & 0 \\ 1 & 0 & 0 \\ 0& 0 & 0 \\ \end{matrix} \right] 010000000

三、代码实现

1.邻居细胞

针对邻居8个细胞,分别进行判断,这里采用的是一个有限大的矩形。

#判断每一代邻居生存状态
def cal(i, j):
    count = 0
    if i-1 >= 0 and j-1>= 0:
        count = count + earth_init[i-1][j-1]
    if i-1 >= 0:
        count = count + earth_init[i-1][j]
    if i-1 >= 0 and j+1< grid_size:
        count = count + earth_init[i-1][j+1]
    if j-1>= 0:
        count = count + earth_init[i][j-1]
    if j+1< grid_size:
        count = count + earth_init[i][j+1]
    if i+1 < grid_size and j-1>= 0:
        count = count + earth_init[i+1][j-1]
    if i+1 < grid_size:
        count = count + earth_init[i+1][j]
    if i+1 < grid_size and j+1< grid_size:
        count = count + earth_init[i+1][j+1]
    return count

2.更新状态

根据细胞的存活、死去状态进行更新。

#更新新一代earth
def new_earth(earth_init):
    earth = copy.deepcopy(earth_init)
    for i in range(grid_size):
        for j in range(grid_size):
        	#活细胞
            if earth[i][j] == 1:
                if cal(i, j) <= 1 or cal(i, j) >= 4:
                    earth[i][j] = 0
            #死细胞
            else:
                if cal(i, j) == 3:
                    earth[i][j] = 1
    return earth

四、整体代码

完整代码如下所示。

import copy
import matplotlib.pyplot as plt
import numpy as np
import random
#生命游戏二维空间大小
grid_size = 30
#init生命数量
counts = 100
def grid_init(input):
    #手动输入关注型态
    care_init = [[10,10], [11,10], [12,10],[13,10]]
    #随机生成
    labels = []
    random.randint(0,grid_size-1)
    for i in range(counts):
        labels.append([random.randint(0,grid_size-1), random.randint(0,grid_size-1)])
    #初始化
    earth_init = np.zeros((grid_size, grid_size))
    if input != 'random':
        labels = care_init
    for label in labels:
        earth_init[label[0]][label[1]] = 1
    return earth_init
#判断每一代邻居生存状态
def cal(i, j):
    count = 0
    if i-1 >= 0 and j-1>= 0:
        count = count + earth_init[i-1][j-1]
    if i-1 >= 0:
        count = count + earth_init[i-1][j]
    if i-1 >= 0 and j+1< grid_size:
        count = count + earth_init[i-1][j+1]
    if j-1>= 0:
        count = count + earth_init[i][j-1]
    if j+1< grid_size:
        count = count + earth_init[i][j+1]
    if i+1 < grid_size and j-1>= 0:
        count = count + earth_init[i+1][j-1]
    if i+1 < grid_size:
        count = count + earth_init[i+1][j]
    if i+1 < grid_size and j+1< grid_size:
        count = count + earth_init[i+1][j+1]
    return count
#更新新一代earth
def new_earth(earth_init):
    earth = copy.deepcopy(earth_init)
    for i in range(grid_size):
        for j in range(grid_size):
            if earth[i][j] == 1:
                if cal(i, j) <= 1 or cal(i, j) >= 4:
                    earth[i][j] = 0
            else:
                if cal(i, j) == 3:
                    earth[i][j] = 1
    return earth
#作图
def pplot(earth):
    # 创建一个grid_size x grid_size的网格
    x = np.linspace(0, 1, grid_size)
    y = np.linspace(0, 1, grid_size)
    X, Y = np.meshgrid(x, y)
    # 绘制九宫格
    fig, ax = plt.subplots()
    for i in range(grid_size):
        for j in range(grid_size):
            if earth[i][j] == 1:
                #白色
                color = [1, 1, 1]
            else:
                #黑色
                color = [0, 0, 0]
            # 绘制每个格子,使用颜色数组中的对应颜色
            ax.add_patch(plt.Rectangle(
                (x[i], y[j]),  # 左下角坐标
                x[1] - x[0],    # 宽度
                y[1] - y[0],    # 高度
                #color=colors[i, j],  # 颜色
                color=color,
                edgecolor='black'   # 边框颜色
            ))
    # 设置坐标轴范围
    ax.set_xlim(0, 1)
    ax.set_ylim(0, 1)
    # 关闭坐标轴的刻度显示
    ax.set_xticks([])
    ax.set_yticks([])
    ax.set_aspect('equal', adjustable='box')
    # 显示图形
    plt.show(block=False)
    plt.pause(1)
    plt.close()
earth_init = grid_init('random')
pplot(earth_init)
#迭代代数
iters = 100
for i in range(iters):
    earth = new_earth(earth_init)
    #没有生命存活则停止
    if sum(sum(earth)) == 0:
        break
    pplot(earth)
    plt.close('all')
    print('='*20, i)
    print(sum(sum(earth)))
    earth_init = copy.deepcopy(earth)

附上一张实验图。
在这里插入图片描述

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

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

相关文章

备份服务器的安全风险以及如何通过TDE透明加密提升安全性

备份服务器的潜在安全风险主要包括以下几个方面&#xff1a; 1. 数据泄露风险&#xff1a; 备份数据可能包含敏感信息&#xff0c;如用户个人信息、商业机密等。如果备份数据未经适当保护&#xff0c;例如存储在不安全的位置或未加密&#xff0c;黑客或未授权的人员可能会获取…

家政预约小程序08服务详情

目录 1 创建页面2 创建URL参数3 配置数据详情组件4 从分类页跳转到详情页5 搭建详情页总结 现在我们的小程序已经在首页和分类页展示了服务的列表信息&#xff0c;当用户点击具体的内容的时候需要打开详情页&#xff0c;本篇介绍一下详情页的开发。 1 创建页面 打开应用编辑器…

【第7章】SpringBoot整合Mybatis-Plus

文章目录 前言一、引入库二、案例1.UserMapper2.UserController3. 结果 三、配置总结 前言 MyBatis-Plus 是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 上一篇内容已经整合过Mybatis&#xff0c;这里在…

拼接字符串

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 使用“”运算符可完成对多个字符串的拼接&#xff0c;“”运算符可以连接多个字符串并产生一个字符串对象。 例如&#xff0c;定义两个字符串&#…

05-28 周二 TTFT, ITL, TGS 计算过程以及LLama2推理代码调试过程

05-28 周二 LLama2推理代码调试过程 时间版本修改人描述2024年5月28日15:03:49V0.1宋全恒新建文档 简介 本文主要用于求解大模型推理过程中的几个指标&#xff1a; 主要是TTFT&#xff0c;ITL&#xff0c; TGS 代码片段 import osdata_dir "/workspace/models/" m…

【2024最新华为OD-C卷试题汇总】披萨大作战 (100分) - 支持在线评测+三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; 文章目录 前…

从多站点到多活,XEOS 对象数据容灾能力再提升

近日&#xff0c; XSKY SDS V6.4 新版本发布&#xff0c;其中 XEOS V6.4 全新升级并完善了统一命名空间功能&#xff0c;更进一步增强和完善了异地容灾方案&#xff0c;配合强一致代理读&#xff0c;可以实现异地多活&#xff1b;同时大幅降低管理复杂度&#xff0c;有效降低容…

Apache漏洞复现:【CVE-2021-42013】【CVE_2021_41773】【CVE-2017-15715】

声明 严禁读者利用本文介绍知识点对网站进行非法操作 , 本文仅用于技术交流和学习 , 如果您利用文章中介绍的知识对他人造成损失 , 后果由您自行承担 , 如果您不能同意该约定 , 请您务必不要阅读该文章 , 感谢您的配合 ! 远程代码执行 CVE-2021-42013 描述 Apache HTTP Ser…

RFM模型-分析母婴类产品

1&#xff0c;场景描述 假设我们是某电商平台的数据分析师&#xff0c;负责分析母婴产品线的用户数据。母婴产品的购买行为具有一定的周期性和生命周期特征&#xff0c;如用户在不同怀孕阶段的需求不同&#xff0c;以及宝宝出生后的不同成长阶段需要不同的产品。 2&#xff0…

前缀和(下)

目录 热身&#xff1a; 寻找数组的中心下标 题解&#xff1a; 代码&#xff1a; 进阶&#xff1a; 除自身之外数组的乘积 题解&#xff1a; 代码&#xff1a; 和为K的子数组 题解&#xff1a; 代码&#xff1a; 和可被 K 整除的子数组 题解&#xff1a; 同余定理…

postman教程-6-发送delete请求

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节我们学习了postman发送put请求的方法&#xff0c;本小节我们讲解一下postman发送delete请求的方法。 HTTP DELETE 请求是一种用于删除指定资源的请求方法。在RESTful API 设计中&#xff0c;DELETE 请求…

基础漏洞系列——CSRF跨站请求伪造

简介&#xff1a; 跨站请求伪造&#xff08;英语&#xff1a;Cross-site request forgery&#xff09;&#xff0c;也被称为 one-click attack或者 session riding&#xff0c;通常缩写为 CSRF或者 XSRF&#xff0c; 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操…

Spring Boot 2 入门基础

学习要求 ● 熟悉Spring基础 ● 熟悉Maven使用 环境要求 ● Java8及以上 ● Maven 3.3及以上&#xff1a;https://docs.spring.io/spring-boot/docs/current/reference/html/getting-started.html#getting-started-system-requirements 学习资料 ● 文档地址&#xff1a; htt…

QTP——功能测试

一、前言&#xff08;课设目的及内容&#xff09; QTP是quicktest Professional的简称&#xff0c;是一种自动测试工具。使用QTP的目的是想用它来执行重复的手动测试&#xff0c;主要是用于回归测试和测试同一软件的新版本。因此你在测试前要考虑好如何对应用程序进行测试&…

全局配置-案例:配置tabBar

一、需求&#xff1a;实现如图所示的tabBar效果 二、实现步骤&#xff1a; 1.拷贝图标资源 把image文件夹拷贝到小程序项目根目录中 图片中包含-active的是选中之后的图标 图片中不包含-active的是默认图标 2.新建3个对应的tab页面 3.配置tabBar选项 &#xff08;1&#xf…

五种不寻常的身份验证绕过技术

身份验证绕过漏洞是现代web应用程序中普遍存在的漏洞&#xff0c;也是隐藏最深很难被发现的漏洞。 为此安全防护人员不断在开发新的认证方法&#xff0c;保障组织的网络安全。尽管单点登录(SSO)等工具通常是对旧的登录用户方式的改进&#xff0c;但这些技术仍然可能包含严重的…

2024年西安交通大学程序设计校赛(ABCDEFO)

题目链接&#xff1a;https://vjudge.net/contest/630537#overview 文章目录 A题题意思路编程 B题题意思路编程 C题题意思路编程 D题题意思路编程 E题题意思路编程 F题题意思路编程 O题题意思路编程 写在前面&#xff1a;今天的训练赛出的题目偏简单&#xff0c;与XCPC的难度差…

什么是React?

01 Why React? What is React? I think the one-line description of React on its home page (https://react.dev/) is concise and accurate: “A JavaScript library for building user interfaces.” 我认为React主页(https://react.dev/)上的一行描述既简洁又准确: …

Java是长连接

Java是长连接&#xff0c;springboot进程被结束才断开 一个连接池有10个连接&#xff0c;2个并发会占用2个连接&#xff0c;用完之后归还给连接池 springboot服务用户的是线程池&#xff0c;返回结果之后&#xff0c;线程自动归还到线程池。跟php机制不一样 php是短链接&am…

关于网络的基础知识

大家好&#xff0c;在当今数字时代&#xff0c;网络已经成为我们生活中不可或缺的一部分&#xff0c;它连接着世界的每一个角落&#xff0c;让信息、资源和人们彼此之间无阻碍地交流和共享。然而&#xff0c;对于许多人来说&#xff0c;网络仍然是一个神秘而复杂的领域&#xf…