summaryrefslogtreecommitdiff
path: root/protocol/src/bridge_engine.rs
diff options
context:
space:
mode:
authorKjetil Orbekk <kj@orbekk.com>2022-12-03 17:25:32 -0500
committerKjetil Orbekk <kj@orbekk.com>2022-12-03 17:25:32 -0500
commit581e9ec21a85a3d2f908016c28d831e8022cb1f4 (patch)
treedc098241f07ff9c1cdc226de3fbc2e385c6240cb /protocol/src/bridge_engine.rs
parente6933ac48848b598f870ff5a9d96a0336728620b (diff)
Change deal function to use random()
Diffstat (limited to 'protocol/src/bridge_engine.rs')
-rw-r--r--protocol/src/bridge_engine.rs42
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)]