From 585fa31866522b769a95f40c8d74525666c3fdeb Mon Sep 17 00:00:00 2001 From: Wesley Irvin Date: Sat, 10 Jan 2026 17:58:25 -0500 Subject: [PATCH] Deck Implementation Implemented a Deck type that has a new function that returns an unshuffled deck. Also wrote an integration test for the new function to make sure that it works. --- src/card.rs | 1 + src/deck.rs | 41 +++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 3 +++ tests/deck_tests.rs | 18 ++++++++++++++++++ 4 files changed, 63 insertions(+) create mode 100644 tests/deck_tests.rs diff --git a/src/card.rs b/src/card.rs index 73562a1..624bca2 100644 --- a/src/card.rs +++ b/src/card.rs @@ -1,5 +1,6 @@ use std::fmt; +#[derive(Debug, Clone, Copy)] pub struct Card { pub suit: u8, pub value: u8, diff --git a/src/deck.rs b/src/deck.rs index e69de29..5793309 100644 --- a/src/deck.rs +++ b/src/deck.rs @@ -0,0 +1,41 @@ +use super::card::Card; + +pub struct Deck { + deck_size: u64, + current_card: u64, + cards: Vec, +} + +impl Deck { + pub fn new(num_decks: u64) -> Self { + let deck_size: u64 = num_decks * 52; + let mut cards: Vec = Vec::new(); + + for card in 0..deck_size { + let value = (card % 13) as u8; + let suit = ((card / 13) % 4) as u8; + + cards.push(Card { + value: value, + suit: suit, + }); + } + + Deck { + deck_size: deck_size, + current_card: 0, + cards: cards, + } + } + + pub fn get_next_card(&mut self) -> Card { + let next_card = self.cards[self.current_card as usize]; + self.current_card += 1; + + next_card + } + + pub fn deck_size(&self) -> usize { + self.deck_size as usize + } +} diff --git a/src/lib.rs b/src/lib.rs index a91a85e..ceb7cc4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,6 +2,9 @@ use std::error::Error; mod card; mod deck; + +pub use deck::Deck; + mod gamestate; mod hand; diff --git a/tests/deck_tests.rs b/tests/deck_tests.rs new file mode 100644 index 0000000..060402f --- /dev/null +++ b/tests/deck_tests.rs @@ -0,0 +1,18 @@ +use blackjack::Deck; + +#[test] +fn check_num_decks() { + let mut num_card: [u64; 52] = [0; 52]; + let num_decks = 8; + let mut deck = Deck::new(num_decks as u64); + + for _ in 0..deck.deck_size() { + let next_card = deck.get_next_card(); + let card_pos = next_card.suit * 13 + next_card.value; + num_card[card_pos as usize] += 1; + } + + for card in 0..num_card.len() { + assert_eq!(num_card[card], num_decks); + } +}