From 03b63b77b52fad6f15fb489044992a02644c3799 Mon Sep 17 00:00:00 2001 From: Aditya Gupta Date: Sun, 23 Nov 2025 23:56:05 +0530 Subject: [PATCH] feat: Implemented Blinds Stage --- Cargo.lock | 43 ++++++++---- Cargo.toml | 2 +- src/main.rs | 186 +++++++++++++++++++++++++++++++++++++++------------- 3 files changed, 169 insertions(+), 62 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c4f4e4e..6d5c3b9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10,13 +10,14 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "getrandom" -version = "0.2.16" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", "libc", - "wasi", + "r-efi", + "wasip2", ] [[package]] @@ -53,21 +54,26 @@ dependencies = [ ] [[package]] -name = "rand" -version = "0.8.5" +name = "r-efi" +version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ - "libc", "rand_chacha", "rand_core", ] [[package]] name = "rand_chacha" -version = "0.3.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", "rand_core", @@ -75,9 +81,9 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.6.4" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ "getrandom", ] @@ -107,10 +113,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" [[package]] -name = "wasi" -version = "0.11.1+wasi-snapshot-preview1" +name = "wasip2" +version = "1.0.1+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wit-bindgen" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" [[package]] name = "zerocopy" diff --git a/Cargo.toml b/Cargo.toml index c62ce52..b47634d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,4 +4,4 @@ version = "0.1.0" edition = "2024" [dependencies] -rand = "0.8.5" +rand = "0.9.2" diff --git a/src/main.rs b/src/main.rs index 9e79e09..eff1dce 100644 --- a/src/main.rs +++ b/src/main.rs @@ -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, +} + +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 { + 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 = 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); + } +}