python康威生命游戏的图形化界面实现

news2025/4/21 20:05:46

康威生命游戏(Conway’s Game of Life)是由英国数学家约翰·何顿·康威(John Horton Conway)在1970年发明的一款零玩家的细胞自动机模拟游戏。尽管它的名字中有“游戏”,但实际上它并不需要玩家参与操作,而是通过初始条件下的设定让程序自动演化出各种复杂的图案和行为。

游戏规则

康威生命游戏在一个二维网格上进行,每个格子有两种状态:存活(通常用黑色表示)或死亡(通常用白色表示)。游戏的演变遵循以下三条简单的规则:

  1. 繁殖:如果一个死亡的细胞周围恰好有三个存活的邻居,那么这个细胞就会变成存活状态。
  2. 生存:如果一个存活的细胞周围有两个或三个存活的邻居,那么这个细胞继续保持存活状态。
  3. 死亡:所有其他情况下的存活细胞都会死亡;而所有其他情况下的死亡细胞都不会复活。

进化过程

游戏从一个初始配置开始,然后根据上述规则逐代进化。这些规则非常简单,但结果却异常复杂多变。一些初始模式会形成稳定不变的结构(如静止点、振荡器),还有一些模式会产生移动的对象(如滑翔机),甚至可以构建逻辑门和其他计算元件,理论上可以模拟任何计算机程序的行为。

用途与影响

康威生命游戏不仅是一种娱乐方式,还在以下几个方面产生了重要影响:

  • 计算机科学:展示了如何使用简单的规则产生复杂的系统,启发了研究复杂系统的科学家。
  • 生物学:帮助理解生物体自我复制和进化的机制。
  • 艺术与设计:许多艺术家利用其产生的图案进行创作。

示例

以下是一些著名的康威生命游戏中出现的图案示例:

  • 静止点(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 = 0
        for 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 += 1
        return count

    def 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] = 1
                elif self.grid[i][j] == 0 and neighbors == 3:  # 繁殖条件
                    new_grid[i][j] = 1
        self.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()  # 进入主事件循环,等待用户操作




效果图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

功能总结

  1. 初始化:创建一个随机填充的网格。
  2. 绘制网格:在画布上绘制当前网格的状态。
  3. 计算下一代:根据康威生命游戏的规则计算下一代的网格状态。
  4. 控制按钮
    • Start/Stop:启动或停止游戏的演化。
    • Reset:重置网格状态。
  5. 定时更新:每隔100毫秒更新一次网格状态。

技术要点

  • tkinter:用于创建图形用户界面(GUI)。
  • Canvas:用于绘制网格和单元格。
  • Button:用于控制游戏的开始、停止和重置。
  • Event Loop:通过root.mainloop()进入主事件循环,处理用户输入和定时任务。

这个代码提供了一个简单而有效的康威生命游戏的图形化实现,适合初学者学习如何使用tkinter库进行基本的GUI编程。

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

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

相关文章

区块链技术:Facebook 重塑社交媒体信任的新篇章

在这个信息爆炸的时代,社交媒体已经成为我们生活中不可或缺的一部分。然而,随着社交平台的快速发展,隐私泄露、数据滥用和虚假信息等问题也日益凸显。这些问题的核心在于传统社交媒体依赖于中心化服务器存储和管理用户数据,这种模…

UE求职Demo开发日志#25 试试网络同步和尝试打包

1 改了一些时序上的bug,成功运行了多端 (UE一些网络相关的功能都弄好了,只需要标记哪个变量或Actor需要复制) 2 以前遗留的bug太多了,改到晚上才打包好一个能跑的版本,而且有的特效还不显示(悲…

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 -…

天津三石峰科技——汽车生产厂的设备振动检测项目案例

汽车产线有很多传动设备需要长期在线运行,会出现老化、疲劳、磨损等 问题,为了避免意外停机造成损失,需要加装一些健康监测设备,监测设备运 行状态。天津三石峰科技采用 12 通道振动信号采集卡(下图 1)对…

Linux之文件IO前世今生

在 Linux之文件系统前世今生(一) VFS中,我们提到了文件的读写,并给出了简要的读写示意图,本文将分析文件I/O的细节。 一、Buffered I/O(缓存I/O)& Directed I/O(直接I/O&#…

半导体制造工艺讲解

目录 一、半导体制造工艺的概述 二、单晶硅片的制造 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 调整优先级实践 四、进程特性全景图 五、优化实践建议 结语 引言 在操…

微信小程序案例2——天气微信小程序(学会绑定数据)

文章目录 一、项目步骤1 创建一个无AppID的weather项目2 进入index.wxml、index.js、index.wxss文件,清空所有内容,进入App.json,修改导航栏标题为“中国天气网”。3进入index.wxml,进行当天天气情况的界面布局,包括温…

【Linux网络编程】之守护进程

【Linux网络编程】之守护进程 进程组进程组的概念组长进程 会话会话的概念会话ID 控制终端控制终端的概念控制终端的作用会话、终端、bash三者的关系 前台进程与后台进程概念特点查看当前终端的后台进程前台进程与后台进程的切换 作业控制相关概念作业状态(一般指后…

MarkupLM:用于视觉丰富文档理解的文本和标记语言预训练

摘要 结合文本、布局和图像的多模态预训练在视觉丰富文档理解(VRDU)领域取得了显著进展,尤其是对于固定布局文档(如扫描文档图像)。然而,仍然有大量的数字文档,其布局信息不是固定的&#xff0…

了解AI绘图,Stable Diffusion的使用

AI绘图对GPU算力要求较高。 个人电脑配置可参考: CPU:14600kf 盒装 显卡:RTX 4080金属大师 OC,16G显存 主板:z790吹雪d4 内存:芝奇皇家戟4000c18,162G 硬盘:宏基gm7000 1T 散热:追风…

Kokoro 开源文本转语音引擎上线!多语言支持,无需联网,浏览器内极速运行

Kokoro 是一款轻量级的开源文本转语音(TTS)引擎,凭借其高效能和轻量化设计,迅速在技术社区中引起关注。本文将详细介绍 Kokoro 的主要特点,并提供在浏览器和 Python 环境中的代码示例,帮助您快速上手。 1. Kokoro:可在浏览器中运行的 TTS 引擎 1.1 简介 Kokoro 是一个…

DeepSeek LLM 论文解读:相信长期主义开源理念可扩展大语言模型(DeepSeek 吹响通用人工智能的号角)

论文链接:DeepSeek LLM: Scaling Open-Source Language Models with Longtermism(相信长期主义开源理念可扩展大语言模型) 目录 摘要一、数据处理(一)数据清洗与丰富(二)分词器与词汇设置 二、模…

fastchat 部署大模型

大模型实战--Llama3.1大模型部署及启动Web UI、OpenAI API实操 - 简书一、背景 随着人工智能技术的飞速发展,大模型(Large Language Models, LLMs)已成为自然语言处理领域的核心工具。这些模型以其强大的语言理解和生成能力,...ht…

【安当产品应用案例100集】037-强化OpenVPN安全防线的卓越之选——安当ASP身份认证系统

在当前数字化时代,网络安全已成为企业发展的重要组成部分。对于使用OpenVPN的企业而言,确保远程访问的安全性尤为重要。安当ASP身份认证系统凭借其强大的功能和便捷的集成方式,为OpenVPN的二次登录认证提供了理想的解决方案,特别是…