#life #game #conway #cell #live #grid #kata

bin+lib game_of_life_kata

Rust 中的康威生命游戏 kata

2 个版本

0.1.1 2023 年 3 月 4 日
0.1.0 2023 年 3 月 4 日

#198游戏

GPL-3.0 许可证

510KB
2K SLoC

生命游戏

Test Publish crate

Rust 中的康威生命游戏 kata。

Game of Life

生命游戏的宇宙是一个无限的两维正交网格,每个方格处于两种可能状态之一,即存活或死亡(或分别称为有人居住和无人居住)。每个方格都与它的八个邻居相互作用,这些邻居是水平、垂直或对角相邻的方格。

规则

来源: https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life

在时间的每一步,以下转换发生

  • 任何存活方格,如果其存活邻居少于两个,则会死亡,好像因为人口不足。
  • 任何存活方格,如果其存活邻居有两个或三个,则会在下一代存活。
  • 任何存活方格,如果其存活邻居超过三个,则会死亡,好像因为人口过剩。
  • 任何死亡方格,如果恰好有三个存活邻居,则会变成存活方格,好像通过繁殖一样。

这些规则,将自动机的行为与真实生活相比较,可以简化为以下

  • 任何存活方格,如果其存活邻居有两个或三个,则会在下一代存活。
  • 任何死亡方格,如果恰好有三个存活邻居,则会在下一代变成存活方格。
  • 所有其他存活方格在下一代都会死亡。同样,所有其他死亡方格都会保持死亡状态。

初始模式构成了系统的种子。第一代是通过将上述规则同时应用于种子中的每个方格(存活或死亡)来创建的,出生和死亡是同时发生的,这个离散的时刻有时被称为一个“滴答”。同时性意味着当每个方格计算其周围存活邻居的数量时,它使用的是更新前的邻居的旧状态,而不是更新后的新状态。如果方格按照读取顺序更新,即每个方格使用其右侧和下方的方格的旧状态,但使用其左侧和上方的方格的新状态,则会得到不同的细胞自动机结果,这被称为 NaiveLife,因为它是在尝试编写康威生命游戏的人中常见的初学者错误。

每一代都是前一代的纯函数。规则会反复应用以创建更多代。

命令

运行

cargo run

应用程序将显示可用选项,例如

cargo run ./patterns/glider.txt 30 60 1000 1

该命令将在一个glider模式中以30×60的背景网格中运行,持续1000代,每代生命周期为1秒。

运行测试

cargo test

运行Clipply

cargo clippy --all-targets -- -D clippy::pedantic

覆盖率报告

文本报告

cargo cov
cargo llvm-cov --lib <- Exclude integration tests

它生成如下文本覆盖率报告

Filename                                     Regions    Missed Regions     Cover   Functions  Missed Functions  Executed       Lines      Missed Lines     Cover    Branches   Missed Branches     Cover
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
application/app.rs                                 3                 0   100.00%           3                 0   100.00%          22                 0   100.00%           0                 0         -
domain/cell/coordinates.rs                        24                 2    91.67%          15                 2    86.67%          67                 2    97.01%           0                 0         -
domain/cell/mod.rs                                39                 1    97.44%          24                 1    95.83%          71                 1    98.59%           0                 0         -
domain/cell/row.rs                                53                 2    96.23%          31                 2    93.55%          96                 4    95.83%           0                 0         -
domain/cell/state.rs                              34                 5    85.29%          19                 4    78.95%          48                 6    87.50%           0                 0         -
domain/game.rs                                     5                 0   100.00%           1                 0   100.00%          27                 0   100.00%           0                 0         -
domain/grid/functions/next_generation.rs          39                 0   100.00%          14                 0   100.00%         139                 0   100.00%           0                 0         -
domain/grid/functions/overlap.rs                  62                 1    98.39%          26                 0   100.00%         219                 1    99.54%           0                 0         -
domain/grid/mod.rs                               208                 5    97.60%          96                 5    94.79%         619                 7    98.87%           0                 0         -
domain/grid/size.rs                               12                 1    91.67%           8                 1    87.50%          27                 1    96.30%           0                 0         -
domain/grid/traverser.rs                          24                 0   100.00%           8                 0   100.00%          45                 0   100.00%           0                 0         -
domain/output/logger.rs                           11                 1    90.91%           9                 1    88.89%          33                 3    90.91%           0                 0         -
infrastructure/console.rs                          4                 1    75.00%           4                 1    75.00%          12                 3    75.00%           0                 0         -
infrastructure/thread.rs                           2                 0   100.00%           2                 0   100.00%           4                 0   100.00%           0                 0         -
lib.rs                                             1                 0   100.00%           1                 0   100.00%           1                 0   100.00%           0                 0         -
main.rs                                            2                 1    50.00%           2                 1    50.00%           5                 4    20.00%           0                 0         -
ui/console.rs                                     13                 6    53.85%           7                 3    57.14%          55                29    47.27%           0                 0         -
ui/help.rs                                         1                 1     0.00%           1                 1     0.00%          28                28     0.00%           0                 0         -
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
TOTAL                                            537                27    94.97%         271                22    91.88%        1518                89    94.14%           0                 0         -

./coverage/lcov.info中生成分析数据

cargo cov-lcov

它被用于生成由Coverage Gutters Visual Studio Code插件所需的数据。

生成HTML覆盖率报告./target/llvm-cov/html

cargo cov-html

Game of Life

想法

  • 可以使用一个新的网格函数grid_expand来扩展模式网格。它可以内部通过grip_overlap实现。它从网格中心扩展。
  • 创建一个环状阵列并像网格中的容器一样使用它。

待办事项

在代码中查看todo标签。

许可证

GNU通用公共许可证。版本3

依赖项

~0–10MB
~53K SLoC