现代算法可视化(一)、python实现生命游戏(元胞自动机)

2024-03-23 09:10

本文主要是介绍现代算法可视化(一)、python实现生命游戏(元胞自动机),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

效果展示

在这里插入图片描述

规则介绍

基于二维元胞自动机的生命游戏可视化实现
规则:蓝色方块代表生命

  1. 有颜色的方块代表生命,无颜色的方块代表死亡
  2. 一个细胞周围有八个细胞,对于一个活细胞来说,如果它周围的八个细胞中:
    如果只有一个或没有一个是活的,那这个细胞就会死亡
    如果其中两个或者三个细胞是活的,那这个细胞就能维持生命
    如果超过3个细胞是活着的,那这个细胞就会因为过于拥挤而死亡
  3. 对于一个死细胞来说,如果这个细胞周围如果有三个细胞存活,该将获得新生。

附:所有规则都可以修改,种群初始密度也可以修改。本实验采用初始化人口随机分布,也可以自定义初始化人口分布以及网格大小得到滑翔机,播种机等复杂美观图形。

源码

'''
demoName:life simulation game
principle: cellular automata (two dimensional)
the rule of the game :
1. colored cell represents life, uncolored cell represents death
2. a cell has eight cells around it, to a live cell:
2.1 if only one or none of them are live, the cell will die
2.2 if two or three of them are live, the cell will sustain life
2.4 if more than three of them are live, the cell will die
3. to a dead cell, if there are three alive around it ,the cell will gain life
'''import pygame
import sys 
import math 
import random
import copypygame.init()
chess_number=60					# 设置棋盘大小
LIVEDENSITY=0.3						#生命密度
TICK=10								#帧数
BG=(20,20,20)					#背景色
LINECOLOR=(52,53,46)				#网格色
LIFECOLOR=(31,97,189)				#活细胞的颜色
CELL_LENGTH=int(600/chess_number)	#每个格子的像素大小
LINE_WIDTH=4						#线的宽度
START_POSX=50
START_POSY=50
#239,60,57 红色		79,167,47绿色		188,69,229 紫色
#224,90,9 橙色		252,61,63大红
#188,69,229	紫色		239,60,57 红
#39,202,149 天绿	31,97,189蓝色		22,178,243 天蓝# 设置背景框大小
size = width, height = 2*START_POSX+chess_number*CELL_LENGTH,2*START_POSY+chess_number*CELL_LENGTH
# 设置帧率,返回clock 类
clock = pygame.time.Clock()
screen = pygame.display.set_mode(size)
pygame.display.set_caption("Accelerator made")#画
def draw(livcell):'''进行一次绘画操作,可以理解为进行一帧操作所更新的画面param:操作前活细胞图return:操作后活细胞图'''for i in range(chess_number+1):pygame.draw.line(screen, LINECOLOR, (START_POSX,START_POSY+i*CELL_LENGTH), (START_POSX+chess_number*CELL_LENGTH,START_POSY+i*CELL_LENGTH), LINE_WIDTH)#横线pygame.draw.line(screen, LINECOLOR, (START_POSX+i*CELL_LENGTH,START_POSY),(START_POSX+i*CELL_LENGTH,START_POSY+chess_number*CELL_LENGTH), LINE_WIDTH)#竖线##画活细胞livcell=rule(livcell)print('drawnew',livcell)return livcelldef drawcell(i,j,cellkind):'''画出一个具体的方块param:行,列,方块颜色种类'''pygame.draw.rect(screen,cellkind,[START_POSX+CELL_LENGTH*j+(LINE_WIDTH-1),START_POSY+CELL_LENGTH*i+(LINE_WIDTH-1),CELL_LENGTH-LINE_WIDTH,CELL_LENGTH-LINE_WIDTH],0)#终点.  Rect(left,top,width,height)def creatlife(density):'''在初始状态下创造生命param:所要求生成生命细胞的密度return:初始生命细胞的位置图'''livcell=[[0]*chess_number for i in range(chess_number)]for i in range(chess_number):for j in range(chess_number):pwall=random.random()if pwall<density:livcell[i][j]=1return livcelldef neighborcell(pos):'''获得一个细胞周围的细胞位置,并且存入数组param:细胞的位置return:这个细胞所有的邻居细胞'''neighborList=[]x=pos[0]y=pos[1]neighborList=[[x-1,y-1],[x-1,y],[x-1,y+1],[x,y-1],[x,y+1],[x+1,y-1],[x+1,y],[x+1,y+1]]realnList=copy.deepcopy(neighborList)for i in neighborList:if i[0]<0 or i[0]>chess_number-1 or i[1]<0 or i[1]>chess_number-1:realnList.remove(i)return realnListdef rule(livcell):'''制定生命游戏的游戏规则param:一次操作前所有活着细胞的位置return:一次操作后所有活着细胞的位置'''newlivcell=copy.deepcopy(livcell)print('livcell',livcell)for i in range(chess_number):for j in range(chess_number):if livcell[i][j]==1:drawcell(i,j,LIFECOLOR)alive=0for cell in neighborcell([i,j]):if livcell[cell[0]][cell[1]]==1:alive+=1if alive==0 or alive==1:newlivcell[i][j]=0elif alive==2 or alive==3:newlivcell[i][j]=1else:newlivcell[i][j]=0else:alive=0for cell in neighborcell([i,j]):if livcell[cell[0]][cell[1]]==1:alive+=1if alive==3:newlivcell[i][j]=1return newlivcelldef main():livcell=creatlife(LIVEDENSITY)while True:for event in pygame.event.get():# 查找关闭窗口事件if event.type == pygame.QUIT:sys.exit()# 填充背景色screen.fill(BG)livcell=draw(livcell)# 刷新图spygame.display.flip()clock.tick(TICK)if __name__=="__main__":main()

这篇关于现代算法可视化(一)、python实现生命游戏(元胞自动机)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/837835

相关文章

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

MySQL双主搭建+keepalived高可用的实现

《MySQL双主搭建+keepalived高可用的实现》本文主要介绍了MySQL双主搭建+keepalived高可用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、测试环境准备二、主从搭建1.创建复制用户2.创建复制关系3.开启复制,确认复制是否成功4.同

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

opencv图像处理之指纹验证的实现

《opencv图像处理之指纹验证的实现》本文主要介绍了opencv图像处理之指纹验证的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、简介二、具体案例实现1. 图像显示函数2. 指纹验证函数3. 主函数4、运行结果三、总结一、