11use 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+ "\n YOU 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 "\n GOOD 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 ! ( "\n TRIAL #{}" , d) ;
67- x = input ( "X: " ) ;
68- y = input ( "X : " ) ;
69- z = input ( "X : " ) ;
72+ print ! ( "\n TRIAL #{}\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 "\n YOU 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