#maze #procedural #gamedev #labyrinth #game

irrgarten

一个小巧易用的库,用于为游戏生成迷宫

2个版本

0.1.1 2021年11月13日
0.1.0 2021年11月8日

#765 in 游戏开发

41 每月下载量
用于 ddnet-map-gen

MIT/Apache

17KB
192 代码行

一个小巧易用的库,用于为游戏生成迷宫

Irrgarten 允许您以任意大小生成迷宫。与类似的库相比,Irrgarten 特别关注在游戏中使用这些迷宫。主要优点包括

生成的迷宫本质上是对应的瓦片图 - 墙只是瓦片

这与其他创建美丽迷宫但使用内部表示(如位掩码)的墙的生成器不同。在 Irrgarten 中,您只需得到一个这样的二维向量

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 
1 0 1 1 1 0 1 1 1 1 1 1 1 0 1 
1 0 1 0 0 0 1 0 0 0 1 0 0 0 1 
1 0 1 0 1 1 1 0 1 0 1 0 1 1 1 
1 0 0 0 1 0 0 0 1 0 1 0 0 0 1 
1 1 1 1 1 0 1 1 1 0 1 1 1 0 1 
1 0 0 0 1 0 0 0 1 0 1 0 0 0 1 
1 0 1 0 1 1 1 0 1 1 1 0 1 1 1 
1 0 1 0 0 0 0 0 1 0 0 0 1 0 1 
1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 
1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 
1 0 1 1 1 1 1 0 1 1 1 1 1 0 1 
1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 

其中墙用 1 表示,地面用 0 表示,您可以将它们直接映射到任何瓦片图、网格图或其他您喜欢的引擎提供的类似瓦片的图形结构。

可注入的随机性

您提供自己的随机数生成器。因此,您可以完全控制种子和随机性的内部状态。这使得您可以确定性地生成相同的迷宫,例如,在网络上。现在您只需同步参与者的种子,而不是整个迷宫。您还可以使用此种子用于重放系统,让测试者与您分享困难的种子以评估等。对于具有此类生成内容的游戏非常有用。

使用方法

将以下内容添加到您的 Cargo.toml 中

[dependencies]
irrgarten = "0.1"

您还需要选择一个随机数生成器。以下示例中,我们简单地使用了 rand crate。

示例:简单迷宫生成

use irrgarten::Maze;
use rand;

fn main() {
    let mut rng = rand::thread_rng();
    
    // Full maze generation. The dimensions can be any odd number that is > 5.
    let maze = Maze::new(63, 31).unwrap().generate(&mut rng);
    
    // The generated maze data can be accessed via index:
    for y in 0..maze.height {
        for x in 0..maze.width {
            println!("{}", maze[x][y]);
        }
    }
    // Alternatively, Maze also provides into_iter(), iter() and iter_mut()
    // methods to iterate over the columns.
}

示例:生成迷宫图像(用于易于检查/原型设计)

use irrgarten::Maze;
use rand;
use std::fs;

fn main() {
    let mut rng = rand::thread_rng();
    let maze = Maze::new(255, 255).unwrap().generate(&mut rng);

    // Save image to disk. Can be opened with most image viewers.
    fs::write("maze.pbm", maze.to_pbm()).unwrap();
}

示例:使用具有种子的不同随机数生成器

使用 xoshiro 生成器

use irrgarten::Maze;
use rand_xoshiro::rand_core::SeedableRng;
use rand_xoshiro::Xoshiro256Plus;

fn main() {
    let mut rng = Xoshiro256Plus::seed_from_u64(123123123);
    let maze = Maze::new(4095, 4095).unwrap().generate(&mut rng);
}

依赖关系

~0.5–1MB
~23K SLoC