1+ /** DEPTH CHARGE GAME
2+ * https://github.com/marquesrs/basic-computer-games/blob/main/31_Depth_Charge/depthcharge.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+ * 03/03/25
7+ */
8+
9+ use std:: io:: Write ;
10+ use rand:: Rng ;
11+
12+ fn input ( msg : & str ) -> String {
13+ print ! ( "{}" , msg) ;
14+ let _ =std:: io:: stdout ( ) . flush ( ) . unwrap ( ) ;
15+ let mut input = String :: new ( ) ;
16+ std:: io:: stdin ( ) . read_line ( & mut input) . unwrap ( ) ;
17+ return input. trim ( ) . to_uppercase ( ) ;
18+ }
19+
20+ fn main ( ) {
21+ // 2 PRINT TAB(30);"DEPTH CHARGE"
22+ // 4 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY"
23+ // 6 PRINT: PRINT: PRINT
24+ print ! ( "{}" , format!( "{}{}\n {}{}\n \n \n \n " ,
25+ " " . repeat( 29 ) ,
26+ "DEPTH CHARGE" ,
27+ " " . repeat( 14 ) ,
28+ "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY"
29+ ) ) ;
30+
31+ // 20 INPUT "DIMENSION OF SEARCH AREA";G: PRINT
32+ let g = input ( "DIMENSION OF SEARCH AREA: " ) . parse :: < i32 > ( ) . unwrap ( ) ;
33+
34+ // 30 N=INT(LOG(G)/LOG(2))+1
35+ let n = ( f32:: ln ( g as f32 ) / f32:: ln ( 2.0 ) + 1.0 ) as i32 ;
36+
37+ // 40 PRINT "YOU ARE THE CAPTAIN OF THE DESTROYER USS COMPUTER"
38+ // 50 PRINT "AN ENEMY SUB HAS BEEN CAUSING YOU TROUBLE. YOUR"
39+ // 60 PRINT "MISSION IS TO DESTROY IT. YOU HAVE";N;"SHOTS."
40+ // 70 PRINT "SPECIFY DEPTH CHARGE EXPLOSION POINT WITH A"
41+ // 80 PRINT "TRIO OF NUMBERS -- THE FIRST TWO ARE THE"
42+ // 90 PRINT "SURFACE COORDINATES; THE THIRD IS THE DEPTH."
43+ // 100 PRINT : PRINT "GOOD LUCK !": PRINT
44+ let a = ( g * rand:: rng ( ) . random_range ( 0 ..=1 ) ) as i32 ;
45+ let b = ( g * rand:: rng ( ) . random_range ( 0 ..=1 ) ) as i32 ;
46+ let c = ( g * rand:: rng ( ) . random_range ( 0 ..=1 ) ) as i32 ;
47+ print ! ( "{}" , format!( "{}{}{}{}{}{}{}{}{}{}{}" ,
48+ "\n YOU ARE THE CAPTAIN OF THE DESTROYER USS COMPUTER\n " ,
49+ "AN ENEMY SUB HAS BEEN CAUSING YOU TROUBLE. YOUR\n " ,
50+ "MISSION IS TO DESTROY IT. YOU HAVE " ,
51+ n,
52+ " SHOTS.\n " ,
53+ "SPECIFY DEPTH CHARGE EXPLOSION POINT WITH A\n " ,
54+ "TRIO OF NUMBERS -- THE FIRST TWO ARE THE\n " ,
55+ "SURFACE COORDINATES; THE THIRD IS THE DEPTH.\n " ,
56+ format!( "EXAMPLE FOR DIMENSION {}: " , g) ,
57+ format!( "{}, {}, {}" , a, b, c) ,
58+ "\n GOOD LUCK !\n "
59+ ) ) ;
60+
61+ ' main: loop {
62+ // 110 A=INT(G*RND(1)) : B=INT(G*RND(1)) : C=INT(G*RND(1))
63+ let a = ( g * rand:: rng ( ) . random_range ( 0 ..=1 ) ) as i32 ;
64+ let b = ( g * rand:: rng ( ) . random_range ( 0 ..=1 ) ) as i32 ;
65+ let c = ( g * rand:: rng ( ) . random_range ( 0 ..=1 ) ) as i32 ;
66+ // 120 FOR D=1 TO N : PRINT : PRINT "TRIAL #";D; : INPUT X,Y,Z
67+ let mut x;
68+ let mut y;
69+ let mut z;
70+ for d in 1 ..=n {
71+ print ! ( "\n TRIAL #{}\n " , d) ;
72+ x = input ( "X: " ) . parse :: < i32 > ( ) . unwrap ( ) ;
73+ y = input ( "Y: " ) . parse :: < i32 > ( ) . unwrap ( ) ;
74+ z = input ( "Z: " ) . parse :: < i32 > ( ) . unwrap ( ) ;
75+ // 130 IF ABS(X-A)+ABS(Y-B)+ABS(Z-C)=0 THEN 300
76+ if i32:: abs ( x-a) + i32:: abs ( y-b) + i32:: abs ( z-c) == 0 {
77+ // 300 PRINT : PRINT "B O O M ! ! YOU FOUND IT IN";D;"TRIES!"
78+ print ! ( "{}" , format!( "{}{}{}{}{}" ,
79+ "\n " ,
80+ "B O O M ! ! YOU FOUND IT IN " ,
81+ d,
82+ " TRIES!\n " ,
83+ "\n "
84+ ) ) ;
85+ // 400 PRINT : PRINT: INPUT "ANOTHER GAME (Y OR N)";A$
86+ if replay ( ) { continue ' main; }
87+ else { break ' main; }
88+ }
89+
90+ // 140 GOSUB 500 : PRINT : NEXT D
91+ subroutine ( x, y, z, a, b, c) ;
92+ println ! ( ) ;
93+ }
94+ // 200 PRINT : PRINT "YOU HAVE BEEN TORPEDOED! ABANDON SHIP!"
95+ // 210 PRINT "THE SUBMARINE WAS AT";A;",";B;",";C : GOTO 400
96+ print ! ( "{}" , format!( "{}{}{}{}{}{}{}{}" ,
97+ "\n YOU HAVE BEEN TORPEDOED! ABANDON SHIP!\n " ,
98+ "THE SUBMARINE WAS AT " ,
99+ a,
100+ "," ,
101+ b,
102+ "," ,
103+ c,
104+ "\n "
105+ ) ) ;
106+
107+ replay ( ) ;
108+ }
109+ // 600 END
110+ }
111+
112+ // 500 PRINT "SONAR REPORTS SHOT WAS ";
113+ // 510 IF Y>B THEN PRINT "NORTH";
114+ // 520 IF Y<B THEN PRINT "SOUTH";
115+ // 530 IF X>A THEN PRINT "EAST";
116+ // 540 IF X<A THEN PRINT "WEST";
117+ // 550 IF Y<>B OR X<>A THEN PRINT " AND";
118+ // 560 IF Z>C THEN PRINT " TOO LOW."
119+ // 570 IF Z<C THEN PRINT " TOO HIGH."
120+ // 580 IF Z=C THEN PRINT " DEPTH OK."
121+ // 590 RETURN
122+ fn subroutine ( x : i32 , y : i32 , z : i32 , a : i32 , b : i32 , c : i32 ) {
123+ print ! ( "SONAR REPORTS SHOT WAS " ) ;
124+ if y>b { print ! ( "NORTH" ) ; } ;
125+ if y<b { print ! ( "SOUTH" ) ; } ;
126+ if x>a { print ! ( "EAST" ) ; } ;
127+ if x<a { print ! ( "WEST" ) ; } ;
128+ if y!=b || x!=a { print ! ( " AND" ) ; } ;
129+ if z>c { print ! ( " TOO LOW." ) ; } ;
130+ if z<c { print ! ( " TOO HIGH." ) ; } ;
131+ if z==c { print ! ( " DEPTH OK." ) ; } ;
132+ }
133+
134+ fn replay ( ) -> bool {
135+ let r = input ( "ANOTHER GAME (Y OR N): " ) ;
136+ // 410 IF A$="Y" THEN 100
137+ if r == "Y" {
138+ return true ;
139+ }
140+ else {
141+ // 420 PRINT "OK. HOPE YOU ENJOYED YOURSELF." : GOTO 600
142+ println ! ( "OK. HOPE YOU ENJOYED YOURSELF." ) ;
143+ return false ;
144+ }
145+ }
0 commit comments