2 个版本
0.1.1 | 2023 年 3 月 4 日 |
---|---|
0.1.0 | 2023 年 3 月 4 日 |
#198 在 游戏
510KB
2K SLoC
生命游戏
Rust 中的康威生命游戏 kata。
生命游戏的宇宙是一个无限的两维正交网格,每个方格处于两种可能状态之一,即存活或死亡(或分别称为有人居住和无人居住)。每个方格都与它的八个邻居相互作用,这些邻居是水平、垂直或对角相邻的方格。
规则
来源: 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
想法
- 可以使用一个新的网格函数
grid_expand
来扩展模式网格。它可以内部通过grip_overlap
实现。它从网格中心扩展。 - 创建一个环状阵列并像网格中的容器一样使用它。
待办事项
在代码中查看todo
标签。
许可证
GNU通用公共许可证。版本3
依赖项
~0–10MB
~53K SLoC