Game of Life,又称康威生命棋,是英国数学家约翰·何顿·康威在1970年发明的细胞自动机。可以用 React 模拟一个 Game of Life,fork自 github上的一个项目。
生命棋的规则如下(摘自维基):
每个细胞有两种状态-存活或死亡,每个细胞与以自身为中心的周围八格细胞产生互动。
- 当前细胞为存活状态时,当周围的存活细胞低于2个时(不包含2个),该细胞变成死亡状态。(模拟生命数量稀少)
- 当前细胞为存活状态时,当周围有2个或3个存活细胞时, 该细胞保持原样。
- 当前细胞为存活状态时,当周围有3个以上的存活细胞时,该细胞变成死亡状态。(模拟生命数量过多)
- 当前细胞为死亡状态时,当周围有3个存活细胞时,该细胞变成存活状态。 (模拟繁殖)
因为项目很小,我是用 create-react-app 自动搭的。游戏的src结构如下
整个游戏用 Redux 管理状态,需要管理的状态有三种:
1)棋盘 Board:每一格棋子代表一个细胞,每个细胞有三个状态:已经存活的细胞,新繁殖的细胞,死亡的细胞。可以用二维数组保存棋盘中所有细胞的状态,对应的index即为坐标。
2)控制按钮:a. 随机生成棋盘细胞 b. 清屏 c. 暂停/开始 d. 前进一步
3)计数器
对应的列出需要控制的动作:
然后写状态对应的 reducer,在各个reducer中进行状态初始化。设定棋盘宽高 20*50,用二维数组存,需要注意的是数组每个项对应的应该是个对象,存是否存活,以及是否新生。在 toggleAlive时,两个状态都取反。tick对应的是前进一步的操作,当对应的是 play 状态时,用循环定时器循环tick。
最后的效果: