From 605a80767280c46767687253c78b5f8f7fca1999 Mon Sep 17 00:00:00 2001 From: mur4ik18 Date: Tue, 15 Feb 2022 23:04:10 +0200 Subject: [PATCH 1/6] :memo: updated .gitignore for rust --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index fea38bce..d6fb1f7f 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,7 @@ Pipfile .DS_Store .vs/ +/target/ +Cargo.lock +**/*.rs.bk +/target From a97e36e4e31701214556853700f978bda33a6e13 Mon Sep 17 00:00:00 2001 From: mur4ik18 Date: Tue, 15 Feb 2022 23:17:17 +0200 Subject: [PATCH 2/6] :rocket: Ace game in rust started --- .gitignore | 2 +- 01_Acey_Ducey/rust/Cargo.toml | 9 +++++++++ 01_Acey_Ducey/rust/src/main.rs | 28 ++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 01_Acey_Ducey/rust/Cargo.toml create mode 100644 01_Acey_Ducey/rust/src/main.rs diff --git a/.gitignore b/.gitignore index d6fb1f7f..2675262f 100644 --- a/.gitignore +++ b/.gitignore @@ -31,7 +31,7 @@ Pipfile .DS_Store .vs/ -/target/ +**/target/ Cargo.lock **/*.rs.bk /target diff --git a/01_Acey_Ducey/rust/Cargo.toml b/01_Acey_Ducey/rust/Cargo.toml new file mode 100644 index 00000000..3b1d02f5 --- /dev/null +++ b/01_Acey_Ducey/rust/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "rust" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +rand = "0.8.5" diff --git a/01_Acey_Ducey/rust/src/main.rs b/01_Acey_Ducey/rust/src/main.rs new file mode 100644 index 00000000..b9057180 --- /dev/null +++ b/01_Acey_Ducey/rust/src/main.rs @@ -0,0 +1,28 @@ +use std::io; + + +fn main() { + let mut user_bank: u16 = 100; + +} + +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"); +} + +fn card_name(card: u8) -> String { + match card { + 11 => String::from("JACK"), + 12 => String::from("QUEEN"), + 13 => String::from("KING"), + 14 => String::from("ACE"), + _ => card.to_string() + } +} From 28afbb35aa68ac2dac1d741ab8bba02ce94a71c7 Mon Sep 17 00:00:00 2001 From: mur4ik18 Date: Wed, 16 Feb 2022 00:52:33 +0200 Subject: [PATCH 3/6] :rocket: half of game complete --- 01_Acey_Ducey/rust/src/main.rs | 57 ++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/01_Acey_Ducey/rust/src/main.rs b/01_Acey_Ducey/rust/src/main.rs index b9057180..aece3f53 100644 --- a/01_Acey_Ducey/rust/src/main.rs +++ b/01_Acey_Ducey/rust/src/main.rs @@ -1,9 +1,43 @@ use std::io; +use std::process; +use rand::{Rng, prelude::ThreadRng}; + +struct CardsPool { + first: u8, + second: u8, + third: u8 +} +impl CardsPool { + fn new(rng: &mut ThreadRng)-> CardsPool{ + CardsPool{ + first: rng.gen_range(2..15), + second: rng.gen_range(2..15), + third: rng.gen_range(2..15) + } + } +} fn main() { + // user start bank let mut user_bank: u16 = 100; + let mut rng = rand::thread_rng(); + loop { + println!("YOU NOW HAVE {} DOLLARS.", &mut user_bank); + println!("HERE ARE YOUR NEXT TWO CARDS:"); + // get new random cards + let cards = CardsPool::new(&mut rng); + println!("{}", card_name(cards.first)); + println!("{}", card_name(cards.second)); + let mut user_bet: u16; + user_bet = get_bet(user_bank); + if user_bet == 0 { + println!("CHICKEN!!!"); + continue; + } + println!("{}", card_name(cards.third)); + } } fn hello() { @@ -26,3 +60,26 @@ fn card_name(card: u8) -> String { _ => card.to_string() } } + + +fn get_bet(user_bank: u16) -> u16 { + println!("WHAT IS YOUR BET? ENTER 0 IF YOU DON'T WANT TO BET (CTRL+C TO EXIT)"); + let mut bet: u16; + let mut input = String::new(); + + io::stdin() + .read_line(&mut input) + .expect("Sorry your input incorrect"); + + bet = input.trim().parse::().unwrap(); + match bet { + 0 => bet, + bet if bet < user_bank => bet, + _ => { + println!("SORRY, MY FRIEND, BUT YOU BET TOO MUCH."); + println!("YOU HAVE ONLY {} DOLLARS TO BET.", user_bank); + get_bet(user_bank) + } + } +} + From 281bcbf2a2a32ff9903e31ad7191d09194300cbb Mon Sep 17 00:00:00 2001 From: mur4ik18 Date: Wed, 16 Feb 2022 05:19:38 +0200 Subject: [PATCH 4/6] :rocket: 01 in rust complete --- 01_Acey_Ducey/rust/src/main.rs | 51 ++++++++++++++++++++++++++++++---- 1 file changed, 46 insertions(+), 5 deletions(-) diff --git a/01_Acey_Ducey/rust/src/main.rs b/01_Acey_Ducey/rust/src/main.rs index aece3f53..3aeca5c5 100644 --- a/01_Acey_Ducey/rust/src/main.rs +++ b/01_Acey_Ducey/rust/src/main.rs @@ -1,5 +1,4 @@ use std::io; -use std::process; use rand::{Rng, prelude::ThreadRng}; struct CardsPool { @@ -9,9 +8,18 @@ struct CardsPool { } impl CardsPool { fn new(rng: &mut ThreadRng)-> CardsPool{ + let mut f = rng.gen_range(2..15); + let mut s = rng.gen_range(2..15); + + if f > s { + let x = f; + f = s; + s = x; + } + CardsPool{ - first: rng.gen_range(2..15), - second: rng.gen_range(2..15), + first: f, + second: s, third: rng.gen_range(2..15) } } @@ -19,6 +27,7 @@ impl CardsPool { fn main() { + hello(); // user start bank let mut user_bank: u16 = 100; let mut rng = rand::thread_rng(); @@ -27,16 +36,47 @@ fn main() { println!("HERE ARE YOUR NEXT TWO CARDS:"); // get new random cards let cards = CardsPool::new(&mut rng); + println!("{}", card_name(cards.first)); println!("{}", card_name(cards.second)); + let mut user_bet: u16; user_bet = get_bet(user_bank); + if user_bet == 0 { - println!("CHICKEN!!!"); + println!("CHICKEN!!!\n"); continue; } + else { + println!("THANK YOU! YOUR BET IS {} DOLLARS.", &mut user_bet); + } + + println!("\nTHE THIRD CARD IS:"); println!("{}", card_name(cards.third)); + if cards.first <= cards.third && cards.third <= cards.second { + println!("YOU WIN!!!\n"); + user_bank += user_bet; + } else { + println!("SORRY, YOU LOSE\n"); + user_bank -= user_bet; + } + + + if user_bank == 0 { + println!("\nSORRY, FRIEND, BUT YOU BLEW YOUR WAD.\n"); + println!("TRY AGAIN? (yes OR no)"); + let mut input = String::new(); + io::stdin() + .read_line(&mut input) + .expect("Incorrect input"); + + if String::from("yes") == input { + user_bank = 100; + } else { + println!("O.K., HOPE YOU HAD FUN!"); + } + } } } @@ -49,6 +89,7 @@ fn hello() { 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\n"); } fn card_name(card: u8) -> String { @@ -64,7 +105,7 @@ fn card_name(card: u8) -> String { fn get_bet(user_bank: u16) -> u16 { println!("WHAT IS YOUR BET? ENTER 0 IF YOU DON'T WANT TO BET (CTRL+C TO EXIT)"); - let mut bet: u16; + let bet: u16; let mut input = String::new(); io::stdin() From d520f15f141f7bd26459ed1372eca82e5a8e8ea9 Mon Sep 17 00:00:00 2001 From: Alex Kotov <79057640+mur4ik18@users.noreply.github.com> Date: Wed, 16 Feb 2022 05:23:37 +0200 Subject: [PATCH 5/6] Create README.md --- 01_Acey_Ducey/rust/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 01_Acey_Ducey/rust/README.md diff --git a/01_Acey_Ducey/rust/README.md b/01_Acey_Ducey/rust/README.md new file mode 100644 index 00000000..9df86bc0 --- /dev/null +++ b/01_Acey_Ducey/rust/README.md @@ -0,0 +1,3 @@ +Original source downloaded [from Vintage Basic](http://www.vintage-basic.net/games.html) + +Conversion to [Rust](https://www.rust-lang.org/) by Alex Kotov [mur4ik18@github](https://github.com/mur4ik18). From e12ade3656ae565de02dc456b6603b2641fd1ab1 Mon Sep 17 00:00:00 2001 From: remimimimi Date: Wed, 16 Feb 2022 17:10:21 +0300 Subject: [PATCH 6/6] Refactor code --- 01_Acey_Ducey/rust/src/main.rs | 107 +++++++++++++++++---------------- 1 file changed, 56 insertions(+), 51 deletions(-) diff --git a/01_Acey_Ducey/rust/src/main.rs b/01_Acey_Ducey/rust/src/main.rs index 3aeca5c5..d8eed2ba 100644 --- a/01_Acey_Ducey/rust/src/main.rs +++ b/01_Acey_Ducey/rust/src/main.rs @@ -1,60 +1,79 @@ -use std::io; -use rand::{Rng, prelude::ThreadRng}; +use rand::{prelude::ThreadRng, Rng}; +use std::{fmt, io, mem}; -struct CardsPool { - first: u8, - second: u8, - third: u8 -} -impl CardsPool { - fn new(rng: &mut ThreadRng)-> CardsPool{ - let mut f = rng.gen_range(2..15); - let mut s = rng.gen_range(2..15); +#[derive(PartialEq, Eq, PartialOrd, Ord)] +struct Card(u8); - if f > s { - let x = f; - f = s; - s = x; - } - - CardsPool{ - first: f, - second: s, - third: rng.gen_range(2..15) - } +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; - let mut rng = rand::thread_rng(); + loop { println!("YOU NOW HAVE {} DOLLARS.", &mut user_bank); println!("HERE ARE YOUR NEXT TWO CARDS:"); - // get new random cards - let cards = CardsPool::new(&mut rng); + // get new random cards + let cards = CardsPool::new(); - println!("{}", card_name(cards.first)); - println!("{}", card_name(cards.second)); + println!("{}", cards.0); + println!("{}", cards.1); - let mut user_bet: u16; - user_bet = get_bet(user_bank); + let user_bet: u16 = get_bet(user_bank); if user_bet == 0 { println!("CHICKEN!!!\n"); continue; - } - else { - println!("THANK YOU! YOUR BET IS {} DOLLARS.", &mut user_bet); + } else { + println!("THANK YOU! YOUR BET IS {} DOLLARS.", user_bet); } println!("\nTHE THIRD CARD IS:"); - println!("{}", card_name(cards.third)); + println!("{}", cards.2); - if cards.first <= cards.third && cards.third <= cards.second { + if cards.is_in_win_range() { println!("YOU WIN!!!\n"); user_bank += user_bet; } else { @@ -62,16 +81,13 @@ fn main() { user_bank -= user_bet; } - if user_bank == 0 { println!("\nSORRY, FRIEND, BUT YOU BLEW YOUR WAD.\n"); println!("TRY AGAIN? (yes OR no)"); let mut input = String::new(); - io::stdin() - .read_line(&mut input) - .expect("Incorrect input"); + io::stdin().read_line(&mut input).expect("Incorrect input"); - if String::from("yes") == input { + if "yes" == input { user_bank = 100; } else { println!("O.K., HOPE YOU HAD FUN!"); @@ -92,17 +108,6 @@ fn hello() { println!("\n\n\n"); } -fn card_name(card: u8) -> String { - match card { - 11 => String::from("JACK"), - 12 => String::from("QUEEN"), - 13 => String::from("KING"), - 14 => String::from("ACE"), - _ => card.to_string() - } -} - - fn get_bet(user_bank: u16) -> u16 { println!("WHAT IS YOUR BET? ENTER 0 IF YOU DON'T WANT TO BET (CTRL+C TO EXIT)"); let bet: u16; @@ -112,6 +117,7 @@ fn get_bet(user_bank: u16) -> u16 { .read_line(&mut input) .expect("Sorry your input incorrect"); + // XXX: Unhandled input bet = input.trim().parse::().unwrap(); match bet { 0 => bet, @@ -123,4 +129,3 @@ fn get_bet(user_bank: u16) -> u16 { } } } -