diff options
author | Kjetil Orbekk <kj@orbekk.com> | 2022-12-03 17:25:32 -0500 |
---|---|---|
committer | Kjetil Orbekk <kj@orbekk.com> | 2022-12-03 17:25:32 -0500 |
commit | 581e9ec21a85a3d2f908016c28d831e8022cb1f4 (patch) | |
tree | dc098241f07ff9c1cdc226de3fbc2e385c6240cb /protocol/src/bridge_engine.rs | |
parent | e6933ac48848b598f870ff5a9d96a0336728620b (diff) |
Change deal function to use random()
Diffstat (limited to 'protocol/src/bridge_engine.rs')
-rw-r--r-- | protocol/src/bridge_engine.rs | 42 |
1 files changed, 35 insertions, 7 deletions
diff --git a/protocol/src/bridge_engine.rs b/protocol/src/bridge_engine.rs index fa5c995..0eb9c1e 100644 --- a/protocol/src/bridge_engine.rs +++ b/protocol/src/bridge_engine.rs @@ -1,7 +1,7 @@ -use crate::card::{Card, Deal, RankOrder, Suit}; +use crate::card::{Card, RankOrder, Suit, sort_cards, make_deck}; use anyhow::{anyhow, bail}; use log::{error, info}; -use rand::{prelude::Distribution, distributions::Standard}; +use rand::{prelude::{Distribution, SliceRandom}, distributions::Standard}; use regex::Regex; use serde::{Deserialize, Serialize}; use std::cmp::Ordering; @@ -620,11 +620,39 @@ impl GameState { } } -pub fn deal() -> Deal { - let mut rng = rand::thread_rng(); - let mut deal = crate::card::deal(&mut rng); - deal.sort(&SUIT_DISPLAY_ORDER, RankOrder::Descending); - deal +#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] +pub struct Deal { + pub north: Vec<Card>, + pub west: Vec<Card>, + pub south: Vec<Card>, + pub east: Vec<Card>, +} + +impl Deal { + pub fn sort(&mut self, suits: &[Suit; 4], ord: RankOrder) { + sort_cards(suits, ord, self.north.as_mut_slice()); + sort_cards(suits, ord, self.west.as_mut_slice()); + sort_cards(suits, ord, self.south.as_mut_slice()); + sort_cards(suits, ord, self.east.as_mut_slice()); + } +} + +impl Distribution<Deal> for Standard { + fn sample<R: rand::Rng + ?Sized>(&self, rng: &mut R) -> Deal { + let mut deck = make_deck(); + deck.shuffle(rng); + let mut deck = deck.iter(); + let north = deck.by_ref().take(13).cloned().collect(); + let west = deck.by_ref().take(13).cloned().collect(); + let south = deck.by_ref().take(13).cloned().collect(); + let east = deck.by_ref().take(13).cloned().collect(); + Deal { + north, + west, + south, + east, + } + } } #[derive(Serialize, Deserialize, PartialEq, Eq, Clone, Debug)] |