Skip to content

Commit 795dac5

Browse files
Merge pull request #924 from marquesrs/hello-rust-implementation
Rust implementation for the game Hello
2 parents 9e724c1 + d494079 commit 795dac5

File tree

2 files changed

+253
-0
lines changed

2 files changed

+253
-0
lines changed

45_Hello/rust/Cargo.toml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
[package]
2+
name = "rust"
3+
version = "0.1.0"
4+
edition = "2021"
5+
6+
[dependencies]

45_Hello/rust/src/main.rs

Lines changed: 247 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,247 @@
1+
/** HELLO GAME BY DAVID AHL
2+
* https://github.com/coding-horror/basic-computer-games/blob/main/45_Hello/hello.bas
3+
* Direct conversion from BASIC to Rust by Pablo Marques (marquesrs).
4+
* No additional features or improvements were added. As a faithful translation,
5+
* many of the code here are done in an unrecommended way by today's standards.
6+
* 17/02/25
7+
*/
8+
9+
use std::io::Write;
10+
11+
fn main() {
12+
// 2 PRINT TAB(33);"HELLO"
13+
// 4 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY"
14+
// 6 PRINT: PRINT: PRINT
15+
print!(
16+
"{}{}\n{}{}\n\n\n\n",
17+
" ".repeat(33),
18+
"HELLO",
19+
" ".repeat(15),
20+
"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY"
21+
);
22+
23+
let mut input = String::new();
24+
25+
//10 PRINT "HELLO. MY NAME IS CREATIVE COMPUTER."
26+
//20 PRINT: PRINT: INPUT "WHAT'S YOUR NAME";N$: PRINT
27+
print!("HELLO. MY NAME IS CREATIVE COMPUTER.\n\nWHAT'S YOUR NAME? ");
28+
let _ = std::io::stdout().flush().unwrap();
29+
input.clear();
30+
std::io::stdin().read_line(&mut input).unwrap();
31+
let n = input.trim().to_uppercase();
32+
33+
//30 PRINT "HI THERE, ";N$;", ARE YOU ENJOYING YOURSELF HERE";
34+
//40 INPUT B$: PRINT
35+
print!("\nHI THERE, {n}, ARE YOU ENJOYING YOURSELF HERE? ");
36+
loop {
37+
let _ = std::io::stdout().flush().unwrap();
38+
input.clear();
39+
std::io::stdin().read_line(&mut input).unwrap();
40+
let b = input.trim().to_uppercase();
41+
42+
//50 IF B$="YES" THEN 70
43+
if b == "YES" {
44+
//70 PRINT "I'M GLAD TO HEAR THAT, ";N$;".": PRINT
45+
//75 GOTO 100
46+
println!("\nI'M GLAD TO HEAR THAT, {n}.");
47+
break;
48+
}
49+
//55 IF B$="NO" THEN 80
50+
else if b == "NO" {
51+
//80 PRINT "OH, I'M SORRY TO HEAR THAT, ";N$;". MAYBE WE CAN"
52+
//85 PRINT "BRIGHTEN UP YOUR VISIT A BIT."
53+
println!("\nOH, I'M SORRY TO HEAR THAT, {n}. MAYBE WE CAN\n{}",
54+
"BRIGHTEN UP YOUR VISIT A BIT."
55+
);
56+
break;
57+
}
58+
else {
59+
//60 PRINT N$;", I DON'T UNDERSTAND YOUR ANSWER OF '";B$;"'."
60+
//65 PRINT "PLEASE ANSWER 'YES' OR 'NO'. DO YOU LIKE IT HERE";: GOTO 40
61+
print!("\n{n}, I DON'T UNDERSTAND YOUR ANSWER OF '{b}'.\n{}",
62+
"PLEASE ANSWER 'YES' OR 'NO'. DO YOU LIKE IT HERE? "
63+
);
64+
}
65+
}
66+
67+
//100 PRINT
68+
//105 PRINT "SAY, ";N$;", I CAN SOLVE ALL KINDS OF PROBLEMS EXCEPT"
69+
//110 PRINT "THOSE DEALING WITH GREECE. WHAT KIND OF PROBLEMS DO"
70+
//120 PRINT "YOU HAVE (ANSWER SEX, HEALTH, MONEY, OR JOB)";
71+
//125 INPUT C$
72+
//126 PRINT
73+
print!("\nSAY, {n}, I CAN SOLVE ALL KINDS OF PROBLEMS EXCEPT\n{}\n{}",
74+
"THOSE DEALING WITH GREECE. WHAT KIND OF PROBLEMS DO",
75+
"YOU HAVE (ANSWER SEX, HEALTH, MONEY, OR JOB)? "
76+
);
77+
'outer: loop {
78+
let _ = std::io::stdout().flush().unwrap();
79+
input.clear();
80+
std::io::stdin().read_line(&mut input).unwrap();
81+
let c = input.trim().to_uppercase();
82+
83+
//130 IF C$="SEX" THEN 200
84+
if c == "SEX" {
85+
loop {
86+
//200 INPUT "IS YOUR PROBLEM TOO MUCH OR TOO LITTLE";D$: PRINT
87+
print!("\nIS YOUR PROBLEM TOO MUCH OR TOO LITTLE? ");
88+
let _ = std::io::stdout().flush().unwrap();
89+
input.clear();
90+
std::io::stdin().read_line(&mut input).unwrap();
91+
let d = input.trim().to_uppercase();
92+
93+
//210 IF D$="TOO MUCH" THEN 220
94+
if d == "TOO MUCH" {
95+
//220 PRINT "YOU CALL THAT A PROBLEM?!! I SHOULD HAVE SUCH PROBLEMS!"
96+
//225 PRINT "IF IT BOTHERS YOU, ";N$;", TAKE A COLD SHOWER."
97+
//228 GOTO 250
98+
println!("\nYOU CALL THAT A PROBLEM?!! I SHOULD HAVE SUCH PROBLEMS!\n{}",
99+
format!("IF IT BOTHERS YOU, {n}, TAKE A COLD SHOWER.")
100+
);
101+
break;
102+
}
103+
//212 IF D$="TOO LITTLE" THEN 230
104+
else if d == "TOO LITTLE" {
105+
//230 PRINT "WHY ARE YOU HERE IN SUFFERN, ";N$;"? YOU SHOULD BE"
106+
//235 PRINT "IN TOKYO OR NEW YORK OR AMSTERDAM OR SOMEPLACE WITH SOME"
107+
//240 PRINT "REAL ACTION."
108+
//250 PRINT
109+
println!("\nWHY ARE YOU HERE IN SUFFERN, {n}? YOU SHOULD BE\n{}\n{}",
110+
"IN TOKYO OR NEW YORK OR AMSTERDAM OR SOMEPLACE WITH",
111+
"SOME REAL ACTION."
112+
);
113+
break;
114+
}
115+
else {
116+
//215 PRINT "DON'T GET ALL SHOOK, ";N$;", JUST ANSWER THE QUESTION"
117+
//217 INPUT "WITH 'TOO MUCH' OR 'TOO LITTLE'. WHICH IS IT";D$:GOTO 210
118+
println!("\nDON'T GET ALL SHOOK, {n}, JUST ANSWER THE QUESTION\n{}",
119+
"WITH 'TOO MUCH' OR 'TOO LITTLE'. WHICH IS IT? "
120+
);
121+
}
122+
}
123+
}
124+
//132 IF C$="HEALTH" THEN 180
125+
else if c == "HEALTH" {
126+
//180 PRINT "MY ADVICE TO YOU ";N$;" IS:"
127+
//185 PRINT " 1. TAKE TWO ASPRIN"
128+
//188 PRINT " 2. DRINK PLENTY OF FLUIDS (ORANGE JUICE, NOT BEER!)"
129+
//190 PRINT " 3. GO TO BED (ALONE)"
130+
//195 GOTO 250
131+
println!("\nMY ADVICE TO YOU {n} IS:\n{}\n{}\n{}",
132+
" 1. TAKE TWO ASPRIN",
133+
" 2. DRINK PLENTY OF FLUIDS (ORANGE JUICE, NOT BEER!)",
134+
" 3. GO TO BED (ALONE)"
135+
);
136+
}
137+
//134 IF C$="MONEY" THEN 160
138+
else if c == "MONEY" {
139+
//160 PRINT "SORRY, ";N$;", I'M BROKE TOO. WHY DON'T YOU SELL"
140+
//162 PRINT "ENCYCLOPEADIAS OR MARRY SOMEONE RICH OR STOP EATING"
141+
//164 PRINT "SO YOU WON'T NEED SO MUCH MONEY?"
142+
//170 GOTO 250
143+
println!("\nSORRY, {n}, I'M BROKE TOO. WHY DON'T YOU SELL\n{}\n{}",
144+
"ENCYCLOPEADIAS OR MARRY SOMEONE RICH OR STOP EATING",
145+
"SO YOU WON'T NEED SO MUCH MONEY? "
146+
);
147+
}
148+
//136 IF C$="JOB" THEN 145
149+
else if c == "JOB" {
150+
//145 PRINT "I CAN SYMPATHIZE WITH YOU ";N$;". I HAVE TO WORK"
151+
//148 PRINT "VERY LONG HOURS FOR NO PAY -- AND SOME OF MY BOSSES"
152+
//150 PRINT "REALLY BEAT ON MY KEYBOARD. MY ADVICE TO YOU, ";N$;","
153+
//153 PRINT "IS TO OPEN A RETAIL COMPUTER STORE. IT'S GREAT FUN."
154+
//155 GOTO 250
155+
println!("\nI CAN SYMPATHIZE WITH YOU {n}. I HAVE TO WORK\n{}\n{}\n{}",
156+
"VERY LONG HOURS FOR NO PAY -- AND SOME OF MY BOSSES",
157+
format!("REALLY BEAT ON MY KEYBOARD. MY ADVICE TO YOU, {n}"),
158+
"IS TO OPEN A RETAIL COMPUTER STORE. IT'S GREAT FUN."
159+
);
160+
}
161+
else {
162+
//138 PRINT "OH, ";N$;", YOUR ANSWER OF ";C$;" IS GREEK TO ME."
163+
//140 GOTO 250
164+
println!("\nOH, {n}, YOUR ANSWER OF {c} IS GREEK TO ME.");
165+
}
166+
167+
loop {
168+
//255 PRINT "ANY MORE PROBLEMS YOU WANT SOLVED, ";N$;
169+
//260 INPUT E$: PRINT
170+
print!("\nANY MORE PROBLEMS YOU WANT SOLVED, {n}? ");
171+
let _ = std::io::stdout().flush().unwrap();
172+
input.clear();
173+
std::io::stdin().read_line(&mut input).unwrap();
174+
let e = input.trim().to_uppercase();
175+
176+
//270 IF E$="YES" THEN 280
177+
if e == "YES" {
178+
//280 PRINT "WHAT KIND (SEX, MONEY, HEALTH, JOB)";
179+
//282 GOTO 125
180+
print!("\nWHAT KIND (SEX, MONEY, HEALTH, JOB)? ");
181+
continue 'outer;
182+
}
183+
//273 IF E$="NO" THEN 300
184+
else if e == "NO" {
185+
break 'outer;
186+
}
187+
else {
188+
//275 PRINT "JUST A SIMPLE 'YES' OR 'NO' PLEASE, ";N$;"."
189+
//277 GOTO 255
190+
println!("\nJUST A SIMPLE 'YES' OR 'NO' PLEASE, {n}.");
191+
}
192+
}
193+
}
194+
//300 PRINT
195+
//302 PRINT "THAT WILL BE $5.00 FOR THE ADVICE, ";N$;"."
196+
//305 PRINT "PLEASE LEAVE THE MONEY ON THE TERMINAL."
197+
println!("\nTHAT WILL BE $5.00 FOR THE ADVICE, {n}.\n{}",
198+
"PLEASE LEAVE THE MONEY ON THE TERMINAL."
199+
);
200+
//307 FOR I=1 TO 2000: NEXT I
201+
//310 PRINT: PRINT: PRINT
202+
loop {
203+
//315 PRINT "DID YOU LEAVE THE MONEY";
204+
//320 INPUT G$: PRINT
205+
print!("\nDID YOU LEAVE THE MONEY? ");
206+
let _ = std::io::stdout().flush().unwrap();
207+
input.clear();
208+
std::io::stdin().read_line(&mut input).unwrap();
209+
let g = input.trim().to_uppercase();
210+
211+
//325 IF G$="YES" THEN 350
212+
if g == "YES" {
213+
//350 PRINT "HEY, ";N$;"??? YOU LEFT NO MONEY AT ALL!"
214+
//355 PRINT "YOU ARE CHEATING ME OUT OF MY HARD-EARNED LIVING."
215+
//360 PRINT:PRINT "WHAT A RIP OFF, ";N$;"!!!":PRINT
216+
//365 GOTO 385
217+
println!("\nHEY, {n}??? YOU LEFT NO MONEY AT ALL!\n{}\n{}",
218+
"YOU ARE CHEATING ME OUT OF MY HARD-EARNED LIVING.",
219+
format!("WHAT A RIP OFF, {n}!!!\n\nTAKE A WALK, {n}")
220+
);
221+
break;
222+
}
223+
//330 IF G$="NO" THEN 370
224+
else if g == "NO" {
225+
//370 PRINT "THAT'S HONEST, ";N$;", BUT HOW DO YOU EXPECT"
226+
//375 PRINT "ME TO GO ON WITH MY PSYCHOLOGY STUDIES IF MY PATIENTS"
227+
//380 PRINT "DON'T PAY THEIR BILLS?"
228+
//385 PRINT:PRINT "TAKE A WALK, ";N$;".":PRINT:PRINT:GOTO 999
229+
println!("\nTHAT'S HONEST, {n}, BUT HOW DO YOU EXPECT\n{}\n{}",
230+
"ME TO GO ON WITH MY PSYCHOLOGY STUDIES IF MY PATIENTS",
231+
format!("DON'T PAY THEIR BILLS?\n\nTAKE A WALK, {n}")
232+
);
233+
break;
234+
}
235+
else {
236+
//335 PRINT "YOUR ANSWER OF '";G$;"' CONFUSES ME, ";N$;"."
237+
//340 PRINT "PLEASE RESPOND WITH 'YES' OR 'NO'.": GOTO 315
238+
println!("YOUR ANSWER OF '{g}' CONFUSES ME, {n}.\n{}",
239+
"PLEASE RESPOND WITH 'YES' OR 'NO'."
240+
);
241+
}
242+
}
243+
244+
//390 PRINT "NICE MEETING YOU, ";N$;", HAVE A NICE DAY." -> unreachable
245+
//400 REM
246+
//999 END
247+
}

0 commit comments

Comments
 (0)