From b86c30e89ce42a1ec9d852be83edca0b5494dfb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?U=C4=9Fur=20K=C3=BCpeli?= Date: Thu, 5 May 2022 02:00:33 +0300 Subject: [PATCH] init working on draw methods --- 90_Tower/rust/Cargo.toml | 8 ++++++++ 90_Tower/rust/src/disk.rs | 27 +++++++++++++++++++++++++++ 90_Tower/rust/src/game.rs | 34 ++++++++++++++++++++++++++++++++++ 90_Tower/rust/src/main.rs | 11 +++++++++++ 90_Tower/rust/src/needle.rs | 26 ++++++++++++++++++++++++++ 90_Tower/rust/src/util.rs | 15 +++++++++++++++ 6 files changed, 121 insertions(+) create mode 100644 90_Tower/rust/Cargo.toml create mode 100644 90_Tower/rust/src/disk.rs create mode 100644 90_Tower/rust/src/game.rs create mode 100644 90_Tower/rust/src/main.rs create mode 100644 90_Tower/rust/src/needle.rs create mode 100644 90_Tower/rust/src/util.rs diff --git a/90_Tower/rust/Cargo.toml b/90_Tower/rust/Cargo.toml new file mode 100644 index 00000000..1ec69633 --- /dev/null +++ b/90_Tower/rust/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "rust" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/90_Tower/rust/src/disk.rs b/90_Tower/rust/src/disk.rs new file mode 100644 index 00000000..39326a4c --- /dev/null +++ b/90_Tower/rust/src/disk.rs @@ -0,0 +1,27 @@ +pub struct Disk { + size: u8, +} + +impl Disk { + pub fn new(size: u8) -> Self { + Disk { size } + } + + pub fn draw(&self) { + let space_amount = (15 - self.size) / 2; + + let draw_space = || { + if space_amount > 0 { + for _ in 0..space_amount { + print!(" "); + } + } + }; + + draw_space(); + for _ in 0..self.size { + print!("*"); + } + draw_space(); + } +} diff --git a/90_Tower/rust/src/game.rs b/90_Tower/rust/src/game.rs new file mode 100644 index 00000000..823903ac --- /dev/null +++ b/90_Tower/rust/src/game.rs @@ -0,0 +1,34 @@ +use crate::{needle::Needle, util}; + +pub struct Game { + pub needles: Vec, + _moves: usize, +} + +impl Game { + pub fn new() -> Self { + let mut needles = Vec::new(); + + for i in 0..3 { + let number = (i + 1) as u8; + let disks = match number { + 1 => util::generate_disks(4), + 2 => util::generate_disks(3), + _ => Vec::new(), + }; + + needles.push(Needle { disks, number }); + } + + Game { needles, _moves: 0 } + } + + pub fn draw(&self) { + for r in (1..=7).rev() { + for n in &self.needles { + n.draw(r) + } + println!(""); + } + } +} diff --git a/90_Tower/rust/src/main.rs b/90_Tower/rust/src/main.rs new file mode 100644 index 00000000..ae54ccb7 --- /dev/null +++ b/90_Tower/rust/src/main.rs @@ -0,0 +1,11 @@ +use game::Game; + +mod disk; +mod game; +mod needle; +mod util; + +fn main() { + let game = Game::new(); + game.draw(); +} diff --git a/90_Tower/rust/src/needle.rs b/90_Tower/rust/src/needle.rs new file mode 100644 index 00000000..0a23c732 --- /dev/null +++ b/90_Tower/rust/src/needle.rs @@ -0,0 +1,26 @@ +use crate::disk::Disk; + +pub struct Needle { + pub disks: Vec, + pub number: u8, +} + +impl Needle { + pub fn draw(&self, row: u8) { + //println!("printing row: {}", row); + + let offset = match self.number { + 1 => " ", + _ => "\t\t\t", + }; + + let row = row as usize; + + if self.disks.len() >= row { + self.disks[row - 1].draw(); + } else { + print!("{offset}"); + print!("*"); + } + } +} diff --git a/90_Tower/rust/src/util.rs b/90_Tower/rust/src/util.rs new file mode 100644 index 00000000..f047d38c --- /dev/null +++ b/90_Tower/rust/src/util.rs @@ -0,0 +1,15 @@ +use crate::disk::Disk; + +pub fn generate_disks(amount: u8) -> Vec { + if amount > 7 { + println!("CANNOT HAVE MORE THAN 7 DISKS!"); + } + + let mut disks = Vec::new(); + + for i in (1..=amount).rev() { + disks.push(Disk::new(i * 2 + 1)); + } + + disks +}