python康威生命游戏的图形化界面实现
康威生命游戏(Conway’s Game of Life)是由英国数学家约翰·何顿·康威(John Horton Conway)在1970年发明的一款零玩家的细胞自动机模拟游戏。尽管它的名字中有“游戏”,但实际上它并不需要玩家参与操作,而是通过初始条件下的设定让程序自动演化出各种复杂的图案和行为。
游戏规则
康威生命游戏在一个二维网格上进行,每个格子有两种状态:存活(通常用黑色表示)或死亡(通常用白色表示)。游戏的演变遵循以下三条简单的规则:
- 繁殖:如果一个死亡的细胞周围恰好有三个存活的邻居,那么这个细胞就会变成存活状态。
- 生存:如果一个存活的细胞周围有两个或三个存活的邻居,那么这个细胞继续保持存活状态。
- 死亡:所有其他情况下的存活细胞都会死亡;而所有其他情况下的死亡细胞都不会复活。
进化过程
游戏从一个初始配置开始,然后根据上述规则逐代进化。这些规则非常简单,但结果却异常复杂多变。一些初始模式会形成稳定不变的结构(如静止点、振荡器),还有一些模式会产生移动的对象(如滑翔机),甚至可以构建逻辑门和其他计算元件,理论上可以模拟任何计算机程序的行为。
用途与影响
康威生命游戏不仅是一种娱乐方式,还在以下几个方面产生了重要影响:
- 计算机科学:展示了如何使用简单的规则产生复杂的系统,启发了研究复杂系统的科学家。
- 生物学:帮助理解生物体自我复制和进化的机制。
- 艺术与设计:许多艺术家利用其产生的图案进行创作。
示例
以下是一些著名的康威生命游戏中出现的图案示例:
- 静止点(Still Life):这种模式在一代到下一代之间保持不变。例如,块(Block)、蜂窝(Beehive)等。
- 振荡器(Oscillator):这种模式会在固定数量的世代后回到原始状态。例如,闪烁灯(Blinker)、托盘(Toad)等。
- 滑翔机(Glider):一种能够无限期地移动而不改变形状的模式。
- R-Pentomino:一种由五个单元组成的初始模式,它可以演化成一系列复杂的动态结构。
康威生命游戏以其简单规则产生复杂行为的能力,成为了探索复杂系统的一个经典案例。
这段代码实现了一个图形化的康威生命游戏(Conway’s Game of Life)。它使用了Python的tkinter库来创建图形用户界面(GUI),并通过简单的规则模拟细胞自动机的行为。以下是代码的详细注释:
import tkinter as tk # 导入tkinter库,用于创建图形用户界面
import random # 导入random库,用于随机初始化细胞状态class GameOfLife:def __init__(self, master, width=40, height=20, cell_size=20):"""初始化GameOfLife类的实例。:param master: 主窗口对象:param width: 网格的宽度(列数):param height: 网格的高度(行数):param cell_size: 每个单元格的大小(像素)"""self.master = master # 设置主窗口对象self.width = width # 设置网格的宽度self.height = height # 设置网格的高度self.cell_size = cell_size # 设置每个单元格的大小self.grid = [[0 for _ in range(width)] for _ in range(height)] # 初始化网格,所有单元格初始为死亡状态(0)self.canvas = tk.Canvas(master, width=width * cell_size, height=height * cell_size) # 创建画布对象self.canvas.pack() # 将画布添加到主窗口中self.initialize_cells() # 随机初始化细胞状态self.draw_grid() # 绘制初始网格self.running = False # 初始状态下游戏不运行self.start_button = tk.Button(master, text="Start", command=self.toggle_running) # 创建“Start”按钮self.start_button.pack(side=tk.LEFT) # 将“Start”按钮添加到主窗口左侧self.reset_button = tk.Button(master, text="Reset", command=self.reset_grid) # 创建“Reset”按钮self.reset_button.pack(side=tk.RIGHT) # 将“Reset”按钮添加到主窗口右侧def initialize_cells(self):"""随机初始化网格中的细胞状态。"""for i in range(self.height):for j in range(self.width):self.grid[i][j] = random.choice([0, 1]) # 随机选择每个单元格的状态(存活或死亡)def draw_grid(self):"""在画布上绘制当前网格的状态。"""self.canvas.delete("all") # 清除画布上的所有内容for i in range(self.height):for j in range(self.width):color = "black" if self.grid[i][j] else "white" # 根据单元格状态设置颜色x1 = j * self.cell_size # 计算单元格左上角x坐标y1 = i * self.cell_size # 计算单元格左上角y坐标x2 = x1 + self.cell_size # 计算单元格右下角x坐标y2 = y1 + self.cell_size # 计算单元格右下角y坐标self.canvas.create_rectangle(x1, y1, x2, y2, fill=color, outline="gray") # 绘制单元格矩形def get_neighbors_count(self, x, y):"""计算指定单元格周围的存活邻居数量。:param x: 单元格的行索引:param y: 单元格的列索引:return: 周围存活邻居的数量"""count = 0for i in range(max(0, x-1), min(x+2, self.height)):for j in range(max(0, y-1), min(y+2, self.width)):if (i != x or j != y) and self.grid[i][j]: # 忽略自身单元格count += 1return countdef next_generation(self):"""根据康威生命游戏规则计算下一代的网格状态。"""new_grid = [[0 for _ in range(self.width)] for _ in range(self.height)] # 初始化新的网格for i in range(self.height):for j in range(self.width):neighbors = self.get_neighbors_count(i, j) # 获取当前单元格周围的存活邻居数量if self.grid[i][j] == 1 and neighbors in [2, 3]: # 生存条件new_grid[i][j] = 1elif self.grid[i][j] == 0 and neighbors == 3: # 繁殖条件new_grid[i][j] = 1self.grid = new_grid # 更新网格状态self.draw_grid() # 绘制更新后的网格def update(self):"""定时更新网格状态,每100毫秒调用一次next_generation方法。"""if self.running:self.next_generation() # 如果游戏正在运行,则计算下一代self.master.after(100, self.update) # 每100毫秒再次调用update方法def toggle_running(self):"""切换游戏的运行状态,并更新按钮文本。"""self.running = not self.running # 切换运行状态if self.running:self.start_button.config(text="Stop") # 如果游戏正在运行,则将按钮文本改为“Stop”else:self.start_button.config(text="Start") # 如果游戏暂停,则将按钮文本改为“Start”def reset_grid(self):"""重置网格状态并停止游戏。"""self.grid = [[0 for _ in range(self.width)] for _ in range(self.height)] # 初始化网格,所有单元格初始为死亡状态self.draw_grid() # 绘制重置后的网格self.running = False # 停止游戏self.start_button.config(text="Start") # 将按钮文本改为“Start”if __name__ == "__main__":root = tk.Tk() # 创建主窗口对象root.title("Conway's Game of Life") # 设置窗口标题game = GameOfLife(root) # 创建GameOfLife实例game.update() # 启动定时更新机制root.mainloop() # 进入主事件循环,等待用户操作
效果图



功能总结
- 初始化:创建一个随机填充的网格。
- 绘制网格:在画布上绘制当前网格的状态。
- 计算下一代:根据康威生命游戏的规则计算下一代的网格状态。
- 控制按钮:
- Start/Stop:启动或停止游戏的演化。
- Reset:重置网格状态。
- 定时更新:每隔100毫秒更新一次网格状态。
技术要点
- tkinter:用于创建图形用户界面(GUI)。
- Canvas:用于绘制网格和单元格。
- Button:用于控制游戏的开始、停止和重置。
- Event Loop:通过
root.mainloop()进入主事件循环,处理用户输入和定时任务。
这个代码提供了一个简单而有效的康威生命游戏的图形化实现,适合初学者学习如何使用tkinter库进行基本的GUI编程。
相关文章:
python康威生命游戏的图形化界面实现
康威生命游戏(Conway’s Game of Life)是由英国数学家约翰何顿康威(John Horton Conway)在1970年发明的一款零玩家的细胞自动机模拟游戏。尽管它的名字中有“游戏”,但实际上它并不需要玩家参与操作,而是通…...
区块链技术:Facebook 重塑社交媒体信任的新篇章
在这个信息爆炸的时代,社交媒体已经成为我们生活中不可或缺的一部分。然而,随着社交平台的快速发展,隐私泄露、数据滥用和虚假信息等问题也日益凸显。这些问题的核心在于传统社交媒体依赖于中心化服务器存储和管理用户数据,这种模…...
【自学笔记】文言一心的基础知识点总览-持续更新
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 文心一言知识点总览一、文心一言简介二、文心一言的核心功能三、文心一言的技术特点四、文心一言的应用场景五、文心一言的使用技巧六、文心一言的未来发展 总结 文…...
UE求职Demo开发日志#25 试试网络同步和尝试打包
1 改了一些时序上的bug,成功运行了多端 (UE一些网络相关的功能都弄好了,只需要标记哪个变量或Actor需要复制) 2 以前遗留的bug太多了,改到晚上才打包好一个能跑的版本,而且有的特效还不显示(悲…...
2021 年 9 月青少年软编等考 C 语言五级真题解析
目录 T1. 问题求解思路分析T2. 抓牛思路分析T3. 交易市场思路分析T4. 泳池思路分析T1. 问题求解 给定一个正整数 N N N,求最小的 M M M 满足比 N N N 大且 M M M 与 N N N 的二进制表示中有相同数目的 1 1 1。 举个例子,假如给定 N N N 为 78 78 78,二进制表示为 …...
Win10环境使用ChatBox集成Deep Seek解锁更多玩法
Win10环境使用ChatBox集成Deep Seek解锁更多玩法 前言 之前部署了14b的Deep Seek小模型,已经验证了命令行及接口方式的可行性。但是纯命令行或者PostMan方式调用接口显然不是那么友好: https://lizhiyong.blog.csdn.net/article/details/145505686 纯…...
第 26 场 蓝桥入门赛
2.对联【算法赛】 - 蓝桥云课 问题描述 大年三十,小蓝和爷爷一起贴对联。爷爷拿出了两副对联,每副对联都由 N 个“福”字组成,每个“福”字要么是正的(用 1 表示),要么是倒的(用 0 表示&#…...
CodeGPT + IDEA + DeepSeek,在IDEA中引入DeepSeek实现AI智能开发
CodeGPT IDEA DeepSeek,在IDEA中引入DeepSeek 版本说明 建议和我使用相同版本,实测2022版IDEA无法获取到CodeGPT最新版插件。(在IDEA自带插件市场中搜不到,可以去官网搜索最新版本) ToolsVersionIntelliJ IDEA202…...
【2025年更新】1000个大数据/人工智能毕设选题推荐
文章目录 前言大数据/人工智能毕设选题:后记 前言 正值毕业季我看到很多同学都在为自己的毕业设计发愁 Maynor在网上搜集了1000个大数据的毕设选题,希望对大家有帮助~ 适合大数据毕业设计的项目,完全可以作为本科生当前较新的毕…...
什么是中间件中间件有哪些
什么是中间件? 中间件(Middleware)是指在客户端和服务器之间的一层软件组件,用于处理请求和响应的过程。 中间件是指介于两个不同系统之间的软件组件,它可以在两个系统之间传递、处理、转换数据,以达到协…...
使用docker搭建FastDFS文件服务
1.拉取镜像 docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/fastdfs:latest2.使用docker镜像构建tracker容器(跟踪服务器,起到调度的作用) docker run -dti --networkhost --name tracker -v /data/fdfs/tracker:/var/fdfs -…...
使用OpenGL自己定义一个button,响应鼠标消息:掠过、点击、拖动
button需要有一个外观 外观 大小跟随窗口改变,采用纯色背景、纯色文字 文字 大小跟随窗口改变 button需要获得鼠标消息 掠过 鼠标掠过时 button 出现阴影,鼠标掠过后 button 阴影消失 点击 点击后进入相应事件 拖动 改变图标所在位置 需要在g…...
天津三石峰科技——汽车生产厂的设备振动检测项目案例
汽车产线有很多传动设备需要长期在线运行,会出现老化、疲劳、磨损等 问题,为了避免意外停机造成损失,需要加装一些健康监测设备,监测设备运 行状态。天津三石峰科技采用 12 通道振动信号采集卡(下图 1)对…...
Linux之文件IO前世今生
在 Linux之文件系统前世今生(一) VFS中,我们提到了文件的读写,并给出了简要的读写示意图,本文将分析文件I/O的细节。 一、Buffered I/O(缓存I/O)& Directed I/O(直接I/O&#…...
Java中实现定时锁屏的功能(可以指定时间执行)
Java中实现定时锁屏的功能(可以指定时间执行) 要在Java中实现定时锁屏的功能,可以使用java.util.Timer或java.util.concurrent.ScheduledExecutorService来调度任务,并通过调用操作系统的命令来执行锁屏。下面我将给出一个基本的…...
半导体制造工艺讲解
目录 一、半导体制造工艺的概述 二、单晶硅片的制造 1.单晶硅的制造 2.晶棒的切割、研磨 3.晶棒的切片、倒角和打磨 4.晶圆的检测和清洗 三、晶圆制造 1.氧化与涂胶 2.光刻与显影 3.刻蚀与脱胶 4.掺杂与退火 5.薄膜沉积、金属化和晶圆减薄 6.MOSFET在晶圆表面的形…...
深入理解进程优先级
目录 引言 一、进程优先级基础 1.1 什么是进程优先级? 1.2 优先级与系统性能 二、查看进程信息 2.1 使用ps -l命令 2.2 PRI与NI的数学关系 三、深入理解Nice值 3.1 Nice值的特点 3.2 调整优先级实践 四、进程特性全景图 五、优化实践建议 结语 引言 在操…...
python中的flask框架
Flask 是一个用Python编写的轻量级Web应用框架 基于WSGI和Jinja2模板引擎 被称为“微框架”,其核心功能简单,不捆绑数据库管理、表单验证等功能,而是通过扩展来增加其他功能 Flask提供最基本的功能,不强制使用特定工具或库 通…...
微信小程序案例2——天气微信小程序(学会绑定数据)
文章目录 一、项目步骤1 创建一个无AppID的weather项目2 进入index.wxml、index.js、index.wxss文件,清空所有内容,进入App.json,修改导航栏标题为“中国天气网”。3进入index.wxml,进行当天天气情况的界面布局,包括温…...
【Linux网络编程】之守护进程
【Linux网络编程】之守护进程 进程组进程组的概念组长进程 会话会话的概念会话ID 控制终端控制终端的概念控制终端的作用会话、终端、bash三者的关系 前台进程与后台进程概念特点查看当前终端的后台进程前台进程与后台进程的切换 作业控制相关概念作业状态(一般指后…...
MarkupLM:用于视觉丰富文档理解的文本和标记语言预训练
摘要 结合文本、布局和图像的多模态预训练在视觉丰富文档理解(VRDU)领域取得了显著进展,尤其是对于固定布局文档(如扫描文档图像)。然而,仍然有大量的数字文档,其布局信息不是固定的࿰…...
了解AI绘图,Stable Diffusion的使用
AI绘图对GPU算力要求较高。 个人电脑配置可参考: CPU:14600kf 盒装 显卡:RTX 4080金属大师 OC,16G显存 主板:z790吹雪d4 内存:芝奇皇家戟4000c18,162G 硬盘:宏基gm7000 1T 散热:追风…...
jakarta EE学习笔记-个人笔记
WebServlet注解:声明一个类为Servlet Target({ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) Documented public interface WebServlet {// 指定Servlet的影子String name() default ""; // 匹配地址映射(URL)String[] value() default {};// …...
Kokoro 开源文本转语音引擎上线!多语言支持,无需联网,浏览器内极速运行
Kokoro 是一款轻量级的开源文本转语音(TTS)引擎,凭借其高效能和轻量化设计,迅速在技术社区中引起关注。本文将详细介绍 Kokoro 的主要特点,并提供在浏览器和 Python 环境中的代码示例,帮助您快速上手。 1. Kokoro:可在浏览器中运行的 TTS 引擎 1.1 简介 Kokoro 是一个…...
VSCode使用总结
1、VSCode左边资源窗口字体大小设置 方法一(使用,已成功) 进入安装目录Microsoft VS Code\resources\app\out\vs\workbench(如果是下载的压缩包,解压后resources\app\out\vs\workbench) 打开文件 workbench.desktop.main.css 搜…...
淘宝分类详情数据获取:Python爬虫的高效实现
在电商领域,淘宝作为中国最大的电商平台之一,其分类详情数据对于市场分析、竞争对手研究以及电商运营优化具有不可估量的价值。通过Python爬虫技术,我们可以高效地获取这些数据,为电商从业者提供强大的数据支持。 一、为什么选择…...
DeepSeek LLM 论文解读:相信长期主义开源理念可扩展大语言模型(DeepSeek 吹响通用人工智能的号角)
论文链接:DeepSeek LLM: Scaling Open-Source Language Models with Longtermism(相信长期主义开源理念可扩展大语言模型) 目录 摘要一、数据处理(一)数据清洗与丰富(二)分词器与词汇设置 二、模…...
嵌入式AI革命:DeepSeek开源如何终结GPU霸权,开启单片机智能新时代?
2025年,全球AI领域最震撼的突破并非来自算力堆叠的超级模型,而是中国团队DeepSeek通过开源策略,推动大模型向微型化、低功耗场景的跨越。相对于当人们还在讨论千亿参数模型的训练成本被压缩到600万美金而言,被称作“核弹级别”的操…...
【EPSG 坐标系系统完全解析(二)(万字详述)】
地理坐标系系统完全解析(万字详述) 第一章 坐标系基础理论(2000字) 1.1 地球空间参照系 1.1.1 地球椭球体模型 参考椭球参数对比: 椭球体长半轴(m)短半轴(m)使用国家/…...
fastchat 部署大模型
大模型实战--Llama3.1大模型部署及启动Web UI、OpenAI API实操 - 简书一、背景 随着人工智能技术的飞速发展,大模型(Large Language Models, LLMs)已成为自然语言处理领域的核心工具。这些模型以其强大的语言理解和生成能力,...ht…...
