From 15eb81cb2e6b1d66ef6200eca24fe2e742a9511d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?U=C4=9Fur=20K=C3=BCpeli?= Date: Sat, 7 May 2022 17:18:15 +0300 Subject: [PATCH 1/5] Init intro / instructions getting bets --- 75_Roulette/rust/Cargo.toml | 10 +++++++ 75_Roulette/rust/src/main.rs | 55 ++++++++++++++++++++++++++++++++++++ 75_Roulette/rust/src/util.rs | 41 +++++++++++++++++++++++++++ 3 files changed, 106 insertions(+) create mode 100644 75_Roulette/rust/Cargo.toml create mode 100644 75_Roulette/rust/src/main.rs create mode 100644 75_Roulette/rust/src/util.rs diff --git a/75_Roulette/rust/Cargo.toml b/75_Roulette/rust/Cargo.toml new file mode 100644 index 00000000..6767078c --- /dev/null +++ b/75_Roulette/rust/Cargo.toml @@ -0,0 +1,10 @@ +[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] +morristown = "0.1.2" +rand = "0.8.5" diff --git a/75_Roulette/rust/src/main.rs b/75_Roulette/rust/src/main.rs new file mode 100644 index 00000000..86f9df61 --- /dev/null +++ b/75_Roulette/rust/src/main.rs @@ -0,0 +1,55 @@ +mod util; + +use morristown::Instructions; +use util::INSTRUCTIONS; + +fn main() { + morristown::print_intro("ROULETTE"); + + let date = morristown::prompt_multi( + "ENTER CURRENT DATE (AS IN 'JANUARY 23, 1978)", + ",", + Some((2, 2)), + ); + + Instructions::new_multiline( + true, + false, + "DO YOU WANT INSTRUCTIONS?", + INSTRUCTIONS.to_vec(), + ) + .print(); + + let mut house: usize = 100000; + let mut player: usize = 1000; + + loop { + let bet_count = morristown::prompt_number_range::("HOW MANY BETS?", 1, std::u8::MAX); + let mut bets = Vec::new(); + + for i in 1..=bet_count { + loop { + let msg = format!("NUMBER {}?", i); + let bet_input = + morristown::prompt_multi_number::(msg.as_str(), ",", Some((2, 2))); + let (num, bet) = (bet_input[0], bet_input[1]); + + if num <= 50 && bet < 500 && bet <= player && bet > 0 { + bets.push(bet_input); + } else if bets.contains(&bet_input) { + println!("YOU MADE THAT BET ONCE ALREADY, DUM-DUM"); + } else { + println!("INVALID BET. TRY AGAIN"); + } + } + } + + /*SPIN AND CHECK RESULTS */ + + /*CHECK PLAYER AND HOUSE WALLETS */ + + /*ASK FOR PLAY AGAIN */ + + /*IF NOT PRINT THE CHECK */ + } +} diff --git a/75_Roulette/rust/src/util.rs b/75_Roulette/rust/src/util.rs new file mode 100644 index 00000000..ce4eb185 --- /dev/null +++ b/75_Roulette/rust/src/util.rs @@ -0,0 +1,41 @@ +pub const INSTRUCTIONS: [&str; 38] = [ + "\nTHIS IS THE BETTING LAYOUT", + "\n(*=RED)\n", + "1*\t2\t3*", + "4\t5*\t6", + "7*\t8\t9*", + "10\t11\t12*", + "---------------------", + "13\t14*\t15", + "16*\t17\t18*", + "19*\t20\t21*", + "22\t23*\t24", + "---------------------", + "25*\t26\t27*", + "28\t29\t30*", + "31\t32*\t33", + "34*\t35\t36*", + "---------------------", + "\t\t00\t0\n", + "TYPES OF BETS\n", + "THE NUMBERS 1 TO 36 SIGNIFY A STRAIGHT BET", + "ON THAT NUMBER", + "THESE PAY OFF 35:1\n", + "THE 2:1 BETS ARE:", + "37) 1-12\t40) FIRST COLUMN", + "38) 13-24\t41) SECOND COLUMN", + "39) 25-36\t42) THIRD COLUMN\n", + "THE EVEN MONEY BETS ARE:", + "43) 1-18\t46) ODD", + "44) 19-36\t47) RED", + "45) EVEN\t48) BLACK\n", + "\n49)0 AND 50)00 PAY OFF 35:1", + "NOTE: 0 AND 00 DO NOT COUNT UNDER ANY", + "\tBETS EXCEPT THEIR OWN\n", + "WHEN I ASK FOR EACH BET,TYPE THE NUMBER", + "AND THE AMOUNT,SEPARATED BY A COMMA", + "FOR EXAMPLE:TO BET $500 ON BLACK,TYPE 48,500", + "WHEN I ASK FOR A BET\n", + "MINIMUM BET IS $5,MAXIMUM IS $500\n" +]; + From d566a7df48ccd831b84c76da60bf9ba5e2db0623 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?U=C4=9Fur=20K=C3=BCpeli?= Date: Sat, 7 May 2022 17:39:01 +0300 Subject: [PATCH 2/5] update --- 75_Roulette/rust/src/main.rs | 23 ++++++++++++++++++++--- 75_Roulette/rust/src/util.rs | 7 ++++++- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/75_Roulette/rust/src/main.rs b/75_Roulette/rust/src/main.rs index 86f9df61..44435be5 100644 --- a/75_Roulette/rust/src/main.rs +++ b/75_Roulette/rust/src/main.rs @@ -1,8 +1,11 @@ mod util; use morristown::Instructions; +use rand::Rng; use util::INSTRUCTIONS; +use crate::util::print_check; + fn main() { morristown::print_intro("ROULETTE"); @@ -45,11 +48,25 @@ fn main() { } /*SPIN AND CHECK RESULTS */ + println!("\nSPINNING"); + let spin: u8 = rand::thread_rng().gen_range(1..=38); - /*CHECK PLAYER AND HOUSE WALLETS */ + if player <= 0 { + println!("OOPS! YOU JUST SPENT YOUR LAST DOLLAR"); + println!("THANKS FOR YOUR MONEY"); + println!("I'LL USE IT TO BUY A SOLID GOLD ROULETTE WHEEL"); + break; + } - /*ASK FOR PLAY AGAIN */ + if house <= 0 { + println!("YOU BROKE THE HOUSE!"); + print_check(player); + break; + } - /*IF NOT PRINT THE CHECK */ + if !morristown::prompt_bool("AGAIN?", false) { + print_check(player); + break; + } } } diff --git a/75_Roulette/rust/src/util.rs b/75_Roulette/rust/src/util.rs index ce4eb185..8dc4f726 100644 --- a/75_Roulette/rust/src/util.rs +++ b/75_Roulette/rust/src/util.rs @@ -36,6 +36,11 @@ pub const INSTRUCTIONS: [&str; 38] = [ "AND THE AMOUNT,SEPARATED BY A COMMA", "FOR EXAMPLE:TO BET $500 ON BLACK,TYPE 48,500", "WHEN I ASK FOR A BET\n", - "MINIMUM BET IS $5,MAXIMUM IS $500\n" + "MINIMUM BET IS $5,MAXIMUM IS $500\n", ]; +pub fn print_check(money: usize) { + let name = morristown::prompt_string("TO WHOM SHALL I MAKE THE CHECK?"); + let check_no; // random + /*PRINT THE CHECK */ +} From cd7ed8c3fbe4020773ae577083f5b6aec5fcc3f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?U=C4=9Fur=20K=C3=BCpeli?= Date: Sun, 8 May 2022 13:27:05 +0300 Subject: [PATCH 3/5] basic loop done - print check tODO --- 75_Roulette/rust/src/main.rs | 33 ++++++++++++++++++++++++++++++-- 75_Roulette/rust/src/util.rs | 37 ++++++++++++++++++++++++++++++++++-- 2 files changed, 66 insertions(+), 4 deletions(-) diff --git a/75_Roulette/rust/src/main.rs b/75_Roulette/rust/src/main.rs index 44435be5..5c1d314a 100644 --- a/75_Roulette/rust/src/main.rs +++ b/75_Roulette/rust/src/main.rs @@ -35,9 +35,9 @@ fn main() { let msg = format!("NUMBER {}?", i); let bet_input = morristown::prompt_multi_number::(msg.as_str(), ",", Some((2, 2))); - let (num, bet) = (bet_input[0], bet_input[1]); + let (bet_num, wager) = (bet_input[0], bet_input[1]); - if num <= 50 && bet < 500 && bet <= player && bet > 0 { + if bet_num > 0 && bet_num <= 50 && wager > 5 && wager < 500 && wager <= player { bets.push(bet_input); } else if bets.contains(&bet_input) { println!("YOU MADE THAT BET ONCE ALREADY, DUM-DUM"); @@ -51,6 +51,35 @@ fn main() { println!("\nSPINNING"); let spin: u8 = rand::thread_rng().gen_range(1..=38); + let color = if util::REDS.contains(&spin) { + "RED" + } else { + "BLACK" + }; + + println!("\n{} {}", spin, color); + + for (i, bet) in bets.iter().enumerate() { + let (bet_num, wager) = (bet[0] as u8, bet[1]); + let (win, payoff) = util::process_bet(bet_num, spin); + + let msg = if win { + let wager = wager * payoff as usize; + player += wager; + house -= wager; + "WIN" + } else { + player -= wager; + house += wager; + "LOSE" + }; + + println!("YOU {msg} {wager} DOLLARS ON BET {}", i + 1); + } + + println!("TOTALS\tME\tYOU"); + println!("\t\t{house}\t{player}"); + if player <= 0 { println!("OOPS! YOU JUST SPENT YOUR LAST DOLLAR"); println!("THANKS FOR YOUR MONEY"); diff --git a/75_Roulette/rust/src/util.rs b/75_Roulette/rust/src/util.rs index 8dc4f726..7af01917 100644 --- a/75_Roulette/rust/src/util.rs +++ b/75_Roulette/rust/src/util.rs @@ -1,3 +1,5 @@ +use std::ops::RangeInclusive; + pub const INSTRUCTIONS: [&str; 38] = [ "\nTHIS IS THE BETTING LAYOUT", "\n(*=RED)\n", @@ -39,8 +41,39 @@ pub const INSTRUCTIONS: [&str; 38] = [ "MINIMUM BET IS $5,MAXIMUM IS $500\n", ]; +pub const REDS: [u8; 18] = [ + 1, 3, 5, 7, 9, 12, 14, 16, 18, 19, 21, 23, 25, 27, 30, 32, 34, 36, +]; + pub fn print_check(money: usize) { let name = morristown::prompt_string("TO WHOM SHALL I MAKE THE CHECK?"); - let check_no; // random - /*PRINT THE CHECK */ + //let _check_no; // random + /*PRINT THE CHECK */ + todo!() +} + +pub fn process_bet(bet_num: u8, spin: u8) -> (bool, u8) { + match bet_num { + 1..=36 => (bet_num == spin, 35), + 37 => (is_within_range(1..=12, spin), 2), + 38 => (is_within_range(13..=24, spin), 2), + 39 => (is_within_range(25..=36, spin), 2), + 40 => (spin % 3 == 1, 2), + 41 => (spin % 3 == 2, 2), + 42 => (spin % 3 == 0, 2), + 43 => (is_within_range(1..=18, spin), 1), + 44 => (is_within_range(19..=36, spin), 1), + 45 => (spin % 2 == 0, 1), + 46 => (spin % 2 == 1, 1), + 47 => (REDS.contains(&spin), 1), + 48 => (!REDS.contains(&spin), 1), + _ => { + println!("##INVALID BET##"); + return (false, 0); + } + } +} + +fn is_within_range(r: RangeInclusive, n: u8) -> bool { + r.contains(&n) } From e7555fae9617c9841ddc2d8bbc490f8e99c6d817 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?U=C4=9Fur=20K=C3=BCpeli?= Date: Sun, 8 May 2022 14:39:46 +0300 Subject: [PATCH 4/5] 75_Roulette/rust --- 75_Roulette/rust/Cargo.toml | 2 +- 75_Roulette/rust/src/main.rs | 35 ++++++++++++++++++----------------- 75_Roulette/rust/src/util.rs | 34 +++++++++++++++++++++++----------- 3 files changed, 42 insertions(+), 29 deletions(-) diff --git a/75_Roulette/rust/Cargo.toml b/75_Roulette/rust/Cargo.toml index 6767078c..79ced295 100644 --- a/75_Roulette/rust/Cargo.toml +++ b/75_Roulette/rust/Cargo.toml @@ -6,5 +6,5 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -morristown = "0.1.2" +morristown = "0.1.3" rand = "0.8.5" diff --git a/75_Roulette/rust/src/main.rs b/75_Roulette/rust/src/main.rs index 5c1d314a..f4af5d74 100644 --- a/75_Roulette/rust/src/main.rs +++ b/75_Roulette/rust/src/main.rs @@ -4,8 +4,6 @@ use morristown::Instructions; use rand::Rng; use util::INSTRUCTIONS; -use crate::util::print_check; - fn main() { morristown::print_intro("ROULETTE"); @@ -28,7 +26,7 @@ fn main() { loop { let bet_count = morristown::prompt_number_range::("HOW MANY BETS?", 1, std::u8::MAX); - let mut bets = Vec::new(); + let mut bets: Vec> = Vec::new(); for i in 1..=bet_count { loop { @@ -37,18 +35,23 @@ fn main() { morristown::prompt_multi_number::(msg.as_str(), ",", Some((2, 2))); let (bet_num, wager) = (bet_input[0], bet_input[1]); - if bet_num > 0 && bet_num <= 50 && wager > 5 && wager < 500 && wager <= player { - bets.push(bet_input); - } else if bets.contains(&bet_input) { + if let Some(_) = bets.iter().find(|bet| bet[0] == bet_num) { println!("YOU MADE THAT BET ONCE ALREADY, DUM-DUM"); + } else if bet_num > 0 && bet_num <= 50 && wager >= 5 && wager <= 500 { + bets.push(bet_input); + player -= wager; + house += wager; + break; + } else if wager > player { + println!("NOT ENOUGH MONEY") } else { println!("INVALID BET. TRY AGAIN"); } } } - /*SPIN AND CHECK RESULTS */ println!("\nSPINNING"); + std::thread::sleep(std::time::Duration::from_secs(1)); let spin: u8 = rand::thread_rng().gen_range(1..=38); let color = if util::REDS.contains(&spin) { @@ -57,28 +60,26 @@ fn main() { "BLACK" }; - println!("\n{} {}", spin, color); + println!("\n{} {}\n", spin, color); for (i, bet) in bets.iter().enumerate() { let (bet_num, wager) = (bet[0] as u8, bet[1]); let (win, payoff) = util::process_bet(bet_num, spin); let msg = if win { - let wager = wager * payoff as usize; - player += wager; - house -= wager; + let pay = wager * payoff as usize; + player += wager + pay; + house -= pay; "WIN" } else { - player -= wager; - house += wager; "LOSE" }; println!("YOU {msg} {wager} DOLLARS ON BET {}", i + 1); } - println!("TOTALS\tME\tYOU"); - println!("\t\t{house}\t{player}"); + println!("\nTOTALS:\t\tME\t\tYOU"); + println!("\t\t{house}\t\t{player}"); if player <= 0 { println!("OOPS! YOU JUST SPENT YOUR LAST DOLLAR"); @@ -89,12 +90,12 @@ fn main() { if house <= 0 { println!("YOU BROKE THE HOUSE!"); - print_check(player); + util::print_check(player, date); break; } if !morristown::prompt_bool("AGAIN?", false) { - print_check(player); + util::print_check(player, date); break; } } diff --git a/75_Roulette/rust/src/util.rs b/75_Roulette/rust/src/util.rs index 7af01917..321a1416 100644 --- a/75_Roulette/rust/src/util.rs +++ b/75_Roulette/rust/src/util.rs @@ -1,5 +1,7 @@ use std::ops::RangeInclusive; +use rand::{thread_rng, Rng}; + pub const INSTRUCTIONS: [&str; 38] = [ "\nTHIS IS THE BETTING LAYOUT", "\n(*=RED)\n", @@ -7,18 +9,18 @@ pub const INSTRUCTIONS: [&str; 38] = [ "4\t5*\t6", "7*\t8\t9*", "10\t11\t12*", - "---------------------", + "--------------------", "13\t14*\t15", "16*\t17\t18*", "19*\t20\t21*", "22\t23*\t24", - "---------------------", + "--------------------", "25*\t26\t27*", "28\t29\t30*", "31\t32*\t33", "34*\t35\t36*", - "---------------------", - "\t\t00\t0\n", + "--------------------", + " 00 0\n", "TYPES OF BETS\n", "THE NUMBERS 1 TO 36 SIGNIFY A STRAIGHT BET", "ON THAT NUMBER", @@ -45,13 +47,6 @@ pub const REDS: [u8; 18] = [ 1, 3, 5, 7, 9, 12, 14, 16, 18, 19, 21, 23, 25, 27, 30, 32, 34, 36, ]; -pub fn print_check(money: usize) { - let name = morristown::prompt_string("TO WHOM SHALL I MAKE THE CHECK?"); - //let _check_no; // random - /*PRINT THE CHECK */ - todo!() -} - pub fn process_bet(bet_num: u8, spin: u8) -> (bool, u8) { match bet_num { 1..=36 => (bet_num == spin, 35), @@ -77,3 +72,20 @@ pub fn process_bet(bet_num: u8, spin: u8) -> (bool, u8) { fn is_within_range(r: RangeInclusive, n: u8) -> bool { r.contains(&n) } + +pub fn print_check(money: usize, date: Vec) { + let name = morristown::prompt_string("TO WHOM SHALL I MAKE THE CHECK?"); + let check_no = thread_rng().gen_range(1..=100); + + let dashes = 60; + + println!("\n{}", "-".repeat(dashes)); + println!("CHECK NO. {}\n", check_no); + println!("{}{}, {}\n\n", "\t".repeat(4), date[0], date[1]); + println!("PAY TO THE ORDER OF-----{name}-----$ {money}\n\n"); + println!("\t\tTHE MEMORY BANK OF VIRGINIA\n"); + println!("\t\t\t\tTHE COMPUTER"); + println!("\t\t\t ----------X-----\t"); + println!("{}", "-".repeat(dashes)); + println!("COME BACK SOON!\n") +} From 09979ac0f8c0832875f3edb7974ef9b3fc850793 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?U=C4=9Fur=20K=C3=BCpeli?= Date: Sun, 8 May 2022 18:52:41 +0300 Subject: [PATCH 5/5] rust port : update updated morristown functions --- 75_Roulette/rust/Cargo.toml | 2 +- 75_Roulette/rust/src/main.rs | 16 ++++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/75_Roulette/rust/Cargo.toml b/75_Roulette/rust/Cargo.toml index 79ced295..37f4add7 100644 --- a/75_Roulette/rust/Cargo.toml +++ b/75_Roulette/rust/Cargo.toml @@ -6,5 +6,5 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -morristown = "0.1.3" +morristown = "0.1.4" rand = "0.8.5" diff --git a/75_Roulette/rust/src/main.rs b/75_Roulette/rust/src/main.rs index f4af5d74..b0fd8765 100644 --- a/75_Roulette/rust/src/main.rs +++ b/75_Roulette/rust/src/main.rs @@ -1,16 +1,16 @@ mod util; -use morristown::Instructions; +use morristown::{Instructions, PromptMultiOption}; use rand::Rng; use util::INSTRUCTIONS; fn main() { morristown::print_intro("ROULETTE"); - let date = morristown::prompt_multi( + let date = morristown::prompt_multi_string( "ENTER CURRENT DATE (AS IN 'JANUARY 23, 1978)", ",", - Some((2, 2)), + Some(PromptMultiOption::UnitAmount(2)), ); Instructions::new_multiline( @@ -25,14 +25,18 @@ fn main() { let mut player: usize = 1000; loop { - let bet_count = morristown::prompt_number_range::("HOW MANY BETS?", 1, std::u8::MAX); + let bet_count = morristown::prompt_number_range::("HOW MANY BETS?", 1..=10); let mut bets: Vec> = Vec::new(); for i in 1..=bet_count { loop { let msg = format!("NUMBER {}?", i); - let bet_input = - morristown::prompt_multi_number::(msg.as_str(), ",", Some((2, 2))); + let bet_input = morristown::prompt_multi_number::( + msg.as_str(), + ",", + Some(PromptMultiOption::UnitAmount(2)), + None, + ); let (bet_num, wager) = (bet_input[0], bet_input[1]); if let Some(_) = bets.iter().find(|bet| bet[0] == bet_num) {