基于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.rhkb.cn/news/336444.html

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

相关文章

基于深度学习的中文情感分析系统python flask

基于python的毕业设计 基于深度学习的中文情感分析系统(flask)(源码说明文档演示) 毕业设计课程设计期末大作业、课程设计、高分必看&#xff0c;下载下来&#xff0c;简单部署&#xff0c;就可以使用。 包含&#xff1a;项目源码、数据库脚本、软件工具等&#xff0c;该项目…

NVR对接三方相机预览黑屏问题案例

一、 问题现象 【问题现象】NVR接入三方相机,通道状态显示在线,但本地、web预览显示黑屏。更换H.264&#xff0c;H.265均预览黑屏&#xff0c;且NVR侧的萤石云手机APP预览报错260025。 【现场拓扑】现场拓扑如下 &#xff08;1&#xff09; IPC使用onvif协议添加至NVR&#xff…

全局配置-案例:配置tabBar

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

【本地运行chatgpt-web】启动前端项目和service服务端项目,也是使用nodejs进行开发的。两个都运行成功才可以使用!

1&#xff0c;启动web界面 https://github.com/Chanzhaoyu/chatgpt-web#node https://nodejs.org/en/download/package-manager # 使用nvm 安装最新的 20 版本。 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash source /root/.bashrc n…

MVS net笔记和理解

文章目录 传统的方法有什么缺陷吗&#xff1f;MVSnet深度的预估 传统的方法有什么缺陷吗&#xff1f; 传统的mvs算法它对图像的光照要求相对较高&#xff0c;但是在实际中要保证照片的光照效果很好是很难的。所以传统算法对镜面反射&#xff0c;白墙这种的重建效果就比较差。 …

SSE(Server Sent Event) 踩坑留念

整条链路是 客户端A --> 服务端 A —> 服务端 B 我负责服务端 A 此时要注意 Client 中的 processes 的写法 Post(value “/v2/xx”, processes MediaType.TEXT_EVENT_STREAM) 这样写是一直报错的 改成下面的写法才可以 Post(value “/v2/xx”, processes MediaT…

看看最新的B端登录界面,你是不是被潮流抛弃了?

毛玻璃风格&#xff08;Frosted Glass Style&#xff09;是新拟态设计风格中的一种分支&#xff0c;它灵感来源于现实世界中的毛玻璃材质。毛玻璃是一种通过在玻璃表面加工处理的方式&#xff0c;使其具有模糊、云翳和透明效果的特殊玻璃。 在设计中&#xff0c;毛玻璃风格通常…

WPF中CommandParameter用法

1. 界面样式 2. XAML中代码部分 <ButtonGrid.Row"0"Grid.Column"1"Command"{Binding BtnClick_Number}"CommandParameter"7"Content"7"Style"{StaticResource BtnStyle_Num}" /> <ButtonGrid.Row"…

华发股份:加强业务协同 新政下项目热销

“5.17”楼市政策出台后&#xff0c;各地密集落地执行。5月27—28日&#xff0c;上海、广州、深圳三个一线城市跟进落地“517”新政。上海发布《关于优化本市房地产市场平稳健康发展政策措施的通知》&#xff0c;共计9条调整政策&#xff0c;涵盖外地户籍、人才、单身、婚否、企…

Python数据处理,使用 tkinter 模块点击获取文件目录

Python数据处理&#xff0c;使用 tkinter 模块点击获取文件目录 正文 正文 当我们进行数据处理读取文件内数据的时候&#xff0c;通常&#xff0c;我们需要设定好一个存放当前文件所在目录的变量。比如如下目录&#xff1a; file_path rC:\Users\xxx\Desktop\DataSet\Data.c…

【OrangePi AIpro】开箱初体验以及OAK深度相机测试

1. 简介 Orangepi AIPRO 是一款采用昇腾AI技术路线&#xff0c;集成4核64位处理器AI处理器的单板计算机&#xff0c;集成图形处理器&#xff0c;支持8TOPS AI算力&#xff0c;拥有8GB/16GB LPDDR4X&#xff0c;可以外接eMMC模块&#xff0c;支持双4K高清输出。 Orange Pi AIpr…

Docker-一文详解容器通信的基础网络模式及衍生的自定义网络模式

启动容器时&#xff0c;通过-p 宿主机端口:容器端口&#xff0c;就可以通过访问宿主机端口访问到容器&#xff0c;这种原理机制是啥&#xff0c;有没有其它方式可以让宿主机和容器通信&#xff0c;以及容器与容器之间如何通信。带着这几个问题开始学习Docker的网络知识。 文章…

0.25W 1.5KVDC~3KVDC 隔离超小型单输出 DC/DC 电源模块——TKE-W25系列

TKE-W25系列隔离超小型单输出 DC/DC 电源模块是一款超小型单输出电源模块&#xff0c;工业级环境温度&#xff0c;用于PCB安装的国际标准结构。此系列产品小巧&#xff0c;效率高&#xff0c;低输出纹波,用于需要电压转换和隔离的场合&#xff0c;封装有SIP和DIP可选。

英语学习笔记29——Come in, Amy!

Come in, Amy! 进来&#xff0c;艾米&#xff01; shut v. 关严 区别&#xff1a;shut the door 把门关紧 口语&#xff1a;Shut up! 闭嘴&#xff01;    态度强硬&#xff0c;不礼貌 例句&#xff1a;请不要把门关严。    Don’t shut the door, please. bedroom n. …

AlexNet,LeNet-5,ResNet,VGG-19,VGG-16模型

模型 AlexNet导入必要的库&#xff1a;加载类别名称&#xff1a;创建标签映射字典&#xff1a;加载图像数据和对应的标签&#xff1a;构建AlexNet模型&#xff1a;编译模型&#xff1a;训练模型&#xff1a; LeNet-5导入必要的库&#xff1a;加载类别名称&#xff1a;创建标签映…

Hadoop概览以及编译hadoop说明

一、Hadoop概述 Hadoop 是一个用于跨计算机集群存储和处理大型数据集的软件框架。它旨在处理大数据&#xff0c;即传统数据库无法有效管理的极其庞大和复杂的数据集。Hadoop不是传统意义上的数据仓库&#xff0c;因为它们的用途不同&#xff0c;架构也不同。Hadoop 是一个跨分布…

在Visual Studio Code和Visual Studio 2022下配置Clang-Format,格式化成Google C++ Style

项目开发要求好的编写代码格式规范&#xff0c;常用的是根据Google C Style Guide 网上查了很多博文&#xff0c;都不太一样有的也跑不起来&#xff0c;通过尝试之后&#xff0c;自己可算折腾好了&#xff0c;整理一下过程 背景&#xff1a; 编译器主要有三部分&#xff1a;前…

Django 里如何使用 sqlite (操作步骤)

在 settings.py 里&#xff0c;已经设定好 sqlite 了 DATABASES {default: {ENGINE: django.db.backends.sqlite3,NAME: BASE_DIR / db.sqlite3,} }必须得设置好app # 在 settings.py 里INSTALLED_APPS [django.contrib.admin,django.contrib.auth,django.contrib.contentt…

科技产业园3D探秘:未来科技之城的奇幻之旅

在数字时代的浪潮中&#xff0c;科技产业园区成为了推动城市经济发展、科技创新的重要引擎。 当我们打开科技产业园的3D可视化模型&#xff0c;仿佛穿越时空&#xff0c;来到了一个充满奇幻色彩的科技世界。在这里&#xff0c;高楼大厦鳞次栉比&#xff0c;绿色植被点缀其间&am…

React(四)memo、useCallback、useMemo Hook

目录 (一)memo API 1.先想一个情景 2.用法 (1)props传入普通数据类型的情况 (2)props传入对象的情况 (3)props传入函数的情况 (4)使用自定义比较函数 3.什么时候使用memo&#xff1f; (二)useMemo Hook 1.用法 2.useMemo实现组件记忆化 3.useMemo实现函数记忆化 …