|
| 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