From f1dfbb0fff7010e6086f4cd17b5fb97ff11ae3ce Mon Sep 17 00:00:00 2001 From: Kate Korsaro Date: Sat, 15 Nov 2025 12:41:41 +0100 Subject: [PATCH] feat: add roll method to Dice --- 01.workspace/oxydice_lib/examples/roll_3d6.rs | 3 ++- 01.workspace/oxydice_lib/src/imp/dice_grab.rs | 5 ++++- 01.workspace/oxydice_lib/src/imp/dice_roll.rs | 10 ++++++++++ 01.workspace/oxydice_lib/src/imp/die_roll.rs | 8 ++++++++ 01.workspace/oxydice_lib/src/imp/mod.rs | 2 ++ 01.workspace/oxydice_lib/src/lib.rs | 3 +++ 01.workspace/oxydice_lib/src/str/dice.rs | 1 + 01.workspace/oxydice_lib/src/str/mod.rs | 1 + .../oxydice_lib/src/str/roll_result.rs | 6 ++++++ 01.workspace/oxydice_lib/src/tst/dice_roll.rs | 20 +++++++++++++++++++ 01.workspace/oxydice_lib/src/tst/mod.rs | 1 + 11 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 01.workspace/oxydice_lib/src/imp/dice_roll.rs create mode 100644 01.workspace/oxydice_lib/src/imp/die_roll.rs create mode 100644 01.workspace/oxydice_lib/src/str/roll_result.rs create mode 100644 01.workspace/oxydice_lib/src/tst/dice_roll.rs diff --git a/01.workspace/oxydice_lib/examples/roll_3d6.rs b/01.workspace/oxydice_lib/examples/roll_3d6.rs index 8a5e7de..4cf0aa8 100644 --- a/01.workspace/oxydice_lib/examples/roll_3d6.rs +++ b/01.workspace/oxydice_lib/examples/roll_3d6.rs @@ -1,5 +1,6 @@ use oxydice_lib::*; fn main() { - let dice = dice::Dice::grab(3, 6); + let mut dice = dice::Dice::grab(3, 6); + dice.roll(); } diff --git a/01.workspace/oxydice_lib/src/imp/dice_grab.rs b/01.workspace/oxydice_lib/src/imp/dice_grab.rs index 67ec895..9c9a037 100644 --- a/01.workspace/oxydice_lib/src/imp/dice_grab.rs +++ b/01.workspace/oxydice_lib/src/imp/dice_grab.rs @@ -6,7 +6,10 @@ impl Dice { for _ in 1..=dice { handful.push(Die::new(sides)); } - Self { handful } + Self { + handful, + ..Self::default() + } } pub fn and_grab(mut self, dice: u16, sides: u16) -> Self { for _ in 1..=dice { diff --git a/01.workspace/oxydice_lib/src/imp/dice_roll.rs b/01.workspace/oxydice_lib/src/imp/dice_roll.rs new file mode 100644 index 0000000..31c6e27 --- /dev/null +++ b/01.workspace/oxydice_lib/src/imp/dice_roll.rs @@ -0,0 +1,10 @@ +use crate::*; + +impl Dice { + pub fn roll(&mut self) { + self.result.die_results.clear(); + for die in &self.handful { + self.result.die_results.push(die.roll()); + } + } +} diff --git a/01.workspace/oxydice_lib/src/imp/die_roll.rs b/01.workspace/oxydice_lib/src/imp/die_roll.rs new file mode 100644 index 0000000..ad6888e --- /dev/null +++ b/01.workspace/oxydice_lib/src/imp/die_roll.rs @@ -0,0 +1,8 @@ +use crate::*; + +impl Die { + pub fn roll(&self) -> u16 { + let mut rng = rand::rng(); + rng.random_range(0..self.sides) + } +} diff --git a/01.workspace/oxydice_lib/src/imp/mod.rs b/01.workspace/oxydice_lib/src/imp/mod.rs index 7de7499..86d7d10 100644 --- a/01.workspace/oxydice_lib/src/imp/mod.rs +++ b/01.workspace/oxydice_lib/src/imp/mod.rs @@ -1,2 +1,4 @@ pub mod dice_grab; +pub mod dice_roll; pub mod die_new; +pub mod die_roll; diff --git a/01.workspace/oxydice_lib/src/lib.rs b/01.workspace/oxydice_lib/src/lib.rs index f3344ff..ab78f4f 100644 --- a/01.workspace/oxydice_lib/src/lib.rs +++ b/01.workspace/oxydice_lib/src/lib.rs @@ -1,5 +1,7 @@ use std::*; +use rand::*; + mod fun; mod imp; mod mcr; @@ -9,6 +11,7 @@ mod tst; pub(crate) use crate::str::dice::O as Dice; pub(crate) use crate::str::die::O as Die; +pub(crate) use crate::str::roll_result::O as RollResult; pub mod dice { pub use crate::str::dice::O as Dice; diff --git a/01.workspace/oxydice_lib/src/str/dice.rs b/01.workspace/oxydice_lib/src/str/dice.rs index dabf274..174c26b 100644 --- a/01.workspace/oxydice_lib/src/str/dice.rs +++ b/01.workspace/oxydice_lib/src/str/dice.rs @@ -3,4 +3,5 @@ use crate::*; #[derive(Debug, Default, PartialEq, Clone)] pub struct O { pub(crate) handful: Vec, + pub(crate) result: RollResult, } diff --git a/01.workspace/oxydice_lib/src/str/mod.rs b/01.workspace/oxydice_lib/src/str/mod.rs index 177f396..5c62695 100644 --- a/01.workspace/oxydice_lib/src/str/mod.rs +++ b/01.workspace/oxydice_lib/src/str/mod.rs @@ -1,2 +1,3 @@ pub mod dice; pub mod die; +pub mod roll_result; diff --git a/01.workspace/oxydice_lib/src/str/roll_result.rs b/01.workspace/oxydice_lib/src/str/roll_result.rs new file mode 100644 index 0000000..ea31a6a --- /dev/null +++ b/01.workspace/oxydice_lib/src/str/roll_result.rs @@ -0,0 +1,6 @@ +use crate::*; + +#[derive(Debug, Default, PartialEq, Clone)] +pub struct O { + pub(crate) die_results: Vec, +} diff --git a/01.workspace/oxydice_lib/src/tst/dice_roll.rs b/01.workspace/oxydice_lib/src/tst/dice_roll.rs new file mode 100644 index 0000000..d40cd3e --- /dev/null +++ b/01.workspace/oxydice_lib/src/tst/dice_roll.rs @@ -0,0 +1,20 @@ +#[cfg(test)] +mod tests { + use crate::*; + #[test] + pub fn dice_roll_should_yield_always_the_proper_number_of_result() { + let mut dice = Dice::grab(3, 6); + for _ in 1..=1000 { + dice.roll(); + assert_eq!(dice.result.die_results.len(), 3); + } + } + #[test] + pub fn dice_roll_should_yield_valid_results() { + let mut dice = Dice::grab(3, 6); + for _ in 1..=10000 { + dice.roll(); + assert!(dice.result.die_results[0] < 6); + } + } +} diff --git a/01.workspace/oxydice_lib/src/tst/mod.rs b/01.workspace/oxydice_lib/src/tst/mod.rs index f8d11ea..10778b4 100644 --- a/01.workspace/oxydice_lib/src/tst/mod.rs +++ b/01.workspace/oxydice_lib/src/tst/mod.rs @@ -1 +1,2 @@ pub mod dice_grab; +pub mod dice_roll;