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算法

Download history 9/week @ 2024-07-03 50/week @ 2024-07-24

每月下载量59

Apache-2.0

170KB
2.5K SLoC

Latest Version License:Apache Build Status Coverage Status

克诺索斯

克诺索斯是一个用于迷宫生成和 CLI 的 Rust 库,包括将迷宫渲染到文件的基本函数。

参考

在希腊神话中,国王米诺斯住在克诺索斯的宫殿里。他雇佣了雅典建筑师、数学家和发明家代达罗斯来设计他的宫殿,建造得如此巧妙,以至于没有人能在没有向导的情况下找到出路。在同一个故事的另一个版本中,不是宫殿本身,而是宫殿内的迷宫以这种方式设计,建造来容纳半人半牛的弥诺陶洛斯。为了防止代达罗斯泄露宫殿的秘密,米诺斯将他和他的儿子伊卡洛斯锁在了克诺索斯的一座高塔中,并将他们监禁起来。然而,代达罗斯为自己和儿子伊卡洛斯制作了由蜂蜡和鸟羽制成的翅膀,逃离了监狱,但伊卡洛斯飞得太靠近太阳,翅膀熔化,坠落而死。

来源:https://www.worldhistory.org/knossos

概述

克诺索斯目前仅支持一种类型的迷宫: 正交,这是一种标准的矩形通道迷宫布局。

该库支持以下生成算法

克诺索斯支持以下输出类型

  • ASCII 使用 ASCII 输出选项,您可以在控制台轻松显示迷宫或将它保存到文件以查看其外观。

  • 游戏地图 如果您想创建自己的游戏,游戏具有伪 3D 图形或测试您的光线投射算法实现,您可以使用此格式器将迷宫转换为游戏地图。它提供各种配置选项,包括指定相对墙壁距离的 span 值,用于地图构建的字符 wallpassage,以及沿边随机放置起点 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 软件包

  1. 下载最新二进制文件
  2. 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