mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2025-12-22 15:16:33 -08:00
progress on 32_diamond
next step: inset newline character every LINE_WIDTH characters
This commit is contained in:
@@ -4,14 +4,14 @@
|
|||||||
|
|
||||||
use std::{error::Error, fmt::Display, str::FromStr, io::{self, Write}};
|
use std::{error::Error, fmt::Display, str::FromStr, io::{self, Write}};
|
||||||
|
|
||||||
const LINE_WIDTH:usize = 60;
|
const LINE_WIDTH: isize = 60;
|
||||||
const EDGE: &str = "C";
|
const EDGE: &str = "C";
|
||||||
const EDGE_WIDTH: usize = 2;
|
const EDGE_WIDTH: isize = 2;
|
||||||
const FILL: &str = "!";
|
const FILL: &str = "!";
|
||||||
|
|
||||||
/// handles setup for the game
|
/// handles setup for the game
|
||||||
pub struct Config {
|
pub struct Config {
|
||||||
diamond_size: usize,
|
diamond_size: isize,
|
||||||
}
|
}
|
||||||
impl Config {
|
impl Config {
|
||||||
/// creates and returns a new Config from user input
|
/// creates and returns a new Config from user input
|
||||||
@@ -26,7 +26,11 @@ impl Config {
|
|||||||
//input looop
|
//input looop
|
||||||
config.diamond_size = loop {
|
config.diamond_size = loop {
|
||||||
match get_number_from_input("TYPE IN AN ODD NUMBER BETWEEN 5 AND 21 ", 5, 21) {
|
match get_number_from_input("TYPE IN AN ODD NUMBER BETWEEN 5 AND 21 ", 5, 21) {
|
||||||
Ok(num) => break num,
|
Ok(num) => {
|
||||||
|
//ensure num is odd
|
||||||
|
if num%2 == 0 {continue;}
|
||||||
|
else {break num;}
|
||||||
|
},
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
eprintln!("{}",e);
|
eprintln!("{}",e);
|
||||||
continue;
|
continue;
|
||||||
@@ -43,48 +47,72 @@ impl Config {
|
|||||||
pub fn run(config: &Config) -> Result<(), Box<dyn Error>> {
|
pub fn run(config: &Config) -> Result<(), Box<dyn Error>> {
|
||||||
//DATA
|
//DATA
|
||||||
let diamonds = LINE_WIDTH / config.diamond_size;
|
let diamonds = LINE_WIDTH / config.diamond_size;
|
||||||
let mut line: String;
|
|
||||||
|
|
||||||
//print out diamond
|
|
||||||
for i in 1..diamonds {
|
|
||||||
let mut x = 1;
|
|
||||||
let mut y = config.diamond_size.clone();
|
|
||||||
for n in x..y {
|
|
||||||
line = String::new();
|
|
||||||
|
|
||||||
//add (diamond size - n) / 2 spaces
|
|
||||||
line += &n_spaces( (config.diamond_size - n) / 2);
|
|
||||||
|
|
||||||
for m in 1..diamonds {
|
|
||||||
let mut c = 1;
|
|
||||||
|
|
||||||
for a in 1..n {
|
|
||||||
if c > EDGE_WIDTH {
|
|
||||||
line += FILL;
|
|
||||||
} else {
|
|
||||||
line += EDGE;
|
|
||||||
c = c + 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//53
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//print line
|
|
||||||
println!("{}", line);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
//print out diamonds
|
||||||
|
print_diamonds(config.diamond_size, diamonds);
|
||||||
|
|
||||||
//return to main
|
//return to main
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// prints a diamond
|
||||||
|
fn print_diamonds(width:isize, count:isize) {
|
||||||
|
//DATA
|
||||||
|
let mut line: String = String::new();
|
||||||
|
/*
|
||||||
|
8 FOR L=1 TO width
|
||||||
|
10 X=1:Y=count:Z=2
|
||||||
|
20 FOR N=X TO Y STEP Z
|
||||||
|
25 PRINT TAB((count-N)/2);
|
||||||
|
28 FOR M=1 TO width
|
||||||
|
29 C=1
|
||||||
|
30 FOR A=1 TO N
|
||||||
|
32 IF C>LEN(A$) THEN PRINT "!";:GOTO 50
|
||||||
|
34 PRINT MID$(A$,C,1);
|
||||||
|
36 C=C+1
|
||||||
|
50 NEXT A
|
||||||
|
53 IF M=width THEN 60
|
||||||
|
55 PRINT TAB(count*M+(count-N)/2);
|
||||||
|
56 NEXT M
|
||||||
|
60 PRINT
|
||||||
|
70 NEXT N (n+=Z)
|
||||||
|
83 IF X<>1 THEN 95
|
||||||
|
85 X=count-2:Y=1:Z=-2
|
||||||
|
90 GOTO 20
|
||||||
|
95 NEXT L
|
||||||
|
99 END
|
||||||
|
*/
|
||||||
|
let mut x = 1;
|
||||||
|
let mut y = count;
|
||||||
|
let mut step = 2;
|
||||||
|
let mut l =1;
|
||||||
|
while l < width {
|
||||||
|
let mut n = x;
|
||||||
|
while n <= y {
|
||||||
|
line+= &n_spaces( (count-n) / 2);
|
||||||
|
for m in 1..width {
|
||||||
|
for c in 1..n {
|
||||||
|
line += if c > EDGE_WIDTH {FILL} else {EDGE};
|
||||||
|
}
|
||||||
|
|
||||||
|
line += &n_spaces(count*m+(count-n)/2);
|
||||||
|
}
|
||||||
|
n += step;
|
||||||
|
}
|
||||||
|
if x != 1 {l+=1;continue;}
|
||||||
|
x = count - 2;
|
||||||
|
y = 1;
|
||||||
|
step = -2;
|
||||||
|
}
|
||||||
|
//separate line by LINE_WIDTH or whatever
|
||||||
|
println!("{}", line);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// returns n spaces in a string
|
/// returns n spaces in a string
|
||||||
fn n_spaces(n:usize) -> String {
|
fn n_spaces(n:isize) -> String {
|
||||||
let mut output = String::new();
|
let mut output = String::new();
|
||||||
|
|
||||||
for _i in 0..n {
|
for _i in 0..n {
|
||||||
|
|||||||
Reference in New Issue
Block a user