mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2025-12-22 07:10:42 -08:00
Merge pull request #591 from DLotts/59rocket_rust
Rust version of 59 Rocket
This commit is contained in:
12
59_Lunar_LEM_Rocket/rust/README.md
Normal file
12
59_Lunar_LEM_Rocket/rust/README.md
Normal 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)
|
||||||
|
|
||||||
10
59_Lunar_LEM_Rocket/rust/rocket/Cargo.toml
Normal file
10
59_Lunar_LEM_Rocket/rust/rocket/Cargo.toml
Normal 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"
|
||||||
107
59_Lunar_LEM_Rocket/rust/rocket/src/main.rs
Normal file
107
59_Lunar_LEM_Rocket/rust/rocket/src/main.rs
Normal 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"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user