Skip to content

Commit 4f46b2f

Browse files
committed
bounce game initial rust implementation
1 parent 617bdc1 commit 4f46b2f

File tree

1 file changed

+47
-30
lines changed

1 file changed

+47
-30
lines changed

13_Bounce/rust/src/main.rs

Lines changed: 47 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
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+
19
use std::io::Write;
210

311
fn 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

Comments
 (0)