feat: Implemented Blinds Stage

This commit is contained in:
2025-11-23 23:56:05 +05:30
parent b93c197159
commit 03b63b77b5
3 changed files with 169 additions and 62 deletions

View File

@@ -1,57 +1,149 @@
use rand::Rng;
// use std::cmp::Ordering;
use std::io;
use rand::prelude::*;
use std::{io, vec};
fn main() {
let mut starting_balance = 50;
let cards = [
"2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King", "Ace",
];
#[derive(PartialEq, Eq, Clone, Copy, Debug)]
enum CardSuit {
Diamond,
Heart,
Club,
Spade,
}
#[derive(PartialEq, Eq, Clone, Copy)]
struct Card {
number: i32,
suit: CardSuit,
}
#[derive(PartialEq, Eq)]
enum PlayerType {
Human,
Cpu,
}
#[derive(PartialEq, Eq)]
struct Player {
name: String,
player_type: PlayerType,
score: i32,
cards: Vec<Card>,
}
fn convert_number(card_number: i32) -> String {
match card_number {
9 => String::from("Jack"),
10 => String::from("Queen"),
11 => String::from("King"),
12 => String::from("Ace"),
_ => (card_number + 2).to_string(),
}
}
fn read_int() -> i32 {
let mut _input_string = String::new();
io::stdin()
.read_line(&mut _input_string)
.expect("Could not get input");
_input_string.trim().parse().unwrap()
}
fn generate_card(seen_cards: &mut Vec<Card>) -> Card {
let mut rng = rand::rng();
loop {
if starting_balance <= 0 {
println!("You are out of money! Game over.");
break;
} else if starting_balance >= 100 {
println!("You reached 100! You win!");
break;
}
let user_card = rand::thread_rng().gen_range(0..=12);
let cpu_card = rand::thread_rng().gen_range(0..=12);
let selected_suit = [
CardSuit::Diamond,
CardSuit::Heart,
CardSuit::Club,
CardSuit::Spade,
]
.choose(&mut rng)
.unwrap();
println!("Your card: {}", cards[user_card]);
println!("1: I have better cards\n2: I have worse cards");
let mut user_action = String::new();
io::stdin()
.read_line(&mut user_action)
.expect("Failed to read line");
let user_action = match user_action.trim() {
"1" => "better",
"2" => "worse",
_ => {
println!("Invalid input, please enter 1 or 2.");
continue;
}
let new_card = Card {
number: rng.random_range(0..=12),
suit: *selected_suit,
};
if user_action == "better" {
if user_card >= cpu_card {
starting_balance += 10;
println!("You win! New balance: {starting_balance}");
} else {
starting_balance -= 10;
println!("You lose! New balance: {starting_balance}");
}
if seen_cards.contains(&new_card) {
continue;
} else {
if user_card <= cpu_card {
starting_balance += 10;
println!("You win! New balance: {starting_balance}");
} else {
starting_balance -= 10;
println!("You lose! New balance: {starting_balance}");
}
seen_cards.push(new_card);
break new_card;
}
}
}
fn main() {
let mut rng = rand::rng();
let mut seen_cards: Vec<Card> = Vec::new();
let mut pool = 0;
let mut user = Player {
name: String::from("sortedcord"),
player_type: PlayerType::Human,
score: 50,
cards: vec![
generate_card(&mut seen_cards),
generate_card(&mut seen_cards),
],
};
let mut cpu: Player = Player {
name: String::from("computer"),
player_type: PlayerType::Cpu,
score: 50,
cards: vec![
generate_card(&mut seen_cards),
generate_card(&mut seen_cards),
],
};
let big_blind: &Player = [&user, &cpu].choose(&mut rng).unwrap();
println!("Selected bigblind as {name} ", name = big_blind.name);
// Put money in the pot
if *big_blind == user {
let bet = rng.random_range(25..=45);
pool += bet;
cpu.score -= pool;
println!("CPU bet {pool} ");
pool = loop {
println!("Enter your big blind: ");
let bet: i32 = read_int();
if bet > user.score {
println!("Needs to be less or equal to your current holdings, try again!");
continue;
}
if bet <= pool {
println!("Needs to be greater than the small blind");
continue;
}
user.score -= bet;
pool += bet;
break pool;
};
} else {
println!("Enter your small blind: ");
let bet: i32 = read_int();
user.score -= bet;
pool += bet;
let bet = rng.random_range(pool..=50);
println!("CPU sets big blind as: {bet}");
cpu.score -= bet;
pool += bet;
}
println!("Pool size is now: {pool}");
println!("Your Hand: ");
for card in user.cards {
println!("{} of {:#?}", convert_number(card.number), card.suit);
}
}