1+ /** BOUNCE GAME
2+ * https://github.com/coding-horror/basic-computer-games/blob/main/13_Bounce/bounce.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+
19use std:: io:: Write ;
210
311fn input ( msg : & str ) -> String {
@@ -41,22 +49,22 @@ fn main() {
4149
4250 loop {
4351 //135 INPUT "TIME INCREMENT (SEC)";S2
44- // let s2 = input("TIME INCREMENT (SEC): ").parse::<f32>().unwrap();
45- let s2 = 0.1f32 ;
52+ let s2 = input ( "TIME INCREMENT (SEC): " ) . parse :: < f32 > ( ) . unwrap ( ) ;
53+ // let s2 = 0.2f32 ;
4654
4755 //140 PRINT
4856 println ! ( ) ;
4957
5058 //150 INPUT "VELOCITY (FPS)";V
51- // let v = input("VELOCITY (FPS): ").parse::<f32>().unwrap();
52- let v = 20.0f32 ;
59+ let v = input ( "VELOCITY (FPS): " ) . parse :: < f32 > ( ) . unwrap ( ) ;
60+ // let v = 20.0f32;
5361
5462 //160 PRINT
5563 println ! ( ) ;
5664
5765 //170 INPUT "COEFFICIENT";C
58- // let c = input("COEFFICIENT: ").parse::<f32>().unwrap();
59- let c = 0.5f32 ;
66+ let c = input ( "COEFFICIENT: " ) . parse :: < f32 > ( ) . unwrap ( ) ;
67+ // let c = 0.6f32 ;
6068
6169 //180 PRINT
6270 //182 PRINT "FEET"
@@ -74,93 +82,102 @@ fn main() {
7482 }
7583
7684 let mut l = 0.0 ;
77- let mut l_expected = l;
7885
7986 //220 FOR H=INT(-16*(V/32)^2+V^2/32+.5) TO 0 STEP -.5
8087 let mut h = ( -16.0 * ( v / 32.0 ) . powi ( 2 ) + ( v. powi ( 2 ) ) / 32.0 + 0.5 ) . floor ( ) ;
8188 while h >= 0.0 {
89+ let mut line_content = String :: new ( ) ;
8290 //221 IF INT(H)<>H THEN 225
8391 if h. floor ( ) == h {
8492 //222 PRINT H;
85- print ! ( "{}" , h) ;
93+ line_content. push_str ( h. to_string ( ) . as_str ( ) ) ;
94+ line_content. push ( ' ' ) ;
8695 }
8796 //225 L=0
8897 l = 0.0 ;
89- l_expected = l;
9098 //230 FOR I=1 TO S1
9199 for i in 1 ..=s1 {
92- let mut T = 0.0 ;
100+ let mut t_val = 0.0 ;
93101 //240 FOR T=0 TO T(I) STEP S2
94- while T <= t[ ( i - 1 ) as usize ] {
102+ while t_val <= t[ ( i - 1 ) as usize ] {
95103 //245 L=L+S2
96104 l = l + s2;
97- l_expected = l_expected + s2;
98105
99106 //250 IF ABS(H-(.5*(-32)*T^2+V*C^(I-1)*T))>.25 THEN 270
100- let condition = h - ( 0.5 * ( -32.0 ) * T . powf ( 2.0 ) + v * c. powf ( ( i-1 ) as f32 ) * T ) ;
107+ let condition = h - ( 0.5 * ( -32.0 ) * t_val . powf ( 2.0 ) + v * c. powf ( ( i-1 ) as f32 ) * t_val ) ;
101108 if condition. abs ( ) >= 0.25 {
102- T = T + s2;
109+ t_val = t_val + s2;
103110 continue ;
104111 }
105112 // TABS ARE NOT SPACES, BUT A TERMINAL POSITION
106113 //260 PRINT TAB(L/S2);"0";
107- let spaces = ( ( l / s2) . floor ( ) -1.0 ) as usize ;
108- print ! ( "{}0" , " " . repeat( spaces) ) ;
109- l = l - spaces as f32 ;
114+ let spaces = ( ( l / s2) - 1.0 ) as usize ;
115+ while line_content. len ( ) < spaces {
116+ line_content. push ( ' ' ) ;
117+ }
118+ line_content. push ( '0' ) ;
110119
111120 //270 NEXT T
112- T = T + s2;
121+ t_val = t_val + s2;
113122 }
114123
115124 //275 T=T(I+1)/2
116125 if i as usize == t. len ( ) { break ; }
117- T = t[ i as usize ] / 2.0 ;
126+ t_val = t[ i as usize ] / 2.0 ;
118127
119128 //276 IF -16*T^2+V*C^(I-1)*T<H THEN 290
120- if -16.0 * T . powf ( 2.0 ) + v * c. powf ( i as f32 -1.0 ) * T <= h {
129+ if -16.0 * t_val . powf ( 2.0 ) + v * c. powf ( i as f32 -1.0 ) * t_val <= h {
121130 break ;
122131 }
123132
124133 //280 NEXT I
125134 }
126-
135+ print ! ( "{}" , line_content ) ;
127136 //290 PRINT
128137 println ! ( ) ;
129138
130139 //300 NEXT H
131140 h = h - 0.5 ;
132141 }
133142
134- //
143+ let mut line_content = String :: from ( "" ) ;
144+
135145 //310 PRINT TAB(1);
136146 print ! ( " " ) ;
137147
138148 //320 FOR I=1 TO INT(L+1)/S2+1
139- for _ in 1 ..=( ( l_expected +1.0 ) / s2 + 1.0 ) as i32 {
149+ for _ in 1 ..=( ( l +1.0 ) / s2 + 1.0 ) as i32 {
140150 //330 PRINT ".";
141- print ! ( "." ) ;
151+ line_content . push ( '.' ) ;
142152 //340 NEXT I
143153 }
144154
145155 //350 PRINT
146156 //355 PRINT " 0";
147- print ! ( "\n 0" ) ;
157+ println ! ( "{}" , line_content ) ;
148158
159+ line_content = String :: from ( " 0" ) ;
160+
149161 //360 FOR I=1 TO INT(L+.9995)
150- for i in 1 ..=( ( l_expected + 0.9995 ) as i32 ) {
162+ for i in 1 ..=( ( l + 0.9995 ) as i32 ) {
151163 //380 PRINT TAB(INT(I/S2));I;
152- print ! ( "{}{}" , " " . repeat( ( i as f32 / s2) as usize ) , i) ;
164+ while line_content. len ( ) < ( i as f32 / s2) as usize {
165+ line_content. push ( ' ' ) ;
166+ }
167+ line_content. push_str ( i. to_string ( ) . as_str ( ) ) ;
153168 //390 NEXT I
154169 }
155170
171+ println ! ( "{}" , line_content) ;
172+
156173 //400 PRINT
157174 //410 PRINT TAB(INT(L+1)/(2*S2)-2);"SECONDS"
158175 //420 PRINT
159- let tabs = ( ( l_expected +1.0 ) / ( 2.0 * s2) - 2.0 ) as usize ;
160- println ! ( "\n {}SECONDS\n " , " " . repeat( tabs) ) ;
176+ let tabs = ( ( l +1.0 ) / ( 2.0 * s2) - 2.0 ) as usize ;
177+ println ! ( "{}SECONDS\n " , " " . repeat( tabs) ) ;
161178
162179 //430 GOTO 135
163- break ;
180+ // break;
164181 }
165182 //440 END
166183}
0 commit comments