4 个版本 (破坏性)
0.4.0 | 2023年11月1日 |
---|---|
0.3.0 | 2023年5月6日 |
0.2.0 | 2023年4月2日 |
0.1.2 | 2022年4月11日 |
#345 在 算法
每月下载量59
170KB
2.5K SLoC
克诺索斯
克诺索斯是一个用于迷宫生成和 CLI 的 Rust 库,包括将迷宫渲染到文件的基本函数。
参考
在希腊神话中,国王米诺斯住在克诺索斯的宫殿里。他雇佣了雅典建筑师、数学家和发明家代达罗斯来设计他的宫殿,建造得如此巧妙,以至于没有人能在没有向导的情况下找到出路。在同一个故事的另一个版本中,不是宫殿本身,而是宫殿内的迷宫以这种方式设计,建造来容纳半人半牛的弥诺陶洛斯。为了防止代达罗斯泄露宫殿的秘密,米诺斯将他和他的儿子伊卡洛斯锁在了克诺索斯的一座高塔中,并将他们监禁起来。然而,代达罗斯为自己和儿子伊卡洛斯制作了由蜂蜡和鸟羽制成的翅膀,逃离了监狱,但伊卡洛斯飞得太靠近太阳,翅膀熔化,坠落而死。
来源:https://www.worldhistory.org/knossos
概述
克诺索斯目前仅支持一种类型的迷宫: 正交,这是一种标准的矩形通道迷宫布局。
该库支持以下生成算法
克诺索斯支持以下输出类型
-
ASCII 使用 ASCII 输出选项,您可以在控制台轻松显示迷宫或将它保存到文件以查看其外观。
-
游戏地图 如果您想创建自己的游戏,游戏具有伪 3D 图形或测试您的光线投射算法实现,您可以使用此格式器将迷宫转换为游戏地图。它提供各种配置选项,包括指定相对墙壁距离的
span
值,用于地图构建的字符wall
和passage
,以及沿边随机放置起点S
和终点G
的能力。 -
图像 利用图像输出功能,您可以将迷宫渲染成 PNG 或 JPG 格式(只需使用适当的文件扩展名)。这种输出类型提供了丰富的自定义选项,允许您定义自定义边距、墙壁和通道宽度,以及背景和前景颜色。
安装
在项目目录中运行以下 Cargo 命令
cargo add knossos
或者将以下行添加到您的 Cargo.toml
[dependencies]
knossos = "0.4.0"
用法
Knossos 被设计得非常简单和方便使用。以下是一些如何生成、显示和保存迷宫的用法示例
使用默认参数生成
use knossos::maze::*;
let maze = OrthogonalMazeBuilder::new().build();
使用自定义参数生成
use knossos::maze::*;
let maze = OrthogonalMazeBuilder::new()
.height(10)
.width(10)
.algorithm(Box::new(GrowingTree::new(Method::Random)))
.build();
显示
use knossos::maze::*;
let maze = OrthogonalMazeBuilder::new().build();
println!("{}", &maze);
保存到文件
use knossos::maze::*;
let maze = OrthogonalMazeBuilder::new().build();
// Save as ascii
maze.save("output/maze.txt", AsciiNarrow).unwrap();
// Save as a game map
maze.save("output/maze_game_map.txt", GameMap::new().span(3)).unwrap();
// Save as a PNG image
maze.save("output/maze.png", Image::new().wall(10).passage(30)).unwrap();
您可以在 示例 目录中找到更多示例。要运行示例
cargo run --example mazes
基准测试
cargo +nightly bench
Finished bench [optimized] target(s) in 0.51s
Running unittests src/lib.rs (target/release/deps/knossos-43150be123983d04)
running 29 tests
test maze::algorithms::prim::tests::default_call ... ignored
test maze::builder::tests::build ... ignored
test maze::errors::save_error::tests::display ... ignored
test maze::errors::transit_error::tests::display ... ignored
test maze::formatters::ascii::tests::format_broad ... ignored
test maze::formatters::ascii::tests::format_narrow ... ignored
test maze::formatters::game_map::tests::default_call ... ignored
test maze::formatters::game_map::tests::format_with_no_start_and_goal ... ignored
test maze::formatters::game_map::tests::format_with_start_and_goal ... ignored
test maze::formatters::game_map::tests::goal_change ... ignored
test maze::formatters::game_map::tests::new_call ... ignored
test maze::formatters::game_map::tests::passage_change ... ignored
test maze::formatters::game_map::tests::possible_start_and_goal_positions ... ignored
test maze::formatters::game_map::tests::possible_start_and_goal_positions_when_map_is_empty ... ignored
test maze::formatters::game_map::tests::span_change ... ignored
test maze::formatters::game_map::tests::start_change ... ignored
test maze::formatters::game_map::tests::wall_change ... ignored
test maze::formatters::image::tests::format ... ignored
test maze::formatters::image::tests::new_call_default_params ... ignored
test maze::formatters::image::tests::params_change ... ignored
test maze::maze::tests::display_orthogonal_maze ... ignored
test maze::maze::tests::invalid_maze ... ignored
test maze::maze::tests::valid_maze ... ignored
test utils::arena::tests::connect_one_none_node ... ignored
test utils::arena::tests::connect_three_nodes ... ignored
test utils::arena::tests::connect_two_nodes ... ignored
test utils::arena::tests::connect_two_none_node ... ignored
test utils::arena::tests::unconnected_nodes ... ignored
test utils::color::tests::display_color ... ignored
test result: ok. 0 passed; 0 failed; 29 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running unittests src/main.rs (target/release/deps/knossos-d8bfa62e62b46d44)
running 1 test
test tests::verify_cli ... ignored
test result: ok. 0 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.00s
Running benches/algorithms.rs (target/release/deps/algorithms-e8ead48e0698db1d)
running 26 tests
test algorithms::aldous_broder::generate_100_x_100 ... bench: 27,608,666 ns/iter (+/- 9,378,586)
test algorithms::aldous_broder::generate_10_x_10 ... bench: 90,247 ns/iter (+/- 4,901)
test algorithms::binary_tree::generate_100_x_100 ... bench: 518,312 ns/iter (+/- 28,780)
test algorithms::binary_tree::generate_10_x_10 ... bench: 5,126 ns/iter (+/- 318)
test algorithms::eller::generate_100_x_100 ... bench: 2,195,923 ns/iter (+/- 172,412)
test algorithms::eller::generate_10_x_10 ... bench: 22,002 ns/iter (+/- 508)
test algorithms::growing_tree_method_middle::generate_100_x_100 ... bench: 1,942,837 ns/iter (+/- 69,464)
test algorithms::growing_tree_method_middle::generate_10_x_10 ... bench: 18,608 ns/iter (+/- 385)
test algorithms::growing_tree_method_newest::generate_100_x_100 ... bench: 1,721,368 ns/iter (+/- 51,877)
test algorithms::growing_tree_method_newest::generate_10_x_10 ... bench: 17,912 ns/iter (+/- 931)
test algorithms::growing_tree_method_oldest::generate_100_x_100 ... bench: 1,959,410 ns/iter (+/- 106,218)
test algorithms::growing_tree_method_oldest::generate_10_x_10 ... bench: 18,575 ns/iter (+/- 614)
test algorithms::growing_tree_method_random::generate_100_x_100 ... bench: 2,621,709 ns/iter (+/- 146,396)
test algorithms::growing_tree_method_random::generate_10_x_10 ... bench: 22,979 ns/iter (+/- 507)
test algorithms::hunt_and_kill::generate_100_x_100 ... bench: 913,686 ns/iter (+/- 29,865)
test algorithms::hunt_and_kill::generate_10_x_10 ... bench: 8,736 ns/iter (+/- 140)
test algorithms::kruskal::generate_100_x_100 ... bench: 47,468,245 ns/iter (+/- 5,990,785)
test algorithms::kruskal::generate_10_x_10 ... bench: 12,918 ns/iter (+/- 765)
test algorithms::prim::generate_100_x_100 ... bench: 3,038,950 ns/iter (+/- 245,608)
test algorithms::prim::generate_10_x_10 ... bench: 13,750 ns/iter (+/- 667)
test algorithms::recursive_backtracking::generate_100_x_100 ... bench: 1,017,889 ns/iter (+/- 52,493)
test algorithms::recursive_backtracking::generate_10_x_10 ... bench: 10,304 ns/iter (+/- 488)
test algorithms::recursive_division::generate_100_x_100 ... bench: 353,212 ns/iter (+/- 9,616)
test algorithms::recursive_division::generate_10_x_10 ... bench: 3,551 ns/iter (+/- 83)
test algorithms::sidewinder::generate_100_x_100 ... bench: 267,238 ns/iter (+/- 10,063)
test algorithms::sidewinder::generate_10_x_10 ... bench: 2,756 ns/iter (+/- 112)
test result: ok. 0 passed; 0 failed; 0 ignored; 26 measured; 0 filtered out; finished in 82.88s
Running benches/formatters.rs (target/release/deps/formatters-a575860cb997bf40)
running 8 tests
test formatters::ascii_broad::format_100_x_100 ... bench: 1,275,793 ns/iter (+/- 56,448)
test formatters::ascii_broad::format_10_x_10 ... bench: 173,265 ns/iter (+/- 18,587)
test formatters::ascii_narrow::format_100_x_100 ... bench: 1,338,637 ns/iter (+/- 103,429)
test formatters::ascii_narrow::format_10_x_10 ... bench: 173,031 ns/iter (+/- 27,930)
test formatters::game_map::format_100_x_100 ... bench: 3,776,375 ns/iter (+/- 243,290)
test formatters::game_map::format_10_x_10 ... bench: 199,187 ns/iter (+/- 20,521)
test formatters::image::format_10_x_10 ... bench: 8,341,370 ns/iter (+/- 349,585)
test formatters::image::format_50_x_50 ... bench: 191,061,562 ns/iter (+/- 2,174,934)
test result: ok. 0 passed; 0 failed; 0 ignored; 8 measured; 0 filtered out; finished in 77.40s
命令行界面
终端中生成迷宫的命令行界面使用库的公共 API。
示例
knossos generate -W 5 -H 5 ascii --output-type=broad --output-path=maze.txt
+---+---+---+---+---+
| | | |
+ + + + + +
| | | | |
+ +---+ +---+ +
| | | | |
+---+ + + + +
| | | | | |
+ + + + + +
| | |
+---+---+---+---+---+
knossos generate -W 5 -H 5 game-map --span 2 --with-start-goal --output-path=maze.txt
#######S########
#..#...........#
#..#...........#
#..#..#######..#
#..#........#..#
#..#........#..#
G..##########..#
#..#........#..#
#..#........#..#
#..#..####..#..#
#.....#.....#..#
#.....#.....#..#
#######..####..#
#..............#
#..............#
################
knossos generate -W 15 -H 15 image --output-path=maze.png

安装
Debian 软件包
- 下载最新二进制文件
dpkg -i <binary-name>
将会安装它
或者从 crates.io
cargo install knossos
或者从源代码
$ git clone [email protected]:unrenamed/knossos.git
$ cd knossos
$ cargo build --release
$ ./target/release/knossos --version
knossos 0.1.2
用法
knossos --help
Rust library for generating and rendering mazes
Usage: knossos <COMMAND>
Commands:
generate Generates a maze
help Print this message or the help of the given subcommand(s)
Options:
-h, --help Print help
-V, --version Print version
使用 generate
命令
knossos generate -h
Generates a maze
Usage: knossos generate [OPTIONS] <COMMAND>
Commands:
ascii Save to a text file with an ASCII representation of a maze
game-map Save to a text file as an ASCII game map for pseudo 3D games that use ray casting for modeling and rendering the map
image Save to PNG or JPG file
help Print this message or the help of the given subcommand(s)
Options:
-A, --algorithm <ALGORITHM>
Maze generation algorithm [default: recursive-backtracking] [possible values: aldous-broder, binary-tree, eller, growing-tree, hunt-and-kill, kruskal, prim, recursive-backtracking, recursive-division, sidewinder]
-H, --height <HEIGHT>
Grid height in a number of cells [default: 10]
-W, --width <WIDTH>
Grid width in a number of cells [default: 10]
--bias[=<BIAS>]
Bias to use for the "Binary Tree" algorithm [default: north-east] [possible values: north-west, north-east, south-west, south-east]
--growing-method[=<GROWING_METHOD>]
Growing method to use for the "Growing Tree" algorithm [default: newest] [possible values: newest, oldest, random, middle, newest50-random50, newest75-random25, newest25-random75]
-h, --help
Print help (see more with '--help')
更多信息,请运行
knossos generate help
依赖关系
~12–22MB
~289K SLoC