基于python实现生命游戏

文章目录

  • 一、生命游戏是什么
  • 二、生命游戏规则解释
    • 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 = 0if 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] = 1return 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_initfor label in labels:earth_init[label[0]][label[1]] = 1return earth_init
#判断每一代邻居生存状态
def cal(i, j):count = 0if 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] = 0else:if cal(i, j) == 3:earth[i][j] = 1return 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:breakpplot(earth)plt.close('all')print('='*20, i)print(sum(sum(earth)))earth_init = copy.deepcopy(earth)

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

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

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

相关文章

基于iptables 实现 ip 黑名单、白名单

1. 创建端口集合、黑名单ip集合、白名单ip 集合 2. 首次访问非正确的端口&#xff0c;即认为是黑名单ip 3. 若是黑名单ip 且不是白名单ip drop 4. 通过本次请求 标记为白名单ip ## 设置黑名单 ip ipset create scanner-ip-set hash:ip## 设置白名单 ipset create white-ip-s…

(超详细)字符函数和字符串函数【上】

前言 C 语言中对字符和字符串的处理很是频繁&#xff0c;但是 C 语言本身是没有字符串类型的&#xff0c;字符串通常放在 常量字符串 中或者 字符数组 中。 字符串常量 适用于那些对它不做修改的字符串函数 . 1.求字符串长度函数 strlen函数 我们要求一个字符串函数的长度…

Firefox国际版

Firefox国际版官方网址&#xff1a; Download the Firefox Browser in English (US) and more than 90 other languagesEveryone deserves access to the internet — your language should never be a barrier. That’s why — with the help of dedicated volunteers around…

C语言序列化和反序列化--TPL(一)

TPL TPL说明网站 C语言中高效的序列化 您可以使用tpl快速轻松地存储和重新加载C数据。Tpl是一个用于序列化C数据的库。数据以自然二进制形式存储。该API很小&#xff0c;并试图保持“不碍事”。Tpl可以序列化许多C数据类型&#xff0c;包括结构。Tpl与文件、内存缓冲区和文件…

使用cmd下载远程服务器的文件

直接上命令&#xff1a; scp root192.168.40.99:/home/nest/xc/…/img_return.png ./ 其中&#xff0c;root为username&#xff0c;后面为服务器地址&#xff0c;文件地址&#xff0c;./为下载到当前目录下

继承基础实战

文章目录 1.继承基础2.子类调用析构函数顺序3.继承中函数组合对象构造,析构函数调用4.重写父类同名的函数5.多重继承1.继承基础 2.子类调用析构函数顺序 3.继承中函数组合对象构造,析构函数调用 4.重写父类同名的函数 5.多重继承 #include <iostream> #include &l…

自学动态规划——爬楼梯(加强版)

爬楼梯&#xff08;加强版&#xff09; 57. 爬楼梯&#xff08;第八期模拟笔试&#xff09; (kamacoder.com) 虽然看起来和完全背包没有什么关系&#xff0c;实际上还是有背包的影子的。 首先&#xff0c;题目要求方法数量&#xff0c;那么就应该想到递推公式&#xff1a;dp…

【数据结构:排序算法】堆排序(图文详解)

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;数据结构课程学习 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 &#x1f369;1.大堆和小堆 &#x1f369;2.向上调整算法建堆和向下调整算法建堆&#xff1a;…

Kafka原生API使用Java代码-生产者-分区策略-默认分区策略轮询分区策略

文章目录 1、代码演示1.1、pom.xml1.2、KafkaProducerPartitioningStrategy.java1.2.1、ProducerConfig.LINGER_MS_CONFIG取 0 值得情况&#xff0c;不轮询1.2.2、ProducerConfig.LINGER_MS_CONFIG取 0 值得情况&#xff0c;轮询1.2.3、ProducerConfig.LINGER_MS_CONFIG取 1000…

python使用modbustcp协议与PLC进行简单通信

AI应用开发相关目录 本专栏包括AI应用开发相关内容分享&#xff0c;包括不限于AI算法部署实施细节、AI应用后端分析服务相关概念及开发技巧、AI应用后端应用服务相关概念及开发技巧、AI应用前端实现路径及开发技巧 适用于具备一定算法及Python使用基础的人群 AI应用开发流程概…

LFCDR:Latent mutual feature extraction for cross-domain recommendation

Latent mutual feature extraction for cross-domain recommendation Knowledge and Information Systems-Hoon Park , Jason J. Jung-2024 思路 大部分研究都是主要集中在同构域,所以在没有共同用户的情况下,项目和元数据的异构对推荐任务造成了限制。 于是提出一个异构的…

B/S架构+java语言+Mysqladr数 据 库ADR药物不良反应监测系统源码 ADR药物不良反应监测系统有哪些作用?

B/S架构&#xff0b;java语言&#xff0b;Mysqladr数 据 库ADR药物不良反应监测系统源码 ADR药物不良反应监测系统有哪些作用&#xff1f; 药物不良反应(ADR)是指在合格药物以正常用量和用法用于预防、诊断、治疗疾病或调节生理功能时所发生的意外的、与防治目的无关的、不利或…

AI Agent智能体概述及原理

AI Agent概述 AI Agent旨在理解、分析和响应人类输入&#xff0c;像人类一样执行任务、做出决策并与环境互动。它们可以是遵循预定义规则的简单系统&#xff0c;也可以是根据经验学习和适应的复杂、自主的实体&#xff1b;可以是基于软件的实体&#xff0c;也可以是物理实体。…

大模型“1元购”?AI公司加速奔向应用端“大航海时代”

自字节跳动发布豆包大模型&#xff0c;互联网大厂纷纷就位&#xff0c;击穿“地板价”的打法从C端向B端拓展。这也成为今年“618”最亮眼的价格战。 5月15日&#xff0c;字节跳动率先宣布豆包大模型已通过火山引擎开放给企业客户&#xff0c;大模型定价降至0.0008元/千Tokens&…

ubuntu22.04部署docker版zlmediakit和源码运行wvp-GB28181-pro

1 运行zlmediakit 1. 修改zlmediakit配置文件 先用run命令运行zlmediakit&#xff0c;将zlmediakit的配置文件拷贝出来 docker run -d -p 1935:1935 -p 8080:80 -p 8554:554 \ -p 10000:10000 -p 10000:10000/udp -p 8000:8000/udp \ --name zlmediakit \ zlmediakit/zlmedi…

嵌入式0基础开始学习 ⅠC语言(6)函数

0.问题引入 有时候&#xff0c;经常需要在一个程序中&#xff0c;对一个数组进行输入输出 如&#xff1a; int a[3][4]; int i,j; for(i0;i<3;i) { for(j0;j<4;j) …

风萧萧兮易水寒,壮士一去兮不复还 的 rm 命令

风萧萧兮易水寒&#xff0c;壮士一去兮不复还 的 rm 命令 风萧萧兮易水寒&#xff0c;壮士一去兮不复还 的 rm语法几个示例/bin/rm Argument list too long – Linux”配合find与xargs完成删除海量文件使用find的delete选项 快速删除大文件 风萧萧兮易水寒&#xff0c;壮士一去…

设计模式20——职责链模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用&#xff0c;主要是下面的UML图可以起到大作用&#xff0c;在你学习过一遍以后可能会遗忘&#xff0c;忘记了不要紧&#xff0c;只要看一眼UML图就能想起来了。同时也请大家多多指教。 职责链模式&#xff08;Chain …

FreeRTOS【8】二值信号量使用

1.开发背景 FreeRTOS 提供了队列可以在线程间快速交换信息&#xff0c;那么还有没有其他交互渠道&#xff1f;答案是有的&#xff0c;相对于队列传递信息&#xff0c;还有更轻量级的线程唤醒操作&#xff0c;那就是信号量&#xff0c;而二值信号量就是最简单的一种。 二值信号量…

解读一下15.52.34.160/27

IP地址15.52.34.160/27可以分解为两部分来解读&#xff1a; IP地址: 15.52.34.160 这是分配给网络接口的地址&#xff0c;用于在网络中标识一个特定的设备。 子网掩码: /27 这表示子网掩码是27位长&#xff0c;意味着网络部分占据了IP地址的前27位&#xff0c;剩下的5位用于主…