New features

+ Add check for straight flush
+ Add check for four of a kind
+ Add launch.json
This commit is contained in:
2024-03-22 16:34:46 -04:00
parent 5398e2b443
commit b01c5209f5
2 changed files with 123 additions and 5 deletions

45
.vscode/launch.json vendored Normal file
View File

@@ -0,0 +1,45 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "lldb",
"request": "launch",
"name": "Debug executable 'cards'",
"cargo": {
"args": [
"build",
"--bin=cards",
"--package=cards"
],
"filter": {
"name": "cards",
"kind": "bin"
}
},
"args": [],
"cwd": "${workspaceFolder}"
},
{
"type": "lldb",
"request": "launch",
"name": "Debug unit tests in executable 'cards'",
"cargo": {
"args": [
"test",
"--no-run",
"--bin=cards",
"--package=cards"
],
"filter": {
"name": "cards",
"kind": "bin"
}
},
"args": [],
"cwd": "${workspaceFolder}"
}
]
}

View File

@@ -1,8 +1,9 @@
use rand::Rng; use rand::Rng;
use std::collections::HashMap;
use std::fmt; use std::fmt;
use std::vec; use std::vec;
#[derive(Clone, Copy)] #[derive(Clone, Copy, Eq, PartialEq)]
enum CardSuit { enum CardSuit {
Diamonds, Diamonds,
Clubs, Clubs,
@@ -15,6 +16,59 @@ struct PlayingCard {
suit: CardSuit, suit: CardSuit,
} }
fn is_straight_flush(hand: &Vec<PlayingCard>) -> bool {
assert!(hand.len() == 5);
let suit = hand[0].suit;
let mut min_val = 15;
let mut max_val = 1;
// Must all be the same suit
for i in 0..5 {
let card = &hand[i];
for k in (i + 1)..5 {
if hand[k].value == card.value {
return false;
}
}
if card.value < min_val {
min_val = card.value;
};
if card.value > max_val {
max_val = card.value;
}
if card.suit != suit {
return false;
}
}
if max_val - min_val > 4 {
return false;
}
true
}
fn is_four_of_a_kind(hand: &Vec<PlayingCard>) -> bool {
let mut count: HashMap<u8, u8> = HashMap::new();
for card in hand {
*count.entry(card.value).or_insert(0) += 1;
}
for e in count {
if e.1 == 4 {
return true;
}
}
false
}
impl fmt::Display for PlayingCard { impl fmt::Display for PlayingCard {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let val = match self.value { let val = match self.value {
@@ -73,9 +127,28 @@ fn create_deck() -> Vec<PlayingCard> {
fn main() { fn main() {
let mut deck = create_deck(); let mut deck = create_deck();
let card1 = draw_card(&mut deck); let card1: PlayingCard = PlayingCard {
let card2 = draw_card(&mut deck); suit: CardSuit::Clubs,
value: 2,
};
let card2: PlayingCard = PlayingCard {
suit: CardSuit::Clubs,
value: 2,
};
let card3: PlayingCard = PlayingCard {
suit: CardSuit::Clubs,
value: 2,
};
let card4: PlayingCard = PlayingCard {
suit: CardSuit::Clubs,
value: 2,
};
let card5: PlayingCard = PlayingCard {
suit: CardSuit::Clubs,
value: 3,
};
println!("Card 1: {}", card1); let hand = vec![card1, card2, card3, card4, card5];
println!("Card 2: {}", card2);
println!("{}", is_four_of_a_kind(&hand));
} }