1 个不稳定版本

使用旧的 Rust 2015

0.1.0 2017年4月7日

#16 in #dnd

32 次每月下载

MPL-2.0 许可证

17KB
299 行代码(不含注释)

d20

Crates.io docs.rs

D20 是一个简单的 crate,用于评估 roll expressions。一个 roll expression 是一个英语字符串,反映了地下城或游戏主想要执行特定掷骰子的意图。

例如,在桌面游戏中,你可能经常听到像 "roll 2d10""roll 3d6 and add 5" 这样的短语。这些都是 roll expressions,其中的组件就是我们所说的 die roll terms。一个 die roll term 是一个术语,它要求掷一个 n 边的骰子 x 次(例如 3d6),或者是一个简单地从更大表达式添加或减去一个常数值的修饰符。

有效的 roll expressions 的例子包括

  • 3d6
  • 2d10 + 5
  • 1d20-3
  • +6
  • -2
  • 3d10+5d100-21+7

Roll expressions 可以具有任意长度和复杂性,并且在应用修饰符后,roll expressions 的最终结果可以是负数,这是完全合法的。

使用方法

extern crate d20;

fn main() {
    let r = d20::roll_dice("3d6 + 4").unwrap();
    assert!(r.total > 6);
    let r = d20::roll_dice("1d1-3").unwrap();
    assert_eq!(r.total, -2);

    let r = d20::roll_dice("roll four chickens and add six ferrets");
    match r {
       Ok(_) => assert!(false), // this should NOT be ok, fail
       Err(_) => assert!(true), // bad expressions produce errors
   }
}

迭代 Roll

一个有效的 Roll 可以通过其 into_iter() 方法转换为开放式迭代器,提供给定掷骰子表达式的连续掷骰。

请注意,将需要通过 take(n) 限制迭代器。

extern crate d20;
use d20::*;

fn main() {
    let raw_stats: Vec<Roll> = d20::roll_dice("3d6").unwrap().into_iter().take(6).collect();

    println!("\nCHARACTER STATS:");
    println!("  STR: {}", raw_stats[0].total);
    println!("  INT: {}", raw_stats[1].total);
    println!("  WIS: {}", raw_stats[2].total);
    println!("  DEX: {}", raw_stats[3].total);
    println!("  CON: {}", raw_stats[4].total);
    println!("  CHA: {}", raw_stats[5].total);
}

范围 Roll

如果你对骰子滚动的关注较少,只需要给定范围内的随机数,则 roll_range() 就可以做到这一点。

extern crate d20;
fn main() {
    let rg = d20::roll_range(1,100).unwrap();
    assert!(rg >= 1 && rg <= 100);
}

依赖关系

~4MB
~78K SLoC