Skip to content

Commit 2f0ad3c

Browse files
committed
depth charge game initial rust implementation
1 parent 5983497 commit 2f0ad3c

File tree

3 files changed

+282
-31
lines changed

3 files changed

+282
-31
lines changed

31_Depth_Charge/rust/Cargo.lock

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

31_Depth_Charge/rust/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ version = "0.1.0"
44
edition = "2021"
55

66
[dependencies]
7+
rand = "0.9.0"

31_Depth_Charge/rust/src/main.rs

Lines changed: 45 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
use std::io::Write;
22

3+
use rand::Rng;
4+
35
/** DEPTH CHARGE GAME
46
* https://github.com/marquesrs/basic-computer-games/blob/main/31_Depth_Charge/depthcharge.bas
57
* Direct conversion from BASIC to Rust by Pablo Marques (marquesrs).
@@ -28,10 +30,10 @@ fn main() {
2830
));
2931

3032
// 20 INPUT "DIMENSION OF SEARCH AREA";G: PRINT
31-
let mut g = input("DIMENSION OF SEARCH AREA");
33+
let g = input("DIMENSION OF SEARCH AREA: ").parse::<i32>().unwrap();
3234

3335
// 30 N=INT(LOG(G)/LOG(2))+1
34-
let mut n = INT(LOG(G)/LOG(2)) + 1;
36+
let n = (f32::ln(g as f32) / f32::ln(2.0) + 1.0) as i32;
3537

3638
// 40 PRINT "YOU ARE THE CAPTAIN OF THE DESTROYER USS COMPUTER"
3739
// 50 PRINT "AN ENEMY SUB HAS BEEN CAUSING YOU TROUBLE. YOUR"
@@ -40,54 +42,50 @@ fn main() {
4042
// 80 PRINT "TRIO OF NUMBERS -- THE FIRST TWO ARE THE"
4143
// 90 PRINT "SURFACE COORDINATES; THE THIRD IS THE DEPTH."
4244
// 100 PRINT : PRINT "GOOD LUCK !": PRINT
43-
print!("{}", format!("{}{}{}{}{}{}{}{}{}",
44-
"YOU ARE THE CAPTAIN OF THE DESTROYER USS COMPUTER\n",
45-
"AN ENEMY SUB HAS BEEN CAUSING YOU TROUBLE. YOUR\n",
46-
"MISSION IS TO DESTROY IT. YOU HAVE",
45+
let a = (g * rand::rng().random_range(0..=1)) as i32;
46+
let b = (g * rand::rng().random_range(0..=1)) as i32;
47+
let c = (g * rand::rng().random_range(0..=1)) as i32;
48+
print!("{}", format!("{}{}{}{}{}{}{}{}{}{}{}",
49+
"\nYOU ARE THE CAPTAIN OF THE DESTROYER USS COMPUTER\n",
50+
"AN ENEMY SUB HAS BEEN CAUSING YOU TROUBLE. YOUR\n",
51+
"MISSION IS TO DESTROY IT. YOU HAVE ",
4752
n,
48-
"SHOTS.\n",
53+
" SHOTS.\n",
4954
"SPECIFY DEPTH CHARGE EXPLOSION POINT WITH A\n",
5055
"TRIO OF NUMBERS -- THE FIRST TWO ARE THE\n",
5156
"SURFACE COORDINATES; THE THIRD IS THE DEPTH.\n",
57+
format!("EXAMPLE FOR DIMENSION {}: ", g),
58+
format!("{}, {}, {}", a, b, c),
5259
"\nGOOD LUCK !\n"
5360
));
5461

5562
'main: loop {
5663
// 110 A=INT(G*RND(1)) : B=INT(G*RND(1)) : C=INT(G*RND(1))
57-
let mut a = INT(G*RND(1));
58-
let mut b = INT(G*RND(1));
59-
let mut c = INT(G*RND(1));
60-
64+
let a = (g * rand::rng().random_range(0..=1)) as i32;
65+
let b = (g * rand::rng().random_range(0..=1)) as i32;
66+
let c = (g * rand::rng().random_range(0..=1)) as i32;
6167
// 120 FOR D=1 TO N : PRINT : PRINT "TRIAL #";D; : INPUT X,Y,Z
6268
let mut x;
6369
let mut y;
6470
let mut z;
6571
for d in 1..=n {
66-
print!("\nTRIAL #{}", d);
67-
x = input("X: ");
68-
y = input("X: ");
69-
z = input("X: ");
72+
print!("\nTRIAL #{}\n", d);
73+
x = input("X: ").parse::<i32>().unwrap();
74+
y = input("Y: ").parse::<i32>().unwrap();
75+
z = input("Z: ").parse::<i32>().unwrap();
7076
// 130 IF ABS(X-A)+ABS(Y-B)+ABS(Z-C)=0 THEN 300
7177
if i32::abs(x-a) + i32::abs(y-b) + i32::abs(z-c) == 0 {
7278
// 300 PRINT : PRINT "B O O M ! ! YOU FOUND IT IN";D;"TRIES!"
73-
// 400 PRINT : PRINT: INPUT "ANOTHER GAME (Y OR N)";A$
7479
print!("{}", format!("{}{}{}{}{}",
7580
"\n",
76-
"B O O M ! ! YOU FOUND IT IN",
81+
"B O O M ! ! YOU FOUND IT IN ",
7782
d,
78-
"TRIES!\n",
79-
"\n\n"
83+
" TRIES!\n",
84+
"\n"
8085
));
81-
let a = input("ANOTHER GAME (Y OR N): ");
82-
// 410 IF A$="Y" THEN 100
83-
if a == "Y" {
84-
continue 'main;
85-
}
86-
else {
87-
// 420 PRINT "OK. HOPE YOU ENJOYED YOURSELF." : GOTO 600
88-
print!("OK. HOPE YOU ENJOYED YOURSELF.");
89-
break 'main;
90-
}
86+
// 400 PRINT : PRINT: INPUT "ANOTHER GAME (Y OR N)";A$
87+
if replay() { continue 'main; }
88+
else { break 'main; }
9189
}
9290

9391
// 140 GOSUB 500 : PRINT : NEXT D
@@ -96,15 +94,18 @@ fn main() {
9694
}
9795
// 200 PRINT : PRINT "YOU HAVE BEEN TORPEDOED! ABANDON SHIP!"
9896
// 210 PRINT "THE SUBMARINE WAS AT";A;",";B;",";C : GOTO 400
99-
print!("{}", format!("{}{}{}{}{}{}{}",
97+
print!("{}", format!("{}{}{}{}{}{}{}{}",
10098
"\nYOU HAVE BEEN TORPEDOED! ABANDON SHIP!\n",
10199
"THE SUBMARINE WAS AT ",
102100
a,
103101
",",
104102
b,
105103
",",
106-
c
104+
c,
105+
"\n"
107106
));
107+
108+
replay();
108109
}
109110
// 600 END
110111
}
@@ -130,3 +131,16 @@ fn subroutine(x: i32, y: i32, z:i32, a:i32, b:i32, c:i32) {
130131
if z<c { print!(" TOO HIGH."); };
131132
if z==c { print!(" DEPTH OK."); };
132133
}
134+
135+
fn replay() -> bool {
136+
let r = input("ANOTHER GAME (Y OR N): ");
137+
// 410 IF A$="Y" THEN 100
138+
if r == "Y" {
139+
return true;
140+
}
141+
else {
142+
// 420 PRINT "OK. HOPE YOU ENJOYED YOURSELF." : GOTO 600
143+
println!("OK. HOPE YOU ENJOYED YOURSELF.");
144+
return false;
145+
}
146+
}

0 commit comments

Comments
 (0)