1 个不稳定版本
使用旧的 Rust 2015
0.1.0 | 2017年4月7日 |
---|
#16 in #dnd
32 次每月下载
17KB
299 行代码(不含注释)
d20
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