mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2025-12-26 04:41:52 -08:00
140 lines
3.8 KiB
Rust
140 lines
3.8 KiB
Rust
use rand::{prelude::ThreadRng, Rng};
|
|
use std::{fmt, io, mem};
|
|
|
|
#[derive(PartialEq, Eq, PartialOrd, Ord)]
|
|
struct Card(u8);
|
|
|
|
impl Card {
|
|
fn new_random(rng: &mut ThreadRng) -> Card {
|
|
Card(rng.gen_range(2..15))
|
|
}
|
|
}
|
|
|
|
impl fmt::Display for Card {
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
write!(
|
|
f,
|
|
"{}",
|
|
match self.0 {
|
|
11 => String::from("JACK"),
|
|
12 => String::from("QUEEN"),
|
|
13 => String::from("KING"),
|
|
14 => String::from("ACE"),
|
|
otherwise => otherwise.to_string(),
|
|
}
|
|
)
|
|
}
|
|
}
|
|
|
|
struct CardsPool(Card, Card, Card);
|
|
|
|
impl CardsPool {
|
|
fn new() -> CardsPool {
|
|
let mut rng = rand::thread_rng();
|
|
let mut first = Card::new_random(&mut rng);
|
|
let mut second = Card::new_random(&mut rng);
|
|
let third = Card::new_random(&mut rng);
|
|
|
|
if first > second {
|
|
mem::swap(&mut first, &mut second);
|
|
}
|
|
|
|
CardsPool(first, second, third)
|
|
}
|
|
|
|
fn is_in_win_range(&self) -> bool {
|
|
self.0 <= self.2 && self.2 <= self.1
|
|
}
|
|
}
|
|
|
|
fn main() {
|
|
hello();
|
|
// user start bank
|
|
let mut user_bank: u16 = 100;
|
|
|
|
loop {
|
|
println!("YOU NOW HAVE {} DOLLARS.", &mut user_bank);
|
|
println!("\nHERE ARE YOUR NEXT TWO CARDS:");
|
|
// get new random cards
|
|
let cards = CardsPool::new();
|
|
|
|
println!("{}", cards.0);
|
|
println!("{}", cards.1);
|
|
|
|
let user_bet: u16 = get_bet(user_bank);
|
|
|
|
if user_bet == 0 {
|
|
println!("CHICKEN!!!\n");
|
|
continue;
|
|
} else {
|
|
println!("THANK YOU! YOUR BET IS {} DOLLARS.", user_bet);
|
|
}
|
|
|
|
println!("\nTHE THIRD CARD IS:");
|
|
println!("{}", cards.2);
|
|
|
|
if cards.is_in_win_range() {
|
|
println!("\nYOU WIN!!!");
|
|
user_bank += user_bet;
|
|
} else {
|
|
println!("\nSORRY, YOU LOSE");
|
|
user_bank -= user_bet;
|
|
}
|
|
|
|
if user_bank == 0 {
|
|
println!("\nSORRY, FRIEND, BUT YOU BLEW YOUR WAD.");
|
|
println!("\nTRY AGAIN? (YES OR NO)");
|
|
let mut input = String::new();
|
|
io::stdin().read_line(&mut input).expect("Incorrect input");
|
|
|
|
if input.trim().to_lowercase() == "yes" {
|
|
user_bank = 100;
|
|
println!();
|
|
} else {
|
|
println!("\nO.K., HOPE YOU HAD FUN!");
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
fn hello() {
|
|
println!(" 🂡 ACEY DUCEY CARD GAME 🂱");
|
|
println!("CREATIVE COMPUTING - MORRISTOWN, NEW JERSEY");
|
|
println!("ACEY-DUCEY IS PLAYED IN THE FOLLOWING MANNER");
|
|
println!("THE DEALER (COMPUTER) DEALS TWO CARDS FACE UP");
|
|
println!("YOU HAVE AN OPTION TO BET OR NOT BET DEPENDING");
|
|
println!("ON WHETHER OR NOT YOU FEEL THE CARD WILL HAVE");
|
|
println!("A VALUE BETWEEN THE FIRST TWO.");
|
|
println!("IF YOU DO NOT WANT TO BET IN A ROUND, ENTER 0");
|
|
println!("\n\n");
|
|
}
|
|
|
|
fn get_bet(user_bank: u16) -> u16 {
|
|
loop {
|
|
println!("\nWHAT IS YOUR BET? ENTER 0 IF YOU DON'T WANT TO BET (CTRL+C TO EXIT)");
|
|
let bet: u16;
|
|
let mut input = String::new();
|
|
|
|
io::stdin()
|
|
.read_line(&mut input)
|
|
.expect("CANNOT READ INPUT!");
|
|
|
|
match input.trim().parse::<u16>() {
|
|
Ok(i) => bet = i,
|
|
Err(e) => {
|
|
println!("CHECK YOUR INPUT! {}!", e.to_string().to_uppercase());
|
|
continue;
|
|
}
|
|
};
|
|
|
|
match bet {
|
|
bet if bet <= user_bank => return bet,
|
|
_ => {
|
|
println!("\nSORRY, MY FRIEND, BUT YOU BET TOO MUCH.");
|
|
println!("YOU HAVE ONLY {} DOLLARS TO BET.", user_bank);
|
|
}
|
|
};
|
|
}
|
|
}
|