12 个版本
0.6.1 | 2023年3月18日 |
---|---|
0.6.0 | 2022年5月1日 |
0.5.2 | 2022年1月1日 |
0.5.1 | 2021年7月17日 |
0.3.1 | 2020年1月4日 |
#194 在 游戏开发
每月 66 次下载
265KB
4.5K SLoC
rlifesrc
Rust 生命搜索,或 rlifesrc,是用 Rust 编写的生命游戏模式搜索器。
该程序基于 David Bell 的 lifesrc 和 Jason Summers 的 WinLifeSearch,使用 Dean Hickerson 发明的算法。
与 WinLifeSearch 相比,rlifesrc 仍然较慢,并且缺少许多重要功能。但它支持非总生命和世代规则。
这是命令行工具和 TUI。还有一个使用 WebAssembly 的 网络应用。
安装
rlifesrc 是用 Rust 编写的。您可以使用 Rust 的包管理器 Cargo 安装它
cargo install rlifesrc
如果您想从源代码编译,请参阅 编译 部分。
使用方法
此算法适用于长而细或平而宽的模式,但它也可以搜索其他模式。
它提供两个接口:一个 简单的命令行界面 和一个 基于文本的用户界面。
USAGE:
rlifesrc [FLAGS] [OPTIONS] <X> <Y> [ARGS]
FLAGS:
-a, --all
Prints all possible results instead of only the first one
Only useful when --no-tui is set.
--backjump
(Experimental) Enable backjumping
The current implementation of backjumping is very slow, only useful for large (e.g., 64x64) still lifes.
-n, --no-tui
Starts searching immediately, without entering the TUI
-R, --reduce
Reduce the max cell count when a result is found
The new max cell count will be set to the cell count of the current result minus one.
--reset-time
Resets the time when starting a new search
-S, --skip-subsym
Skip patterns which are invariant under more transformations than required by the given symmetry.
In another word, skip patterns whose symmetry group properly contains the given symmetry group.
-p, --subperiod
Allow patterns whose fundamental period are smaller than the given period
-h, --help
Prints help information
-V, --version
Prints version information
OPTIONS:
-c, --choose <CHOOSE>
How to choose a state for unknown cells
[default: alive] [possible values: dead, alive, random, d, a, r]
-C, --config <CONFIG>
Read config from a file
Supported formats: JSON, YAML, TOML.
When a config file is provided, all the other flags and options, except --all (-a), --reset-time, --no-tui (-n), are ignored.
-d, --diag <DIAG>
Diagonal width
If the diagonal width is n > 0, the cells at position (x, y) where abs(x - y) >= n are assumed to be dead.
If this value is set to 0, it would be ignored.
[default: 0]
-m, --max <MAX>
Upper bound of numbers of minimum living cells in all generations
If this value is set to 0, it means there is no limitation.
[default: 0]
-o, --order <ORDER>
Search order
Row first or column first.
[default: automatic] [possible values: row, column, automatic, diagonal, r, c, a, d]
-r, --rule <RULE>
Rule of the cellular automaton
Supports Life-like, isotropic non-totalistic, hexagonal, MAP rules, and their corresponding Generations rules.
[default: B3/S23]
-s, --symmetry <SYMMETRY>
Symmetry of the pattern
You may need to add quotation marks for some of the symmetries.
The usages of these symmetries are the same as Oscar Cunningham's Logic Life Search.
See [https://conwaylife.com/wiki/Static_symmetry#Reflectional]
[default: C1] [possible values: C1, C2, C4, D2|, D2-, D2\, D2/, D4+, D4X, D8]
-t, --transform <TRANSFORM>
Transformation of the pattern
After the last generation in a period, the pattern will return to the first generation, applying this transformation first, and then the translation defined by DX and DY.
You may need to add quotation marks for some of the transformations.
"Id" is the identical transformation.
"R" means counterclockwise rotation.
"F" means flipping (reflection) across an axis.
[default: Id] [possible values: Id, R90, R180, R270, F|, F-, F\, F/]
ARGS:
<X>
Width of the pattern
<Y>
Height of the pattern
<P>
Period of the pattern [default: 1]
<DX>
Horizontal translation [default: 0]
<DY>
Vertical translation [default: 0]
例如,这将找到 25P3H1V0.1:
rlifesrc 16 5 3 0 1
您还可以从文件中读取配置
rlifesrc -C config.json
其中 config.json
的内容是
{
"width": 16,
"height": 5,
"period": 3,
"dx": 0,
"dy": 1,
}
配置文件只是 rlifesrc-lib
中的 Config
结构的序列化。目前,只能通过配置文件指定 known_cells
字段和 SearchOrder
的 FromVec 变体。有关
Config
的详细信息,请参阅文档 Config
。
10种不同的对称性对应于二面体群D8的10个子群。这些符号借鉴自Oscar Cunningham的Logic Life Search。详细信息请参阅生命之书。
8种不同的变换对应于二面体群D8的10个元素。这里
Id
表示恒等变换。R
表示围绕世界中心的旋转。其后的数字是该逆时针旋转的角度(度)。F
表示反射(翻转)。其后的符号是反射轴。
例如,如果您想找到一个具有滑翔对称的垂直飞船,可以将变换设置为F|
。
有些对称性和变换只在世界是方形时有效。有些只在世界没有对角线宽度时有效。
搜索顺序中的“自动”意味着它将从较短的一边开始,即,如果列数多于行数,则从列开始,如果行数多于列数,则从行开始。当世界是方形且对角线宽度不大于世界的宽度时,它将选择对角线。
对角线搜索顺序要求世界必须是方形。
CLI
命令行界面(CLI)是最简单的界面。您输入命令,它将打印结果,而不会显示搜索过程。
- 死亡细胞由
.
表示; - 存活细胞由规则为2状态时的
o
和规则为更多状态时的A
表示; - 死亡细胞由从
B
开始的字母大写表示; - 未知细胞由
?
表示; - 每行以
$
结束; - 整个模式以
!
结束。
目前它不能正确显示具有25个以上状态的Generations规则。
例如,这个输入
rlifesrc 20 16 7 3 0 -r '3457/357/5' -s 'D2-' --no-tui
将给出
x = 20, y = 16, rule = 3457/357/5
....................$
..........B...AAA...$
........ACAC.AAAB.D.$
.......AABDB.AACDC..$
.....ABACCCDA.BAAC..$
....DABACCCBAAABA...$
...AA..AAABDDBAAD...$
..AAA...AA.CDAB.....$
..AAA...AA.CDAB.....$
...AA..AAABDDBAAD...$
....DABACCCBAAABA...$
.....ABACCCDA.BAAC..$
.......AABDB.AACDC..$
........ACAC.AAAB.D.$
..........B...AAA...$
....................!
使用命令行标志--all
,它将逐个打印所有结果。
TUI
文本用户界面(TUI)也很简单,但它将显示搜索进度和搜索时间。
TUI是用crossterm编写的。理论上应该是跨平台的,但我只在Xfce终端上测试过。
进入TUI时,它看起来像这样(以rlifesrc2016730-'3457/357/5'-'D2
为例)
搜索过程中的输出格式与CLI相同,除了?
表示未知细胞。
Cells
表示当前代已知活细胞的数量。在代规则中,死亡的细胞不计入。 Confl
表示搜索过程中的冲突数量。
然后您可以用键盘控制搜索
- 空格 / 回车:开始或暂停搜索
- q:退出
- 向上翻页:显示上一代
- 向下翻页:显示下一代
搜索结果如下所示
如果您再次按下 空格 或 回车,它将开始搜索下一个结果。
时间仅在搜索暂停时显示。在开始新的搜索时不会重置,除非添加了命令行标志 --reset-time
。
当它大于终端大小时,rlifesrc 无法显示整个图案。但退出程序后,整个结果将被打印。
编译
rlifesrc 用 Rust 编写。因此,首先您需要安装 Rust。
然后您可以下载和编译
git clone https://github.com/AlephAlpha/rlifesrc.git
cd rlifesrc/
RUSTFLAGS="-C target-cpu=native" cargo build --release
输出文件是 ./target/release/rlifesrc
。
如果您不需要 TUI,您可以在 cargo-build 中添加标志 --no-default-features
。
依赖项
~5–15MB
~181K SLoC