当前位置: 首页 > news >正文

手把手教你用ipycanvas实现Conway‘s Game of Life生命游戏

手把手教你用ipycanvas实现Conway's Game of Life生命游戏

【免费下载链接】ipycanvasInteractive Canvas in Jupyter项目地址: https://gitcode.com/gh_mirrors/ip/ipycanvas

ipycanvas是一款强大的Jupyter交互式画布工具,能帮助开发者轻松创建动态图形和交互式应用。本文将带你快速掌握如何使用ipycanvas实现经典的Conway's Game of Life生命游戏,无需复杂编程知识,只需简单几步即可拥有自己的生命演化模拟系统。

准备工作:安装ipycanvas的最快方法

开始之前,我们需要先安装ipycanvas。对于新手用户,推荐使用pip或conda这两种简单方式:

使用pip安装(推荐)

pip install ipycanvas

使用conda安装

conda install -c conda-forge ipycanvas

如果你想进行开发或贡献代码,可以参考开发安装指南(详见docs/installation.rst)。

生命游戏简介:让细胞自动演化的神奇规则 🦠

Conway's Game of Life是由英国数学家约翰·康威在1970年发明的细胞自动机。它由一个二维网格组成,每个细胞有"存活"或"死亡"两种状态,根据以下简单规则演化:

  • 存活规则:当一个存活细胞周围有2-3个存活邻居时,它会继续存活
  • 诞生规则:当一个死亡细胞周围恰好有3个存活邻居时,它会变成存活状态
  • 死亡规则:其他情况下,细胞会死亡或保持死亡状态

这些简单规则能产生极其复杂的演化模式,从稳定结构到周期性震荡,甚至能模拟移动的"滑翔机"!

图:使用ipycanvas实现的Conway's Game of Life生命游戏界面,展示了多种细胞模式的演化过程

实现步骤:从0到1创建生命游戏

第一步:导入必要的库

首先,我们需要导入ipycanvas和其他辅助库:

from time import sleep import numpy as np from ipycanvas import RoughCanvas, hold_canvas

这里使用RoughCanvas可以创建具有手绘风格的图形,让我们的生命游戏看起来更有艺术感!

第二步:实现生命游戏核心逻辑

接下来,我们需要实现生命游戏的核心演化函数life_step,它会根据当前细胞状态计算下一代状态:

def life_step(x): """Game of life step""" nbrs_count = sum(np.roll(np.roll(x, i, 0), j, 1) for i in (-1, 0, 1) for j in (-1, 0, 1) if (i != 0 or j != 0)) return (nbrs_count == 3) | (x & (nbrs_count == 2))

这个函数使用了numpy的数组操作来高效计算每个细胞的邻居数量,这是处理大型网格的关键!

第三步:创建绘制函数

然后,我们需要创建一个绘制函数,用于在画布上绘制细胞状态:

def draw(x, canvas, color='black'): with hold_canvas(canvas): canvas.clear() # 绘制背景 canvas.fill_style = '#FFF0C9' canvas.stroke_style = 'white' canvas.rough_fill_style = 'solid' canvas.fill_rect(-10, -10, canvas.width + 10, canvas.height + 10) # 绘制存活细胞 canvas.rough_fill_style = 'cross-hatch' canvas.fill_style = color canvas.stroke_style = color living_cells = np.where(x) rects_x = living_cells[0] * n_pixels rects_y = living_cells[1] * n_pixels canvas.fill_rects(rects_x, rects_y, n_pixels) canvas.stroke_rects(rects_x, rects_y, n_pixels)

第四步:设置初始状态并运行模拟

最后,我们设置初始细胞状态(这里使用经典的"滑翔机枪"模式)并运行模拟:

# 创建初始滑翔机枪模式 glider_gun = [ [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0], # 更多初始模式行... ] x = np.zeros((50, 70), dtype=bool) x[1:10,1:37] = glider_gun # 创建画布 n_pixels = 15 canvas = RoughCanvas(width=x.shape[0]*n_pixels, height=x.shape[1]*n_pixels) canvas.fill_style = '#FFF0C9' canvas.stroke_style = 'white' canvas.fill_rect(0, 0, canvas.width, canvas.height) # 显示画布并运行模拟 draw(x, canvas, '#5770B3') display(canvas) for _ in range(100): x = life_step(x) draw(x, canvas, '#5770B3') sleep(0.1)

完整的代码示例可以在docs/conways_game_of_life.ipynb中找到。

探索更多:让你的生命游戏更有趣 🚀

尝试不同的初始模式

除了滑翔机枪,你还可以尝试其他经典模式:

  • 方块:稳定不变的2x2方块
  • ** blinker**:周期性震荡的3个细胞
  • 太空船:能在网格中移动的模式

调整参数获得不同效果

通过修改以下参数,你可以获得完全不同的视觉效果:

  • n_pixels:细胞大小
  • color:细胞颜色(尝试'#FF6B6B''#4ECDC4'
  • sleep(0.1):演化速度(值越小速度越快)
  • rough_fill_style:填充风格(尝试'hachure''zigzag'

互动功能扩展

你还可以利用ipycanvas的交互功能,添加鼠标点击来手动创建或删除细胞:

  • 使用on_mouse_down事件检测鼠标点击
  • 在点击位置切换细胞状态

总结:从简单规则到复杂系统的奇妙旅程

通过本文的教程,你已经学会了如何使用ipycanvas创建Conway's Game of Life生命游戏。这个项目展示了如何将简单规则转化为复杂系统,以及ipycanvas在创建交互式科学可视化方面的强大能力。

无论你是编程新手还是有经验的开发者,ipycanvas都能帮助你轻松创建各种精彩的交互式图形应用。现在就动手尝试修改代码,探索生命游戏中无穷无尽的有趣模式吧!

想要了解更多ipycanvas的高级功能,可以查阅官方文档docs/index.rst,里面有关于动画、事件处理、3D绘图等更多精彩内容。

【免费下载链接】ipycanvasInteractive Canvas in Jupyter项目地址: https://gitcode.com/gh_mirrors/ip/ipycanvas

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

http://www.jsqmd.com/news/1263362/

相关文章:

  • CSharp: Iterative Algorithms
  • AI记忆宫殿:当人工智能遇上古老记忆术
  • Nota未来路线图:即将推出的令人期待的新功能预览
  • PCA降维与UMAP可视化:高维数据聚类分析的完整Python实战
  • 告别MatchError:better-monadic-for如何让for循环与map行为一致
  • AI市场占有率争夺战进入终局阶段:7个被低估的垂直场景正释放3.2亿美金增量
  • 用Open Interpreter和GLM-4实现AI自动化办公
  • 强化学习实战入门:从Q-learning到PPO的算法原理与代码实现
  • 基于YOLOv6的多模态视觉分析系统设计与优化
  • 如何贡献代码到web3.swift?开发者贡献指南与最佳实践
  • Unity游戏模组开发:BepInEx插件框架原理与实战指南
  • 国内环境多模型AI集成:Claude代码生成与GPT文本处理实战
  • SpringBoot33-Spring Boot 的启动顺序(启动生命周期)
  • web3.swift完全指南:从零开始构建Swift以太坊应用
  • oneAPI Math Library (oneMath)完全指南:从入门到精通的跨平台数学计算引擎
  • 为什么选择gimme?5分钟了解这款Go语言版本管理神器
  • Stellaris DLC Unlocker完全指南:支持30+DLC的免费工具使用教程
  • 【扣子测试用例机器人实战指南】:20年QA专家亲授3大自动化提效秘法,97%团队未掌握的智能用例生成逻辑
  • Jellium Desktop皮肤开发入门:创建自己的个性化界面
  • kallisto高级技巧:如何通过命令行参数优化转录组定量结果
  • 龙泉山卧龙寺公墓、成都公墓、公墓环境、价格、位置 - 速递信息
  • UnrealPak资源提取全攻略:从原理到实战,解锁虚幻引擎资源宝库
  • BOSS 直聘上的工作可靠吗?人力资源管理师深度测评,附靠谱求职平台推荐
  • 多模态大模型(MLLM)核心技术解析与实践指南
  • 从理论到实践:online_migrations配置指南 — 3步实现安全高效的PostgreSQL迁移
  • Hancitor木马解密工具使用指南:XOR加密流量分析与IOC提取
  • 高精度ADC校准与模式控制:ADS124S0x实战指南
  • 智能抓取系统OpenClaw Dreaming:机器视觉与强化学习的工业应用
  • Pygame实战:构建像素风RPG的角色移动与对话系统
  • 基于YOLOv12的血细胞检测系统开发与优化