康威生命游戏实现 - Conway's Game of Life Implementation

Made by Mike_Zhang


数据结构与算法主题:


1. Abstract

1. 梗概

康威生命游戏 (Conway’s Game of Life) 是英国数学家 约翰·何顿·康威 (John Horton Conway) 在1970年发明的一种细胞自动机。能够在一定程度上让计算机模拟宇宙中生物最基本的生命规律。能够使生命从最开始的状态进化到让人意想不到的状态。

作为此游戏的使用者,也是这个游戏中每个生命的“上帝”,我们需要做的只有一件事:设计好这个生命世界最开始的样子,即哪些生命存活,哪些生命死亡。接下来就让世界中的生命按照规则不断进化下去。康威生命游戏不仅仅是个游戏,其简单的规则和让人着迷的世界,也能让人们感受到一些生命的本质。更进一步,借助康威生命游戏,还可以造出通用计算机,因为此游戏具有图灵完备性。

本文将介绍康威生命游戏的规则,此问题的抽象模型,康威生命游戏的代码实现,包括后端及前端的实现,以及一些思考。

若你想先尝试一下此游戏,可点击并使用UltraFish Plus中的康威生命游戏
但请答应我,别玩入迷了,记得回来看看其背后的故事。


2. Problem Description

2. 问题描述

康威生命游戏规定了一个由无数小方块组成的无边无际的世界,每一个方块代表了一个生命,并有以下生命规则:

  • 每个生命有两种状态-存活死亡,每个生命只与其周围八个生命产生互动
  • 存活
    • 若某个生命目前状态为存活,并且其周围有 2 或 3 个存活的生命,此生命将保持原状(模拟平衡);
  • 死亡
    • 若某个生命目前状态为存活,并且其周围有 0 或 1 个存活的生命,此生命将会死亡(模拟濒危);
    • 若某个生命目前状态为存活,并且其周围有超过 3 个存活的生命,此生命将会死亡(模拟数量过多);
  • 诞生
    • 若某个生命目前状态为死亡,并且其周围有 3 个存活的生命,此生命将会诞生(模拟繁殖);
  • 当前的所有生命会同时被以上规则处理并更新,以得到下一代生命,并决定了再下一代的生命,不断重复。

根据以上规则,方块中的生命有很多有意思的形态和变化。

  • 静止的生命:

    • 会一直维持原状,不会发生变化。
    • 方块、蜂巢、面包、小船、桶 - en.wikipedia.org:
    方块 - en.wikipedia.org
    蜂巢 - en.wikipedia.org
    面包 - en.wikipedia.org
    小船 - en.wikipedia.org
    桶 - en.wikipedia.org
  • 震荡的生命:

    • 会在一个周期内重复相同的变化,不会死亡。
    • 信号灯-周期为2、蟾蜍-周期为2、烽火-周期为2、脉冲星-周期为3 - en.wikipedia.org:
      信号灯-周期为2 - en.wikipedia.org
      蟾蜍-周期为2 - en.wikipedia.org
      烽火-周期为2 - en.wikipedia.org
      脉冲星-周期为3 - en.wikipedia.org
  • 移动的生命:

    • 会持续不断的移动下去。
    • 滑翔机、太空飞船 - en.wikipedia.org:
      滑翔机 - en.wikipedia.org
      太空飞船 - en.wikipedia.org
  • 持续繁殖的生命

高斯帕机枪 - en.wikipedia.org

播种机 - en.wikipedia.org


3. Problem Abstraction

3. 问题抽象

为了解决对康威生命游戏的代码实现,面向对象设计和编程是一个很好的途径。

首先我们对此游戏进行抽象。总的来说,其中有两个对象:生命,由生命构成的世界。并且它们有各自的属性和方法。

比如,

  • 每个生命都有自己的位置,以及自己有哪些邻居,自己的存活状态等。它们可以计算出自己下一个时间的状态,并且可以更新自己的状态等。

  • 由生命构成的世界有自己会有哪一些生命在里面。它可以添加新的生命,也可以更新全部的生命状态,并展示出所有的生命状态。


3.1 Cell Class

3.1 生命类

首先是抽象了生命的生命类: Cell (写为细胞,代表了生命)。

Cell Class

  • neighbors是一个Cell类的数组,维护了此生命周围的8个生命
  • isNowLivewillBeLive维护了此生命目前下一代的生命状态;
  • setNextLife()方法会根据生命规则计算此生命下一代的生命状态并更新。

3.2 CellWorld Class

3.2 生命世界类

其次抽象了由众多生命组成的世界类: CellWorld (写为细胞世界,代表了生命的世界)。

CellWorld Class

  • cells是一个Cell类的二维数组,维护了此世界中所有的生命
  • add(Cell)方法能够向世界中添加一个活的生命;
  • refresh()方法能够把所有生命更新到其下一代
  • listAll()方法能够返回所有生命的状态为字符串。

注:康威生命游戏规定了一个无边无际的世界,但这里的CellWorld类定义的世界是有边际的,与康威生命游戏的规则略有不同。


Between Cell and CellWorld


4. Implementation

4. 实现

4.1 Java

基于上述的抽象,我们可以用Java对上述两个模型进行设计和封装。

GitHub代码:

Cell class in Java
CellWorld class in Java

可运行测试文件来模拟此游戏。

GitHub代码:

Test CellWorld class


4.2 React

上述用Java实现的方式只是在命令行中实现的。为了能够让用户有更好的操作体验,我用React做了一个网页版本的康威生命游戏,并用JavaScript封装了之前用Java实现的两个类。最后发布在UltraFish Plus上。

Classed and Components in React with JavsScript

Conway's Game of Life in UltraFish Plus with React

用户作为这个世界的“上帝”,可以通过点击方块来创造或者消灭生命,便可设计自己的世界。点击开始后就可以使世界开始运作,观察世界中生命的变化。


5. Review

5. 思考

康威生命游戏体现了在无序中的有序,能够从简单的逻辑演变出有趣的模式,也能让我们有一些对生命的理解。

我用数据结构和算法以及面向对象编程来尝试实现这个游戏,同时也尝试了React来进行网页端的实现。让我得到了锻炼的机会,收获了很多经验,当然也发现了很多不足。

康威生命游戏具有图灵完备性,因此有一个团队基于此游戏,开发出了一个通用计算机 (通用图灵机),并用其运行了俄罗斯方块这一游戏。还记得上面提到的滑翔机样式吗。这个样式很像电流的传输。类似地,此团队用修改过的生命游戏模拟了从最基本的导线,电路,逻辑门,触发器,时钟等,到寄存器,内存,指令集。最后模拟出了一台计算机。十分震撼,有机会可以深入研究一下:
Build a working game of Tetris in Conway’s Game of Life


References

参考

Build a working game of Tetris in Conway’s Game of Life
Conway’s Game of Life - Wikipedia
Conway’s Game of Life - UltraFish Plus
The Game of Life - Computer Science Department, Stanford University
康威生命游戏是如何搭建计算机的?
康威生命游戏——孤独会致命,拥挤也一样


Outro

尾巴

若你也对康威生命游戏及其应用感兴趣,或者有相关的点子和想法,请在下方留言交流。
OOP、数据结构与算法的应用会继续研究.
最后,希望大家一起交流,分享,指出问题,谢谢!


原创文章,转载请标明出处
Made by Mike_Zhang




感谢你的支持

康威生命游戏实现 - Conway's Game of Life Implementation
https://ultrafish.io/post/game-of-life-implementation/
Author
Mike_Zhang
Posted on
August 5, 2022
Licensed under