Skip to content

Commit ea1c72b

Browse files
Merge pull request #904 from kpcyrd/69-pizza-rust
Port 69_Pizza to Rust
2 parents 134d7c1 + b17510f commit ea1c72b

File tree

4 files changed

+214
-0
lines changed

4 files changed

+214
-0
lines changed

69_Pizza/rust/Cargo.lock

Lines changed: 23 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

69_Pizza/rust/Cargo.toml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
[package]
2+
name = "rust"
3+
version = "0.1.0"
4+
edition = "2021"
5+
6+
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
7+
8+
[dependencies]
9+
anyhow = "1.0.75"
10+
fastrand = "2.0.1"

69_Pizza/rust/README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Original source downloaded [from Vintage Basic](http://www.vintage-basic.net/games.html)
2+
3+
Conversion to [Rust](https://www.rust-lang.org/).

69_Pizza/rust/src/main.rs

Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
use anyhow::Result;
2+
use std::io;
3+
4+
fn print_centered(text: &str) {
5+
println!("{:^72}", text);
6+
}
7+
8+
fn read_line() -> Result<String> {
9+
let mut input = String::new();
10+
io::stdin().read_line(&mut input)?;
11+
input.truncate(input.trim_end().len());
12+
Ok(input)
13+
}
14+
15+
fn read_number() -> Result<u32> {
16+
let line = read_line()?;
17+
let num = line.parse()?;
18+
Ok(num)
19+
}
20+
21+
fn print_banner() {
22+
print_centered("PIZZA");
23+
print_centered("CREATIVE COMPUTING MORRISTOWN, NEW JERSEY");
24+
println!();
25+
println!();
26+
println!();
27+
}
28+
29+
fn print_instructions() -> Result<String> {
30+
println!("PIZZA DELIVERY GAME");
31+
println!();
32+
println!("WHAT IS YOUR FIRST NAME");
33+
34+
let name = read_line()?;
35+
println!("HI, {name}. IN THIS GAME YOU ARE TO TAKE ORDERS");
36+
println!("FOR PIZZAS. THEN YOU ARE TO TELL A DELIVERY BOY");
37+
println!("WHERE TO DELIVER THE ORDERED PIZZAS.");
38+
println!();
39+
println!();
40+
41+
print_map();
42+
43+
println!("THE OUTPUT IS A MAP OF THE HOMES WHERE");
44+
println!("YOU ARE TO SEND PIZZAS.");
45+
println!();
46+
println!("YOUR JOB IS TO GIVE A TRUCK DRIVER");
47+
println!("THE LOCATION OR COORDINATES OF THE");
48+
println!("HOME ORDERING THE PIZZA.");
49+
println!();
50+
51+
Ok(name)
52+
}
53+
54+
fn print_ruler() {
55+
println!(" -----1-----2-----3-----4-----");
56+
}
57+
58+
fn print_ticks() {
59+
println!("-");
60+
println!("-");
61+
println!("-");
62+
println!("-");
63+
}
64+
65+
fn print_street(i: u32) {
66+
let street_number = 3 - i;
67+
let street_name = (street_number + 1).to_string();
68+
69+
let mut line = street_name.clone();
70+
let space = " ";
71+
for customer_idx in 0..4 {
72+
line.push_str(space);
73+
let customer = 4 * street_number + customer_idx;
74+
line.push(char::from_u32(65 + customer).unwrap());
75+
}
76+
line.push_str(space);
77+
line.push_str(&street_name);
78+
println!("{line}");
79+
}
80+
81+
fn print_map() {
82+
println!("MAP OF THE CITY OF HYATTSVILLE");
83+
println!();
84+
print_ruler();
85+
for i in 0..4 {
86+
print_ticks();
87+
print_street(i);
88+
}
89+
print_ticks();
90+
print_ruler();
91+
println!();
92+
}
93+
94+
fn yes_no_prompt(text: &str) -> Result<Option<bool>> {
95+
println!("{text}");
96+
let input = read_line()?;
97+
match input.as_str() {
98+
"YES" => Ok(Some(true)),
99+
"NO" => Ok(Some(false)),
100+
_ => Ok(None),
101+
}
102+
}
103+
104+
fn play_game(turns: u32, player_name: &str) -> Result<()> {
105+
for _ in 0..turns {
106+
let customer = fastrand::char('A'..='P');
107+
println!("HELLO {player_name}'S PIZZA. THIS IS {customer}.");
108+
println!(" PLEASE SEND A PIZZA.");
109+
loop {
110+
println!(" DRIVER TO {player_name}: WHERE DOES {customer} LIVE");
111+
112+
let x = read_number()?;
113+
let y = read_number()?;
114+
115+
let input = x - 1 + (y - 1) * 4;
116+
match char::from_u32(65 + input) {
117+
Some(c) if c == customer => {
118+
println!("HELLO {player_name}. THIS IS {customer}, THANKS FOR THE PIZZA.");
119+
break;
120+
}
121+
Some(c @ 'A'..='P') => {
122+
println!("THIS IS {c}. I DID NOT ORDER A PIZZA.");
123+
println!("I LIVE AT {x},{y}");
124+
}
125+
// this is out of bounds in the original game
126+
_ => (),
127+
}
128+
}
129+
}
130+
131+
Ok(())
132+
}
133+
134+
fn main() -> Result<()> {
135+
print_banner();
136+
let player_name = print_instructions()?;
137+
let more_directions = loop {
138+
if let Some(x) = yes_no_prompt("DO YOU NEED MORE DIRECTIONS")? {
139+
break x;
140+
} else {
141+
println!("'YES' OR 'NO' PLEASE, NOW THEN,");
142+
}
143+
};
144+
145+
if more_directions {
146+
println!();
147+
println!("SOMEBODY WILL ASK FOR A PIZZA TO BE");
148+
println!("DELIVERED. THEN A DELIVERY BOY WILL");
149+
println!("ASK YOU FOR THE LOCATION.");
150+
println!(" EXAMPLE:");
151+
println!("THIS IS J. PLEASE SEND A PIZZA.");
152+
println!("DRIVER TO {player_name}. WHERE DOES J LIVE?");
153+
println!("YOUR ANSWER WOULD BE 2,3");
154+
println!();
155+
156+
if let Some(true) = yes_no_prompt("UNDERSTAND")? {
157+
println!("GOOD. YOU ARE NOW READY TO START TAKING ORDERS.");
158+
println!();
159+
println!("GOOD LUCK!!");
160+
println!();
161+
} else {
162+
println!("THIS JOB IS DEFINITELY TOO DIFFICULT FOR YOU. THANKS ANYWAY");
163+
return Ok(());
164+
}
165+
}
166+
167+
loop {
168+
play_game(5, &player_name)?;
169+
println!();
170+
171+
if let Some(false) | None = yes_no_prompt("DO YOU WANT TO DELIVER MORE PIZZAS")? {
172+
println!();
173+
println!("O.K. {player_name}, SEE YOU LATER!");
174+
println!();
175+
return Ok(());
176+
}
177+
}
178+
}

0 commit comments

Comments
 (0)