Deck Implementation #11
@@ -1,5 +1,6 @@
|
||||
use std::fmt;
|
||||
|
||||
#[derive(Debug, Clone, Copy)]
|
||||
pub struct Card {
|
||||
pub suit: u8,
|
||||
pub value: u8,
|
||||
|
||||
41
src/deck.rs
41
src/deck.rs
@@ -0,0 +1,41 @@
|
||||
use super::card::Card;
|
||||
|
||||
pub struct Deck {
|
||||
deck_size: u64,
|
||||
current_card: u64,
|
||||
cards: Vec<Card>,
|
||||
}
|
||||
|
||||
impl Deck {
|
||||
pub fn new(num_decks: u64) -> Self {
|
||||
let deck_size: u64 = num_decks * 52;
|
||||
let mut cards: Vec<Card> = 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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,9 @@ use std::error::Error;
|
||||
|
||||
mod card;
|
||||
mod deck;
|
||||
|
||||
pub use deck::Deck;
|
||||
|
||||
mod gamestate;
|
||||
mod hand;
|
||||
|
||||
|
||||
18
tests/deck_tests.rs
Normal file
18
tests/deck_tests.rs
Normal file
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user