1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
//! A blackjack engine for Rust.
//!
//! # Quick Start
//!
//! Here is an example to get the library working.
//! It automatically makes the player hit when their hand value is <17,
//! and stand when it's >= 17.
//!
//! ```
//! use twentyone::game::get_hand_value;
//! use twentyone::prelude::*;
//!
//! // Callback that will be used to return player's actions such as betting or hitting
//! fn callback(request: DealerRequest, player: Option<&Player>, dealer: &Dealer) -> PlayerAction {
//!     match request {
//!         // Dealer asking player to play, along with a hand index
//!         DealerRequest::Play(i) => {
//!             // Get the value of the player's hand
//!             let value = get_hand_value(&player.unwrap().hands()[i], true);
//!             println!("Player's hand value is {}", value);
//!             // Hit if the hand value is <17, stand if it isn't
//!             if value < 17 {
//!                 println!("Player is hitting");
//!                 PlayerAction::Hit
//!             } else {
//!                 println!("Player is standing");
//!                 PlayerAction::Stand
//!             }
//!         }
//!         // Dealer requesting a bet
//!         DealerRequest::Bet => {
//!             // Bet $10
//!             println!("Player is betting $10");
//!             PlayerAction::Bet(10)
//!         }
//!         // Dealer showing their hand when the game is over
//!         DealerRequest::DealerHand(hand) => {
//!             // Get the value of the player's and the dealer's hand
//!             let dealer_hand_value = get_hand_value(&hand, true);
//!             let player_hand_value = get_hand_value(&dealer.players()[0].hands()[0], true);
//!             // Print both
//!             println!("Player hand value is {}", player_hand_value);
//!             println!("Dealer hand value is {}", dealer_hand_value);
//!             // Print whether the player won, lost, or had a push
//!             if (player_hand_value > dealer_hand_value && player_hand_value <= 21)
//!                 || (player_hand_value <= 21 && dealer_hand_value > 21)
//!             {
//!                 println!("Player Won!");
//!             } else if player_hand_value == dealer_hand_value && player_hand_value <= 21 {
//!                 println!("Push.");
//!             } else {
//!                 println!("Player Lost.");
//!             }
//!             PlayerAction::None
//!         }
//!         // Dealer returning an error with the last action
//!         // Panic for error-checking reasons
//!         DealerRequest::Error(_) => panic!("An error occurred"),
//!         // Other events that don't require specific handling
//!         _ => PlayerAction::None,
//!     }
//! }
//!
//! fn main() {
//!     // Create a six-deck shoe and shuffle it
//!     let mut shoe = create_shoe(6);
//!     shuffle_deck(&mut shoe);
//!
//!     // Create a dealer
//!     let mut dealer = Dealer::new(shoe, DEFAULT_CONFIG, &callback);
//!     // Create a player with $1000
//!     let player = Player::new(1000);
//!     // Add the player to the dealer
//!     dealer.players_mut().push(player);
//!
//!     // Auto-play five rounds
//!     for _ in 0..5 {
//!         dealer.play_round(true);
//!     }
//! }
//!
//! ```
//!
//! More examples are available in the examples folder of the repository.
#![crate_name = "twentyone"]

pub mod cards;
pub mod game;
pub mod prelude;