Merge pull request #591 from DLotts/59rocket_rust

Rust version of 59 Rocket
This commit is contained in:
Jeff Atwood
2022-03-01 23:11:33 -06:00
committed by GitHub
3 changed files with 129 additions and 0 deletions

View File

@@ -0,0 +1,12 @@
README.md
Original source downloaded from Vintage Basic
This folder for chapter #59 contains three different games. Three folders here contain the three games:
- Rocket
- LEM
- lunar
Conversion to [Rust](https://www.rust-lang.org)

View File

@@ -0,0 +1,10 @@
[package]
name = "rocket"
version = "1.0.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
text_io = "0.1.10"
num-integer = "0.1"

View File

@@ -0,0 +1,107 @@
//Goal of this port is to keep Basic lang idioms where possible. Gotta have those single letter capital variables!
use num_integer::{sqrt};
use std::io::{self, Write};
use text_io::{read, try_read};
#[allow(non_snake_case)]
fn main() {
println!("{:>30}", "ROCKET");
println!("{:>15}", "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY");
println!();println!();println!();
println!("LUNAR LANDING SIMULATION");
println!("----- ------- ----------");println!();
let A= input("DO YOU WANT INSTRUCTIONS (YES OR NO) ");
if !(A=="NO") {
println!();
println!("YOU ARE LANDING ON THE MOON AND AND HAVE TAKEN OVER MANUAL");
println!("CONTROL 1000 FEET ABOVE A GOOD LANDING SPOT. YOU HAVE A DOWN-");
println!("WARD VELOCITY OF 50 FEET/SEC. 150 UNITS OF FUEL REMAIN.");
println!();
println!("HERE ARE THE RULES THAT GOVERN YOUR APOLLO SPACE-CRAFT:"); println!();
println!("(1) AFTER EACH SECOND THE HEIGHT, VELOCITY, AND REMAINING FUEL");
println!(" WILL BE REPORTED VIA DIGBY YOUR ON-BOARD COMPUTER.");
println!("(2) AFTER THE REPORT A '?' WILL APPEAR. ENTER THE NUMBER");
println!(" OF UNITS OF FUEL YOU WISH TO BURN DURING THE NEXT");
println!(" SECOND. EACH UNIT OF FUEL WILL SLOW YOUR DESCENT BY");
println!(" 1 FOOT/SEC.");
println!("(3) THE MAXIMUM THRUST OF YOUR ENGINE IS 30 FEET/SEC/SEC");
println!(" OR 30 UNITS OF FUEL PER SECOND.");
println!("(4) WHEN YOU CONTACT THE LUNAR SURFACE. YOUR DESCENT ENGINE");
println!(" WILL AUTOMATICALLY SHUT DOWN AND YOU WILL BE GIVEN A");
println!(" REPORT OF YOUR LANDING SPEED AND REMAINING FUEL.");
println!("(5) IF YOU RUN OUT OF FUEL THE '?' WILL NO LONGER APPEAR");
println!(" BUT YOUR SECOND BY SECOND REPORT WILL CONTINUE UNTIL");
println!(" YOU CONTACT THE LUNAR SURFACE.");println!();
}
loop {
println!("BEGINNING LANDING PROCEDURE..........");println!();
println!("G O O D L U C K ! ! !");
println!();println!();
println!("SEC FEET SPEED FUEL PLOT OF DISTANCE");
println!();
let mut T=0;let mut H:i32=1000;let mut V=50;let mut F=150;
let D:i32; let mut V1:i32; let mut B:i32;
'falling: loop {
println!(" {:<4}{:<11}{:<10}{:<8}I{capsule:>high$}", T,H,V,F,high=(H/15) as usize,capsule="*");
B = input_int("");
if B<0 { B=0 }
else { if B>30 { B=30 } }
if B>F { B=F }
'nofuel: loop {
V1=V-B+5;
F=F-B;
H=H- (V+V1)/2;
if H<=0 { break 'falling}
T=T+1;
V=V1;
if F>0 { break 'nofuel }
if B!=0 {
println!("**** OUT OF FUEL ****");
}
println!(" {:<4}{:<11}{:<10}{:<8}I{capsule:>high$}", T,H,V,F,high=(H/12+29) as usize,capsule="*");
B=0;
}
}
H=H+ (V1+V)/2;
if B==5 {
D=H/V;
} else {
D=(-V+sqrt(V*V+H*(10-2*B)))/(5-B);
V1=V+(5-B)*D;
}
println!("***** CONTACT *****");
println!("TOUCHDOWN AT {} SECONDS.",T+D);
println!("LANDING VELOCITY={} FEET/SEC.",V1);
println!("{} UNITS OF FUEL REMAINING.", F);
if V1==0 {
println!("CONGRATULATIONS! A PERFECT LANDING!!");
println!("YOUR LICENSE WILL BE RENEWED.......LATER.");
}
if V1.abs()>=2 {
println!("***** SORRY, BUT YOU BLEW IT!!!!");
println!("APPROPRIATE CONDOLENCES WILL BE SENT TO YOUR NEXT OF KIN.");
}
println!();println!();println!();
let A = input("ANOTHER MISSION");
if !(A=="YES") { break };
}
println!();println!( "CONTROL OUT.");println!();
}
fn input(prompt:&str) -> String {
loop {
print!("{} ? ",prompt);io::stdout().flush().unwrap();
let innn:String=read!("{}\n");
let out:String = innn.trim().to_string();
if out!="" {return out}
}
}
fn input_int(prompt:&str) -> i32 {
loop {
print!("{} ? ",prompt);io::stdout().flush().unwrap();
match try_read!() {
Ok(n) => return n,
Err(_) => println!("Enter a number 0-30"),
}
}
}