From b2e2d547ef233fa9358cb5821fb3071b13ad1f13 Mon Sep 17 00:00:00 2001 From: Wesley Irvin Date: Sun, 11 Jan 2026 16:25:37 -0500 Subject: [PATCH] Created Hand Type Created a Hand type that can also calculate the sum of the cards in the hand. Also wrote a display for it so that we can just print hands out. Reviewed-on: https://git.wesirvin.com/wesley/blackjack/pulls/13 --- src/hand.rs | 82 +++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 5 +++ tests/hand_tests.rs | 40 ++++++++++++++++++++++ 3 files changed, 127 insertions(+) create mode 100644 tests/hand_tests.rs diff --git a/src/hand.rs b/src/hand.rs index e69de29..0693573 100644 --- a/src/hand.rs +++ b/src/hand.rs @@ -0,0 +1,82 @@ +use std::fmt; + +use super::card::Card; + +pub struct Hand { + cards: Vec, + is_dealer: bool, + show_all: bool, +} + +impl Hand { + pub fn new(is_dealer: bool) -> Self { + let cards: Vec = Vec::new(); + + Self { + cards: cards, + is_dealer: is_dealer, + show_all: !is_dealer, + } + } + + pub fn sum(&self) -> u8 { + let mut num_aces = 0; + let mut sum: u8 = 0; + if self.is_dealer && !self.show_all { + if self.cards[1].value + 1 > 10 { + return 10; + } else if self.cards[1].value + 1 == 1 { + return 11; + } + return self.cards[1].value + 1; + } + + for card in 0..self.cards.len() { + match self.cards[card].value + 1 { + 1 => { + sum += 11; + num_aces += 1; + } + 2..=9 => sum += self.cards[card].value + 1, + 10..=13 => sum += 10, + _ => sum += 0, + } + } + + while num_aces > 0 && sum > 21 { + num_aces -= 1; + sum -= 10; + } + + sum + } + + pub fn get_new_card(&mut self, new_card: Card) { + self.cards.push(new_card); + } + + pub fn set_show_all(&mut self, show_all: bool) { + if self.is_dealer { + self.show_all = show_all; + } + } +} + +impl fmt::Display for Hand { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let mut display_string = String::new(); + + if self.show_all { + for card in 0..self.cards.len() { + display_string.push_str(&self.cards[card].to_string()); + display_string.push_str(" "); + } + } else { + display_string.push_str("** "); + display_string.push_str(&self.cards[1].to_string()); + display_string.push_str(" "); + } + + write!(f, "{}", display_string) + } +} diff --git a/src/lib.rs b/src/lib.rs index ceb7cc4..61b0480 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,9 @@ use std::error::Error; mod card; + +pub use card::Card; + mod deck; pub use deck::Deck; @@ -8,6 +11,8 @@ pub use deck::Deck; mod gamestate; mod hand; +pub use hand::Hand; + pub fn run() -> Result<(), Box> { println!("Hello, world!"); diff --git a/tests/hand_tests.rs b/tests/hand_tests.rs new file mode 100644 index 0000000..5286d74 --- /dev/null +++ b/tests/hand_tests.rs @@ -0,0 +1,40 @@ +use blackjack::Card; +use blackjack::Hand; + +const ACE_HEARTS: Card = Card { suit: 0, value: 0 }; +const ACE_SPADES: Card = Card { suit: 3, value: 0 }; +const KING_HEARTS: Card = Card { suit: 0, value: 12 }; +const KING_SPADES: Card = Card { suit: 3, value: 12 }; + +#[test] +fn test_double_ace() { + let mut hand = Hand::new(false); + hand.get_new_card(ACE_HEARTS); + hand.get_new_card(ACE_SPADES); + + assert_eq!(12, hand.sum()); +} + +#[test] +fn double_ace_double_face() { + let mut hand = Hand::new(false); + hand.get_new_card(ACE_HEARTS); + hand.get_new_card(ACE_SPADES); + hand.get_new_card(KING_HEARTS); + hand.get_new_card(KING_SPADES); + + assert_eq!(22, hand.sum()); +} + +#[test] +fn show_all_is_dealer() { + let mut hand = Hand::new(true); + hand.get_new_card(ACE_HEARTS); + hand.get_new_card(KING_SPADES); + + assert_eq!(10, hand.sum()); + + hand.set_show_all(true); + + assert_eq!(21, hand.sum()); +}